diff --git a/.gitignore b/.gitignore
index c8e3ed4fac5..281548f93c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -180,3 +180,5 @@ Temporary Items
.apdisk
+
+*.before
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3b76d0c2144..747a618c804 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -271,6 +271,9 @@ There is no strict process when it comes to merging pull requests, pull requests
* If your pull request is accepted, the code you add no longer belongs exclusively to you but to everyone; everyone is free to work on it, but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly said, but there have been cases where this would've saved some trouble.
+## Banned content
+Do not add any of the following in a Pull Request or risk getting the PR closed:
+ - National Socialist Party of Germany content, National Socialist Party of Germany related content, or National Socialist Party of Germany references
##A word on git
Yes we know that the files have a tonne of mixed windows and linux line endings, attempts to fix this have been met with less than stellar success and as such we have decided to give up caring until such a time as it matters.
diff --git a/README.md b/README.md
index 6a4241a790f..4c13f6c78dc 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
##/tg/station v1.0.1
-[](https://travis-ci.org/tgstation/-tg-station)
+[](https://travis-ci.org/tgstation/tgstation)
**Website:** http://www.tgstation13.org
-**Code:** https://github.com/tgstation/-tg-station
+**Code:** https://github.com/tgstation/tgstation
**Wiki** http://tgstation13.org/wiki/Main_Page
**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
@@ -19,11 +19,11 @@ Follow this: http://www.tgstation13.org/wiki/Setting_up_git
Option 2:
Install GitHub::windows from http://windows.github.com/
It handles most of the setup and configuraton of Git for you.
-Then you simply search for the -tg-station repository and click the big clone
+Then you simply search for the tgstation repository and click the big clone
button.
Option 3: Download the source code as a zip by clicking the ZIP button in the
-code tab of https://github.com/tgstation/-tg-station
+code tab of https://github.com/tgstation/tgstation
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)
@@ -131,9 +131,9 @@ Please see [CONTRIBUTING.md](CONTRIBUTING.md)
##LICENSE
-All code after commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU AGPL v3 (http://www.gnu.org/licenses/agpl-3.0.html).
+All code after commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU AGPL v3 (http://www.gnu.org/licenses/agpl-3.0.html).
-All code before commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html).
+All code before commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html).
(Including tools unless their readme specifies otherwise.)
See LICENSE-AGPLv3.txt and LICENSE-GPLv3.txt for more details.
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
index dc5f71c3e89..c4f10ea6087 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
@@ -53,85 +53,60 @@
},
/area/ruin/powered)
"l" = (
-/obj/structure/bodycontainer/morgue{
- desc = "An oddly modernized tomb, at least compared to where it currently is.";
- name = "tomb"
- },
-/obj/effect/mob_spawn/human/skeleton,
-/obj/item/weapon/shovel/cursed,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"m" = (
/obj/item/weapon/grown/bananapeel,
/obj/structure/mineral_door/transparent/diamond,
/turf/open/floor/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"n" = (
+"m" = (
/obj/item/weapon/ore/diamond,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"o" = (
+"n" = (
/turf/open/floor/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"p" = (
+"o" = (
/obj/item/weapon/ore/gold,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"q" = (
+"p" = (
/turf/open/floor/plating/lava/smooth/lava_land_surface,
/area/ruin/powered)
-"r" = (
-/obj/structure/bodycontainer/morgue{
- desc = "An oddly modernized tomb, at least compared to where it currently is.";
- name = "tomb"
- },
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"s" = (
+"q" = (
/obj/structure/table,
/obj/item/weapon/tome,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"t" = (
+"r" = (
/obj/item/weapon/grown/bananapeel,
/obj/structure/mineral_door/silver,
/turf/open/floor/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"u" = (
+"s" = (
/obj/item/weapon/ore/bananium,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"v" = (
+"t" = (
/obj/item/weapon/grown/bananapeel,
/obj/structure/mineral_door/gold,
/turf/open/floor/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"w" = (
+"u" = (
/obj/structure/table/optable/abductor{
desc = "A strange, alien-like table for cutting up things, like people.";
name = "strange alien slab"
@@ -144,14 +119,14 @@
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"x" = (
+"v" = (
/obj/structure/table,
/obj/item/weapon/spellbook/oneuse/charge,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"y" = (
+"w" = (
/obj/structure/bodycontainer/morgue{
desc = "An oddly modernized tomb, at least compared to where it currently is.";
name = "tomb"
@@ -165,26 +140,26 @@
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"z" = (
+"x" = (
/obj/item/weapon/ore/uranium,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"A" = (
+"y" = (
/obj/item/weapon/ore/plasma,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"B" = (
+"z" = (
/obj/item/weapon/grown/bananapeel,
/obj/structure/mineral_door/iron,
/turf/open/floor/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"C" = (
+"A" = (
/obj/structure/table,
/obj/item/weapon/twohanded/spear,
/obj/item/weapon/shield/riot/buckler,
@@ -192,7 +167,7 @@
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
-"D" = (
+"B" = (
/obj/item/weapon/grown/bananapeel,
/obj/structure/mineral_door/iron,
/turf/open/floor/plasteel/black{
@@ -324,8 +299,8 @@ h
j
k
j
-x
-y
+v
+w
g
b
b
@@ -375,9 +350,9 @@ g
g
g
g
-t
+r
g
-t
+r
g
g
g
@@ -399,15 +374,15 @@ g
g
g
g
+m
+n
+n
n
-o
-o
-o
i
-o
-o
-o
-z
+n
+n
+n
+x
g
g
b
@@ -426,15 +401,15 @@ h
i
j
g
-o
n
-o
-o
+m
+n
+n
i
-o
-o
-z
-o
+n
+n
+x
+n
g
g
g
@@ -453,19 +428,19 @@ i
k
i
g
-o
+n
i
-q
-q
+p
+p
i
-q
-q
+p
+p
i
-o
+n
g
-C
-C
-C
+A
+A
+A
g
b
b
@@ -480,15 +455,15 @@ i
i
i
g
-o
-q
+n
+p
i
-q
+p
i
-q
+p
i
-q
-o
+p
+n
g
i
i
@@ -506,21 +481,21 @@ g
j
i
i
-m
-o
-q
-q
-o
-u
-o
-q
-q
-o
-B
+l
+n
+p
+p
+n
+s
+n
+p
+p
+n
+z
i
j
i
-D
+B
b
b
"}
@@ -531,15 +506,15 @@ b
b
g
i
-l
+k
i
g
i
i
i
+s
u
-w
-u
+s
i
i
i
@@ -560,21 +535,21 @@ g
j
i
i
-m
-o
-q
-q
-o
-u
-o
-q
-q
-o
-B
+l
+n
+p
+p
+n
+s
+n
+p
+p
+n
+z
i
j
i
-D
+B
b
b
"}
@@ -588,15 +563,15 @@ i
i
i
g
-o
-q
+n
+p
i
-q
+p
i
-q
+p
i
-q
-o
+p
+n
g
i
i
@@ -615,19 +590,19 @@ i
k
i
g
-o
+n
i
-q
-q
+p
+p
i
-q
-q
+p
+p
i
-o
+n
g
-C
-C
-C
+A
+A
+A
g
b
b
@@ -642,15 +617,15 @@ h
i
j
g
+n
o
-p
-o
-o
+n
+n
i
-o
-o
-A
-o
+n
+n
+y
+n
g
g
g
@@ -669,15 +644,15 @@ g
g
g
g
-p
-o
-o
o
+n
+n
+n
i
-o
-o
-o
-A
+n
+n
+n
+y
g
g
b
@@ -699,9 +674,9 @@ g
g
g
g
-v
+t
g
-v
+t
g
g
g
@@ -724,8 +699,8 @@ e
d
g
g
-r
-s
+k
+q
i
k
i
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
deleted file mode 100644
index 5e745c1c7d8..00000000000
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
+++ /dev/null
@@ -1,2489 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/turf/template_noop,
-/area/template_noop)
-"ab" = (
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ac" = (
-/obj/item/stack/rods,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ad" = (
-/obj/item/stack/sheet/metal,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ae" = (
-/turf/open/floor/plating/lava/smooth/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"af" = (
-/obj/item/stack/rods,
-/turf/open/floor/plating{
- baseturf = /turf/open/chasm/straight_down/lava_land_surface
- },
-/area/lavaland/surface/outdoors)
-"ag" = (
-/turf/open/floor/plating{
- baseturf = /turf/open/chasm/straight_down/lava_land_surface
- },
-/area/lavaland/surface/outdoors)
-"ah" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/item/weapon/gun/projectile/revolver/nagant,
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/ammo_casing/a357,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ai" = (
-/obj/item/weapon/c4,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"aj" = (
-/turf/closed/wall/r_wall{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ak" = (
-/obj/item/stack/sheet/plasteel,
-/obj/item/ammo_casing/a357,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"al" = (
-/obj/item/stack/sheet/plasteel,
-/obj/item/stack/rods,
-/obj/item/ammo_casing/a357,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"am" = (
-/obj/item/stack/rods,
-/obj/item/ammo_casing/a357,
-/obj/item/ammo_casing/mm556x45,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"an" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/item/stack/sheet/plasteel,
-/obj/item/weapon/gun/projectile/shotgun/boltaction,
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/ammo_casing/mm556x45,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"ao" = (
-/obj/structure/filingcabinet,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ap" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 4
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aq" = (
-/obj/structure/table,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ar" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/item/weapon/gun/projectile/automatic/pistol/APS,
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"as" = (
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"at" = (
-/obj/item/ammo_casing/mm556x45,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"au" = (
-/obj/item/ammo_casing/a357,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"av" = (
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aw" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 8
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ax" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 4
- },
-/obj/item/weapon/shard,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ay" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"az" = (
-/obj/machinery/constructable_frame/machine_frame{
- desc = "A specialized hypersleep chamber meant to keep its occupent in suspended animation for long periods of time. The initials 'A.D' are marked on a specialized plaque. The hypersleeper is empty. ";
- dir = 2;
- icon = 'icons/obj/Cryogenic2.dmi';
- icon_state = "sleeper-o";
- name = "broken hypersleep chamber";
- pixel_y = 3
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aA" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aB" = (
-/obj/structure/filingcabinet,
-/obj/item/weapon/paper/pamphlet{
- icon = 'icons/obj/items.dmi';
- icon_state = "blueprints";
- info = "A strange looking set of blueprints with the actual schematics for whatever was once on it ripped out in what appears to be in a haste. The top of what remains of the blueprints spells out 'aus der Asche'.";
- name = "ripped blueprints"
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aC" = (
-/obj/item/weapon/shard,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aD" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aE" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aF" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/structure/table_frame,
-/obj/effect/decal/cleanable/blood/old,
-/obj/machinery/light,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aG" = (
-/obj/item/stack/sheet/metal,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aH" = (
-/obj/structure/table,
-/obj/machinery/light,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aI" = (
-/obj/machinery/door/poddoor/preopen{
- id = "lavagerman"
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aJ" = (
-/turf/open/floor/plasteel/stairs{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aK" = (
-/mob/living/simple_animal/hostile/wwii/bomber,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aL" = (
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aM" = (
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aN" = (
-/obj/item/ammo_casing/c9mm,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aO" = (
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1"
- },
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aP" = (
-/obj/structure/table,
-/obj/item/device/flashlight/lamp,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aQ" = (
-/mob/living/simple_animal/hostile/wwii/melee,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aR" = (
-/obj/effect/spawner/lootdrop/crate_spawner,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aS" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aT" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/ammo_casing/c9mm,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aU" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aV" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aW" = (
-/obj/structure/closet/crate,
-/obj/item/weapon/dnainjector/dwarf,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aX" = (
-/obj/structure/table,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/item/weapon/storage/firstaid/regular{
- empty = 1;
- name = "first-aid kit"
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aY" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"aZ" = (
-/obj/structure/closet/crate,
-/obj/item/weapon/dnainjector/timed/hulk,
-/obj/item/weapon/dnainjector/wackymut,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"ba" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bb" = (
-/obj/structure/table,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bc" = (
-/obj/structure/table,
-/obj/item/weapon/paper_bin,
-/obj/item/weapon/pen,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bd" = (
-/obj/item/weapon/c4,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"be" = (
-/obj/item/stack/sheet/plasteel,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bf" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bg" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bh" = (
-/obj/structure/table,
-/obj/item/weapon/paper_bin,
-/obj/item/weapon/pen/edagger,
-/obj/item/weapon/storage/firstaid/regular,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bi" = (
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bj" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bk" = (
-/turf/closed/wall{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bl" = (
-/obj/machinery/door/poddoor{
- id = "lavagerman"
- },
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bm" = (
-/obj/item/stack/rods,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"bn" = (
-/obj/item/ammo_casing/c9mm,
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bo" = (
-/obj/item/ammo_casing/c9mm,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bp" = (
-/obj/machinery/door/poddoor{
- id = "lavagerman1";
- name = "secure storage a"
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bq" = (
-/obj/item/stack/sheet/plasteel,
-/turf/open/floor/plasteel/stairs{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"br" = (
-/obj/item/stack/sheet/metal,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- icon_plating = "platingdmg1";
- icon_state = "platingdmg1"
- },
-/area/ruin/powered)
-"bs" = (
-/obj/machinery/door/poddoor{
- id = "lavagerman2";
- name = "secure storage b"
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bt" = (
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1"
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bu" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/item/weapon/gun/projectile/automatic/pistol/APS,
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/ammo_casing/c9mm,
-/obj/item/ammo_casing/c9mm,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bv" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bw" = (
-/obj/machinery/button/door{
- id = "lavagerman1";
- pixel_y = 32
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bx" = (
-/obj/machinery/door/airlock/highsecurity,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"by" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bz" = (
-/obj/machinery/button/door{
- id = "lavagerman2";
- pixel_y = 32
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bA" = (
-/obj/structure/table,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bB" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bC" = (
-/obj/item/ammo_casing/a357,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bD" = (
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bE" = (
-/obj/item/stack/sheet/metal,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bF" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bG" = (
-/obj/structure/table_frame,
-/obj/item/stack/sheet/metal,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bH" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/item/ammo_casing/c9mm,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bI" = (
-/obj/structure/table,
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1"
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bJ" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/ushanka;
- name = "russian remains";
- uniform = /obj/item/clothing/under/soviet
- },
-/obj/item/weapon/gun/projectile/shotgun/boltaction,
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bK" = (
-/obj/structure/table,
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bL" = (
-/obj/effect/mob_spawn/human/skeleton{
- helmet = /obj/item/clothing/head/helmet/stahlhelm;
- name = "german remains";
- uniform = /obj/item/clothing/under/wwii
- },
-/obj/item/weapon/gun/projectile/automatic/pistol/APS,
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bM" = (
-/obj/machinery/door/poddoor{
- id = "lavagerman"
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bN" = (
-/obj/machinery/door/airlock/glass_external,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bO" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 8
- },
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bP" = (
-/obj/machinery/porta_turret/stationary,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bQ" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 4
- },
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bR" = (
-/obj/structure/sign/xeno_warning_mining{
- pixel_y = -32
- },
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bS" = (
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bT" = (
-/obj/structure/sign/xeno_warning_mining{
- pixel_y = -32
- },
-/obj/item/weapon/rcd/loaded,
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bU" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 8
- },
-/obj/structure/window{
- tag = "icon-rwindow";
- icon_state = "rwindow";
- dir = 2
- },
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bV" = (
-/obj/structure/window{
- tag = "icon-rwindow";
- icon_state = "rwindow";
- dir = 2
- },
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-"bW" = (
-/obj/structure/window{
- icon_state = "rwindow";
- dir = 4
- },
-/obj/structure/window{
- tag = "icon-rwindow";
- icon_state = "rwindow";
- dir = 2
- },
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
-/area/ruin/powered)
-
-(1,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-aa
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(2,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(3,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(4,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(5,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(6,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(7,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-aj
-bi
-bn
-bi
-bA
-bA
-bA
-bi
-aj
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(8,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-aj
-bi
-bo
-bu
-bi
-bi
-bi
-bi
-aj
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(9,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-bj
-bi
-bv
-bo
-bi
-bi
-bi
-aj
-ab
-ae
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(10,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-bk
-bk
-bw
-bi
-bi
-bF
-bi
-aj
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(11,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-ao
-av
-aP
-aX
-bc
-av
-bp
-bi
-bA
-bA
-bI
-bi
-aj
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(12,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-ao
-av
-aQ
-aY
-av
-av
-bk
-as
-bk
-bk
-bk
-bM
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(13,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-ao
-aK
-aR
-aZ
-aR
-aR
-bk
-bi
-bi
-bD
-bi
-bi
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(14,1,1) = {"
-aa
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-bk
-bi
-bB
-bC
-bi
-bi
-aj
-bO
-bU
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(15,1,1) = {"
-aa
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-bi
-bC
-bi
-bF
-bi
-aj
-bP
-bV
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(16,1,1) = {"
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ab
-aj
-aj
-ao
-ao
-aB
-ao
-aj
-aj
-aL
-aM
-aM
-aL
-aj
-aj
-bi
-bi
-bi
-bi
-bi
-aj
-bQ
-bW
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(17,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-ap
-ax
-av
-ap
-aj
-aj
-aM
-aM
-aM
-aM
-aj
-aj
-bx
-bk
-bk
-bk
-bk
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(18,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-aq
-av
-aC
-aF
-aj
-aj
-aM
-aM
-aS
-aM
-aj
-aj
-bi
-bD
-bi
-bi
-bi
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(19,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ab
-ab
-aj
-aj
-ar
-ay
-av
-aG
-aj
-aj
-aM
-aS
-aN
-aM
-aj
-aj
-bi
-bi
-bi
-by
-bi
-bk
-aj
-aj
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(20,1,1) = {"
-aa
-aa
-ac
-ab
-ae
-ae
-ae
-ab
-ad
-ak
-aj
-as
-av
-au
-aD
-aI
-aJ
-aM
-aM
-aM
-bd
-bl
-bq
-by
-bB
-bi
-bi
-bi
-bk
-bR
-aj
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(21,1,1) = {"
-aa
-aa
-ad
-ab
-af
-ae
-ag
-ab
-ah
-al
-am
-at
-az
-aD
-av
-aj
-aj
-aM
-aT
-aM
-be
-bm
-br
-bi
-bi
-bi
-bi
-bi
-bN
-bS
-bN
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(22,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ab
-ai
-aj
-an
-au
-aA
-av
-av
-aI
-aJ
-aM
-aU
-aM
-aN
-bl
-bq
-bi
-bi
-bi
-bJ
-bi
-bk
-bT
-aj
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(23,1,1) = {"
-aa
-aa
-aa
-ad
-ae
-ae
-ae
-ab
-ab
-aj
-aj
-av
-av
-av
-av
-aj
-aj
-aM
-aM
-aM
-bf
-aj
-aj
-bi
-by
-bi
-bi
-bi
-bk
-aj
-aj
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(24,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ab
-ab
-aj
-aj
-aq
-av
-aE
-aH
-aj
-aj
-aN
-aM
-aM
-aM
-aj
-aj
-bi
-bt
-bi
-bi
-bi
-aj
-ab
-ab
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(25,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-aw
-aw
-aw
-aw
-aj
-aj
-aM
-aV
-aM
-aM
-aj
-aj
-bx
-bk
-bk
-bk
-bk
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(26,1,1) = {"
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-ao
-ao
-ao
-ao
-aj
-aj
-aO
-aM
-aM
-aO
-aj
-aj
-bi
-bi
-bi
-bi
-bi
-aj
-bO
-bU
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(27,1,1) = {"
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-bi
-bi
-bi
-bi
-bi
-aj
-bP
-bV
-ae
-ae
-ae
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(28,1,1) = {"
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-bk
-bi
-bB
-bi
-by
-bi
-aj
-bQ
-bW
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(29,1,1) = {"
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-ao
-aK
-aW
-aR
-bg
-aR
-bk
-bi
-bE
-bi
-bt
-bi
-aj
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(30,1,1) = {"
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-ao
-av
-aQ
-ba
-av
-av
-bk
-bk
-bk
-br
-bk
-bM
-aj
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(31,1,1) = {"
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-ao
-av
-aP
-bb
-bh
-av
-bs
-bi
-bA
-bG
-bK
-bi
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(32,1,1) = {"
-aa
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-bk
-bk
-bz
-bi
-bi
-bi
-bi
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(33,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-bj
-bi
-bi
-bF
-bo
-bL
-bo
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(34,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-bi
-bi
-bi
-bi
-bH
-bi
-bo
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(35,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-bi
-bt
-bi
-bA
-bA
-bA
-bi
-aj
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(36,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-ab
-ab
-ae
-ae
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-"}
-(37,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(38,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(39,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-"}
-(40,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-aa
-aa
-aa
-aa
-aa
-aa
-"}
diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
index 7aa34319ef8..ca889ab1ac7 100644
--- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm
+++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
@@ -488,9 +488,8 @@
/turf/closed/mineral/random,
/area/mine/explored)
"abg" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
- dir = 4
+/obj/machinery/sleeper/syndie{
+ dir = 4
},
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index 23fe48b8871..c15747c8fc1 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -56,7 +56,7 @@
"abd" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abe" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abf" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
-"abg" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
+"abg" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abh" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abi" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abj" = (/obj/structure/table,/obj/item/weapon/gun/syringe{pixel_x = 1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index 21f5b372084..a2c597f1c0a 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -2968,8 +2968,7 @@
},
/area/shuttle/syndicate)
"afH" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
+/obj/machinery/sleeper/syndie{
dir = 4
},
/turf/open/floor/plasteel/shuttle{
diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 4dd58063038..cfece55a966 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -2176,8 +2176,7 @@
name = "AI Satellite Service"
})
"adT" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
+/obj/machinery/sleeper/syndie{
dir = 4
},
/turf/open/floor/plasteel/shuttle{
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index fe82c35a6a7..37d91dd73ba 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -93756,12 +93756,6 @@
dir = 1;
on = 1
},
-/obj/item/device/radio/intercom{
- freerange = 0;
- frequency = 1459;
- name = "Station Intercom (General)";
- pixel_x = 29
- },
/turf/open/floor/plasteel{
dir = 8;
icon_state = "chapel"
@@ -96581,8 +96575,7 @@
},
/area/shuttle/syndicate)
"cXV" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
+/obj/machinery/sleeper/syndie{
dir = 4
},
/turf/open/floor/plasteel/shuttle{
@@ -99088,9 +99081,8 @@
},
/area/shuttle/abandoned)
"dcy" = (
-/turf/open/space,
/turf/closed/wall/shuttle{
- icon_state = "swall_f6";
+ icon_state = "swall7";
dir = 2
},
/area/shuttle/escape)
@@ -99119,17 +99111,29 @@
/area/shuttle/escape)
"dcD" = (
/obj/machinery/door/airlock/shuttle{
- name = "Emergency Shuttle Cargo Bay Airlock"
+ name = "Emergency Shuttle Airlock"
},
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "delivery"
+/obj/docking_port/mobile/emergency{
+ dir = 2;
+ dwidth = 5;
+ height = 14;
+ name = "MetaStation emergency shuttle";
+ width = 25
},
+/obj/docking_port/stationary{
+ dheight = 0;
+ dir = 2;
+ dwidth = 5;
+ height = 14;
+ id = "emergency_home";
+ name = "emergency evac bay";
+ width = 25
+ },
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dcE" = (
-/turf/open/space,
/turf/closed/wall/shuttle{
- icon_state = "swall_f10";
+ icon_state = "swall8";
dir = 2
},
/area/shuttle/escape)
@@ -99236,17 +99240,15 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dcJ" = (
-/obj/machinery/status_display{
- pixel_y = 32
+/turf/closed/wall/shuttle{
+ icon_state = "swall4";
+ dir = 2
},
-/obj/machinery/hologram/holopad,
-/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dcK" = (
-/obj/structure/sign/nosmoking_2,
+/obj/structure/sign/bluecross_2,
/turf/closed/wall/shuttle{
- icon_state = "swall3";
- dir = 2
+ icon_state = "swall2"
},
/area/shuttle/escape)
"dcL" = (
@@ -99259,17 +99261,25 @@
},
/area/shuttle/escape)
"dcM" = (
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "delivery"
+/obj/item/device/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 0;
+ pixel_y = 27
},
+/obj/structure/chair,
+/turf/open/floor/plasteel/shuttle/white,
/area/shuttle/escape)
"dcN" = (
-/obj/machinery/recharge_station,
-/turf/open/floor/plating{
- icon_state = "bot"
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/area/shuttle/escape)
+/turf/open/floor/plasteel{
+ icon_state = "white"
+ },
+/area/toxins/xenobiology)
"dcO" = (
/obj/structure/table,
/obj/item/weapon/clipboard,
@@ -99286,16 +99296,16 @@
},
/area/shuttle/escape)
"dcQ" = (
-/obj/item/device/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 31
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4";
+ tag = "90Curve"
},
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plating{
- icon_state = "bot"
+/turf/open/floor/plasteel{
+ icon_state = "white"
},
-/area/shuttle/escape)
+/area/toxins/xenobiology)
"dcR" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -99336,31 +99346,35 @@
},
/area/shuttle/escape)
"dcU" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+/obj/structure/extinguisher_cabinet,
+/turf/closed/wall/shuttle{
+ icon_state = "swall12";
+ dir = 2
},
/area/shuttle/escape)
"dcV" = (
-/obj/structure/chair{
- dir = 8
+/obj/machinery/vending/wallmed{
+ name = "Emergency NanoMed";
+ pixel_x = 0;
+ pixel_y = 0;
+ req_access_txt = "0";
+ use_power = 0
},
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+/turf/closed/wall/shuttle{
+ icon_state = "swall12";
+ dir = 2
},
/area/shuttle/escape)
"dcW" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 0
+/obj/structure/cable/yellow{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/turf/open/floor/plating{
- icon_state = "bot"
+/turf/open/floor/plasteel{
+ icon_state = "white"
},
-/area/shuttle/escape)
+/area/toxins/xenobiology)
"dcX" = (
/obj/structure/closet/crate{
name = "emergency supplies crate"
@@ -99383,155 +99397,112 @@
},
/area/shuttle/escape)
"dcY" = (
-/obj/docking_port/stationary{
- dheight = 0;
- dir = 4;
- dwidth = 5;
- height = 14;
- id = "emergency_home";
- name = "emergency evac bay";
- width = 25
+/obj/structure/cable/yellow{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8";
+ tag = ""
},
-/obj/docking_port/mobile/emergency{
- dheight = 0;
- dir = 4;
- dwidth = 5;
- height = 14;
- width = 25
+/obj/machinery/light/small{
+ dir = 4
},
-/obj/machinery/door/airlock/shuttle{
- name = "Emergency Shuttle Airlock"
+/turf/open/floor/plasteel{
+ icon_state = "white"
},
-/turf/open/floor/plasteel/shuttle,
-/area/shuttle/escape)
+/area/toxins/xenobiology)
"dcZ" = (
-/obj/machinery/vending/wallmed{
- name = "Emergency NanoMed";
- pixel_x = 0;
- pixel_y = 0;
- req_access_txt = "0";
- use_power = 0
+/obj/item/device/radio/intercom{
+ freerange = 0;
+ frequency = 1459;
+ name = "Station Intercom (General)";
+ pixel_x = 29
},
-/turf/closed/wall/shuttle{
- icon_state = "swall3";
- dir = 2
+/turf/open/floor/plasteel{
+ icon_state = "chapel"
},
-/area/shuttle/escape)
+/area/chapel/main)
"dda" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating{
- icon_state = "bot"
+/obj/structure/chair/comfy/black{
+ dir = 8
},
-/area/shuttle/escape)
+/turf/open/floor/plasteel{
+ dir = 4;
+ icon_state = "chapel"
+ },
+/area/chapel/main)
"ddb" = (
-/obj/machinery/space_heater,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27;
- pixel_y = 0
- },
-/turf/open/floor/plating{
- icon_state = "bot"
+/turf/closed/wall/shuttle{
+ icon_state = "swall_s6";
+ dir = 2
},
/area/shuttle/escape)
"ddc" = (
-/obj/structure/chair{
- dir = 4
- },
-/obj/item/device/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = -31
- },
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+/turf/closed/wall/shuttle{
+ icon_state = "swall1"
},
/area/shuttle/escape)
"ddd" = (
-/obj/structure/rack,
-/obj/item/weapon/storage/toolbox/electrical{
- pixel_x = -3;
- pixel_y = 1
- },
-/obj/item/weapon/storage/toolbox/mechanical{
- pixel_x = 0;
- pixel_y = -1
- },
-/obj/item/weapon/storage/toolbox/emergency{
- pixel_x = 3;
- pixel_y = -5
- },
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "warning"
+/obj/structure/sign/nosmoking_2,
+/turf/closed/wall/shuttle{
+ icon_state = "swall12";
+ dir = 2
},
/area/shuttle/escape)
"dde" = (
-/obj/structure/rack,
-/obj/item/weapon/crowbar,
-/obj/item/weapon/wrench,
-/obj/item/weapon/weldingtool,
-/obj/item/weapon/wirecutters,
-/obj/item/stack/cable_coil,
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "warning"
+/turf/closed/wall/shuttle{
+ icon_state = "swall_s10";
+ dir = 2
},
/area/shuttle/escape)
"ddf" = (
-/obj/structure/rack{
- dir = 1
- },
-/obj/item/weapon/tank/internals/oxygen/red,
-/obj/item/clothing/suit/fire/firefighter,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/head/hardhat/red,
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "warning"
- },
+/obj/structure/chair,
+/turf/open/floor/plasteel/shuttle/white,
/area/shuttle/escape)
"ddg" = (
-/turf/open/floor/plating{
- dir = 1;
- icon_state = "warning"
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
},
+/turf/open/floor/plating/airless,
/area/shuttle/escape)
"ddh" = (
-/obj/structure/extinguisher_cabinet,
-/turf/closed/wall/shuttle{
- icon_state = "swall3";
- dir = 2
+/obj/item/device/radio/intercom{
+ dir = 2;
+ name = "Station Intercom (General)";
+ pixel_x = 0;
+ pixel_y = -31
},
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/plasteel/shuttle/white,
/area/shuttle/escape)
"ddi" = (
-/turf/closed/wall/shuttle{
- icon_state = "swall7";
- dir = 2
- },
-/area/shuttle/escape)
-"ddj" = (
-/obj/structure/chair{
+/obj/structure/shuttle/engine/heater{
dir = 8
},
-/obj/structure/sign/bluecross_2{
- pixel_x = 32
+/obj/structure/window/reinforced{
+ dir = 4
},
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"ddj" = (
+/obj/structure/chair/office/dark{
+ dir = 1
},
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddk" = (
+/obj/machinery/status_display,
/turf/closed/wall/shuttle{
- icon_state = "swall8";
+ icon_state = "swall3";
dir = 2
},
/area/shuttle/escape)
"ddl" = (
-/obj/structure/sign/bluecross_2,
-/turf/closed/wall/shuttle{
- icon_state = "swall4";
- dir = 2
+/obj/structure/chair{
+ dir = 1
},
+/turf/open/floor/plasteel/shuttle/white,
/area/shuttle/escape)
"ddm" = (
/obj/machinery/door/airlock/glass_medical{
@@ -99548,12 +99519,11 @@
},
/area/shuttle/escape)
"ddo" = (
-/obj/machinery/sleeper{
+/obj/structure/sign/bluecross_2,
+/turf/closed/wall/shuttle{
+ icon_state = "swall14";
dir = 2
},
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
- },
/area/shuttle/escape)
"ddp" = (
/obj/structure/table,
@@ -99578,21 +99548,16 @@
},
/area/shuttle/escape)
"ddr" = (
-/obj/machinery/shower{
- dir = 4;
- icon_state = "shower";
- name = "emergency shower"
+/obj/machinery/status_display{
+ dir = 8;
+ pixel_x = 32;
+ pixel_y = 0
},
+/obj/machinery/hologram/holopad,
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dds" = (
-/obj/structure/sink{
- dir = 4;
- icon_state = "sink";
- pixel_x = 11;
- pixel_y = 0
- },
-/turf/open/floor/plasteel/shuttle,
+/turf/open/floor/plasteel/floorgrime,
/area/shuttle/escape)
"ddt" = (
/obj/structure/table,
@@ -99640,27 +99605,17 @@
/area/shuttle/escape)
"ddv" = (
/obj/structure/table,
-/obj/item/weapon/scalpel{
- pixel_y = 12
+/obj/item/weapon/paper_bin{
+ pixel_x = -2;
+ pixel_y = 8
},
-/obj/item/weapon/circular_saw,
-/obj/item/weapon/retractor{
- pixel_x = 4
- },
-/obj/item/weapon/hemostat{
- pixel_x = -4
- },
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
/obj/item/device/radio/intercom{
- dir = 4;
+ dir = 2;
name = "Station Intercom (General)";
pixel_x = 0;
- pixel_y = -27
- },
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+ pixel_y = -31
},
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddw" = (
/obj/structure/table/optable,
@@ -99670,32 +99625,31 @@
},
/area/shuttle/escape)
"ddx" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/item/device/radio/intercom{
+/obj/structure/table,
+/obj/item/weapon/folder/blue,
+/obj/structure/extinguisher_cabinet{
dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 31
- },
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor3"
+ pixel_x = 0;
+ pixel_y = -27
},
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddy" = (
-/obj/machinery/status_display,
-/turf/closed/wall/shuttle{
- icon_state = "swall12";
- dir = 2
+/obj/machinery/space_heater,
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = 0;
+ pixel_y = -27
+ },
+/turf/open/floor/plating{
+ icon_state = "bot"
},
/area/shuttle/escape)
"ddz" = (
-/obj/structure/chair,
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = 0;
- pixel_y = 29
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Cargo Bay Airlock"
},
-/turf/open/floor/plasteel/shuttle/red,
+/turf/open/floor/plasteel/delivery,
/area/shuttle/escape)
"ddA" = (
/obj/structure/chair{
@@ -99748,60 +99702,37 @@
},
/area/shuttle/escape)
"ddI" = (
-/obj/machinery/flasher{
- id = "emshuttlebridgeflash";
- pixel_y = -24
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ icon_state = "floorgrime"
},
-/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddJ" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/machinery/flasher{
- id = "emshuttleflash";
- pixel_y = -24
- },
-/turf/open/floor/plasteel/shuttle/red,
+/obj/machinery/shower,
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddK" = (
-/obj/structure/chair{
- dir = 1
+/obj/machinery/sleeper{
+ dir = 8
},
-/obj/machinery/button/flasher{
- id = "emshuttleflash";
- name = "brig flasher button";
- pixel_y = -23;
- req_access_txt = "0";
- req_one_access_txt = "1;63;19"
- },
-/turf/open/floor/plasteel/shuttle/red,
+/turf/open/floor/plasteel/shuttle/white,
/area/shuttle/escape)
"ddL" = (
-/obj/structure/table,
-/obj/item/weapon/folder/red{
- pixel_x = 3
+/obj/structure/rack,
+/obj/item/weapon/crowbar,
+/obj/item/weapon/wrench,
+/obj/item/weapon/weldingtool,
+/obj/item/weapon/wirecutters,
+/obj/item/stack/cable_coil,
+/turf/open/floor/plasteel/warning{
+ dir = 4
},
-/obj/item/weapon/folder/white{
- pixel_x = -4;
- pixel_y = 2
- },
-/obj/item/device/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 31
- },
-/obj/item/weapon/book/manual/wiki/security_space_law{
- pixel_x = -4;
- pixel_y = 4
- },
-/turf/open/floor/plasteel/shuttle/red,
/area/shuttle/escape)
"ddM" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plasteel/shuttle/red,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plasteel/delivery,
/area/shuttle/escape)
"ddN" = (
/obj/machinery/door/airlock/glass_command{
@@ -99829,14 +99760,8 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddR" = (
-/obj/machinery/button/flasher{
- id = "emshuttlebridgeflash";
- name = "cockpit flasher button";
- pixel_y = 24;
- req_access_txt = "0";
- req_one_access_txt = "1;63;19"
- },
-/turf/open/floor/plasteel/shuttle,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/delivery,
/area/shuttle/escape)
"ddS" = (
/obj/machinery/door/airlock/command{
@@ -99847,30 +99772,17 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddT" = (
-/turf/open/floor/plasteel/shuttle{
- icon_state = "shuttlefloor4"
- },
+/turf/open/floor/plasteel/delivery,
/area/shuttle/escape)
"ddU" = (
-/obj/machinery/suit_storage_unit/standard_unit,
-/obj/item/device/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 0;
- pixel_y = 27
- },
-/turf/open/floor/plating{
- icon_state = "floorgrime"
- },
+/obj/machinery/recharge_station,
+/turf/open/floor/plasteel/delivery,
/area/shuttle/escape)
"ddV" = (
-/obj/machinery/suit_storage_unit/standard_unit,
-/obj/machinery/status_display{
- pixel_y = 31
- },
-/turf/open/floor/plating{
- icon_state = "floorgrime"
+/obj/structure/chair{
+ dir = 8
},
+/turf/open/floor/plasteel/shuttle/red,
/area/shuttle/escape)
"ddW" = (
/obj/structure/chair/office/dark{
@@ -99883,24 +99795,34 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddY" = (
-/obj/structure/chair/office/dark{
- dir = 4
+/obj/structure/reagent_dispensers/peppertank,
+/turf/closed/wall/shuttle{
+ icon_state = "swall3";
+ dir = 2
},
-/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"ddZ" = (
-/obj/structure/table,
-/obj/item/weapon/folder/blue,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27;
- pixel_y = 0
+/obj/structure/rack,
+/obj/item/weapon/storage/toolbox/electrical{
+ pixel_x = -3;
+ pixel_y = 1
+ },
+/obj/item/weapon/storage/toolbox/mechanical{
+ pixel_x = 0;
+ pixel_y = -1
+ },
+/obj/item/weapon/storage/toolbox/emergency{
+ pixel_x = 3;
+ pixel_y = -5
+ },
+/turf/open/floor/plasteel/warning{
+ dir = 4
},
-/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dea" = (
-/turf/closed/wall/shuttle{
- icon_state = "swallc4";
- dir = 2
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/plating{
+ icon_state = "floorgrime"
},
/area/shuttle/escape)
"deb" = (
@@ -99920,17 +99842,9 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dee" = (
-/obj/structure/table,
-/obj/item/weapon/paper_bin{
- pixel_x = -2;
- pixel_y = 8
+/turf/open/floor/plasteel/warning{
+ dir = 4
},
-/obj/item/device/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 31
- },
-/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"def" = (
/obj/structure/table,
@@ -99979,24 +99893,30 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"dem" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating{
- icon_state = "floorgrime"
+/turf/closed/wall/shuttle{
+ icon_state = "diagonalWall3"
},
/area/shuttle/escape)
"den" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 0
+/obj/structure/table,
+/obj/item/weapon/folder/red{
+ pixel_x = 3
},
-/obj/structure/chair{
- dir = 1
+/obj/item/weapon/folder/white{
+ pixel_x = -4;
+ pixel_y = 2
},
-/turf/open/floor/plating{
- icon_state = "floorgrime"
+/obj/item/device/radio/intercom{
+ dir = 2;
+ name = "Station Intercom (General)";
+ pixel_x = 0;
+ pixel_y = -31
},
+/obj/item/weapon/book/manual/wiki/security_space_law{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/shuttle/red,
/area/shuttle/escape)
"deo" = (
/obj/structure/reagent_dispensers/watertank,
@@ -100005,13 +99925,27 @@
},
/area/shuttle/escape)
"dep" = (
-/turf/open/space,
-/turf/closed/wall/shuttle{
- icon_state = "diagonalWall3"
+/obj/structure/table,
+/obj/item/weapon/scalpel{
+ pixel_y = 12
},
-/turf/closed/wall/shuttle{
- icon_state = "swall_f5";
- dir = 2
+/obj/item/weapon/circular_saw,
+/obj/item/weapon/retractor{
+ pixel_x = 4
+ },
+/obj/item/weapon/hemostat{
+ pixel_x = -4
+ },
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/mask/surgical,
+/obj/item/device/radio/intercom{
+ dir = 2;
+ name = "Station Intercom (General)";
+ pixel_x = -27;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
},
/area/shuttle/escape)
"deq" = (
@@ -100021,23 +99955,31 @@
},
/area/shuttle/escape)
"der" = (
-/turf/open/space,
-/turf/closed/wall/shuttle{
- icon_state = "swall_f9";
- dir = 2
- },
+/obj/structure/sink,
+/turf/open/floor/plasteel/shuttle,
/area/shuttle/escape)
"des" = (
-/obj/structure/window/reinforced{
+/obj/structure/rack{
dir = 1
},
-/obj/structure/shuttle/engine/heater,
-/turf/open/floor/plating/airless,
+/obj/item/weapon/tank/internals/oxygen/red,
+/obj/item/clothing/suit/fire/firefighter,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/hardhat/red,
+/turf/open/floor/plasteel/warning{
+ dir = 4
+ },
/area/shuttle/escape)
"det" = (
-/turf/open/space,
-/turf/closed/wall/shuttle{
- icon_state = "diagonalWall3"
+/obj/item/device/radio/intercom{
+ dir = 2;
+ name = "Station Intercom (General)";
+ pixel_x = 0;
+ pixel_y = -31
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plating{
+ icon_state = "bot"
},
/area/shuttle/escape)
"deu" = (
@@ -100046,15 +99988,16 @@
},
/area/shuttle/escape)
"dev" = (
-/turf/open/space,
/turf/closed/wall/shuttle{
- dir = 4;
- icon_state = "diagonalWall3"
+ icon_state = "swall_s5";
+ dir = 2
},
/area/shuttle/escape)
"dew" = (
-/obj/structure/shuttle/engine/propulsion,
-/turf/open/floor/plating/airless,
+/turf/closed/wall/shuttle{
+ icon_state = "swall_s9";
+ dir = 2
+ },
/area/shuttle/escape)
"dex" = (
/obj/structure/grille,
@@ -100668,6 +100611,18 @@
icon_state = "warning"
},
/area/hydroponics)
+"dfK" = (
+/turf/closed/wall/shuttle{
+ icon_state = "swall2"
+ },
+/area/shuttle/escape)
+"dfJ" = (
+/turf/closed/wall/shuttle{
+ tag = "icon-wall3 (NORTHWEST)";
+ icon_state = "wall3";
+ dir = 9
+ },
+/area/shuttle/escape)
(1,1,1) = {"
aaa
@@ -122720,7 +122675,7 @@ aaa
aaa
aaa
aaa
-aaa
+aac
aaa
aaa
aaa
@@ -122964,17 +122919,17 @@ cOU
cOU
cOU
cOU
-aaf
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
+ddg
+ddg
+ddg
+deu
+ddg
+ddg
+deu
+ddg
+ddg
+ddg
aaa
aaa
aaa
@@ -123221,18 +123176,18 @@ cOU
cTH
cOU
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dfJ
+ddi
+ddi
+ddi
+deu
+ddi
+ddi
+deu
+ddi
+ddi
+ddi
+dem
aaa
aaa
aaa
@@ -123477,20 +123432,20 @@ cSX
cTo
cTI
cOU
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+ddb
+dcF
+dcF
+dcF
+dcF
+dcF
+dcF
+dcF
+dcy
+dcF
+dcF
+dcF
+dcF
+dev
aaa
aaa
aaa
@@ -123734,20 +123689,20 @@ cSY
cTp
cTJ
cUh
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aac
+dcz
+deg
+def
+deh
+dei
+dek
+dej
+del
+dcU
+ddI
+ddI
+ddI
+deo
+dcz
aaa
aaa
aaa
@@ -123991,20 +123946,20 @@ cSY
cRe
cTJ
cUh
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dcz
+dec
+dcI
+ded
+ddW
+ddj
+dcI
+ddv
+dcA
+dcP
+dcP
+dcP
+dcP
+deb
aaa
aaa
aaa
@@ -124248,20 +124203,20 @@ cSZ
cTq
cTK
cUh
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dcz
+ddX
+ddj
+dcI
+dcI
+dcI
+ded
+ddx
+dcE
+deb
+dcJ
+dcP
+dcP
+deb
aaa
aaa
aaa
@@ -124505,20 +124460,20 @@ cSY
cRe
cTJ
cUh
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dcz
+ddQ
+ddP
+dcI
+dcI
+dcI
+dcI
+dcI
+ddS
+ddD
+dcA
+dea
+dea
+dcz
aaa
aaa
aaa
@@ -124762,20 +124717,20 @@ cSY
cTp
cTJ
cUh
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dcC
+dcF
+ddk
+ddc
+ddN
+dfK
+ddk
+dcF
+ddO
+dcF
+ddn
+ddk
+dcF
+deq
aaa
aaa
aaa
@@ -125019,29 +124974,29 @@ cTa
cTr
cTL
cOU
-dcy
-dcF
-dcF
-dcB
-dcz
-dcY
-dcF
-dcz
-dcz
-dcz
-dcK
-dcB
-dcz
-dcB
-dcF
-dcz
-dcF
-ddi
-dcz
-dcz
-dcz
-dcz
-dep
+dcA
+ddH
+dcI
+dcI
+dcI
+dcI
+dcI
+ddH
+dcE
+ddA
+ddA
+ddA
+den
+dcA
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -125273,33 +125228,33 @@ cOU
cSd
cSB
cTb
+dcZ
+dda
cOU
-cOU
-cOU
-dcA
-dcH
+dcz
dcI
dcI
-dcU
dcI
-ddc
-dcU
-dcU
-dcU
-dcU
dcI
-dcU
dcI
-dcU
dcI
-ddH
-dcA
-ddQ
-ddX
-dec
-deg
-dcA
-det
+dcI
+ddF
+ddD
+ddD
+ddD
+ddG
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -125531,33 +125486,33 @@ cOU
cOU
cOU
cOU
-aaa
-aaf
-dcz
-dcG
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-ddy
-ddP
-ddW
-dcI
-def
+cOU
+cOU
dcA
-des
-dew
+ddf
+dcI
+ddl
+dcz
+ddf
+dcI
+ddl
+dcz
+ddC
+ddD
+ddD
+ddE
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -125787,34 +125742,34 @@ cPh
cSe
cSC
cTc
-cRK
-cRK
-cRK
+cTs
+cTM
+cTs
+dcB
+dcI
+dcI
+ddl
+dcV
+ddf
+dcI
+ddl
dcA
-dcH
-dcI
-dcI
-dcV
-dcV
-dcV
-dcV
-dcV
-dcI
-dcV
-dcV
-dcV
-dcV
-dcV
-dcI
-dcI
+ddC
+ddV
+ddV
+ddB
dcA
-dcI
-dcI
-ddY
-dei
-dcA
-des
-dew
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126044,34 +125999,34 @@ cNy
cNy
cSD
cTd
-cTs
-cTM
-cTs
-dcB
-dcI
-dcI
-dcI
+cRK
+cRK
+cRK
dcz
-dcZ
+ddf
+dcI
+ddl
dcz
+ddf
+dcI
ddh
-dcz
-dcI
-dcz
-ddh
-dcz
-dcZ
-dcz
-dcI
-dcI
-ddN
-dcI
-dcI
-ded
-deh
-dcA
-des
-dew
+dcC
+dcF
+ddY
+ddk
+dcF
+deq
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126301,34 +126256,34 @@ cNy
cSf
cSE
cTe
-cRK
-cRK
-cRK
+cTs
+cTd
+cTs
+dcB
+dcI
+dcI
+ddl
+dcU
+ddf
+dcI
+ddl
dcA
-dcJ
-dcI
-dcI
-dcU
-dcU
-dcU
-dcU
-dcU
-dcI
-dcU
-dcU
-dcU
-dcU
-dcU
-dcI
-ddI
+ddu
+ddt
+ddw
+dep
dcA
-ddR
-dcI
-ddW
-dek
-dcA
-deu
-deu
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126558,34 +126513,34 @@ cNy
cSg
cSD
cTd
-cTs
-cTd
-cTs
-dcB
+cRK
+cRK
+cRK
+ddd
+ddf
+dcI
+ddl
+dcz
+ddf
+dcI
+ddl
+dcz
+ddJ
dcI
dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-dcI
-ddy
-dcI
-ddY
-dcI
-dej
-dcA
-des
-dew
+der
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126816,33 +126771,33 @@ cSh
cSD
cTd
cRK
-cRK
-cRK
-dcA
-dcL
+aaa
+aaf
+dcz
+ddf
dcI
dcI
-dcV
-dcV
-dcV
-ddj
-dcV
dcI
-dcV
-dcV
-ddx
-dcV
-dcV
dcI
-ddH
-dcA
dcI
-ddZ
-dee
-del
-dcA
-des
-dew
+dcI
+ddm
+dcI
+dcI
+dcI
+ddq
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -127075,31 +127030,31 @@ cTf
cRK
aaa
aaf
-dcC
-dcK
-dcD
-dcD
-dcF
dcz
-dcF
-ddi
+ddf
+dcI
+ddl
dcz
-ddm
+ddf
+dcI
+ddl
dcz
-dcF
-ddi
-dcF
-dcz
-ddF
-dcF
-ddO
-ddS
-ddi
-dcF
-dcF
-deq
-deu
-deu
+ddK
+ddK
+dcI
+ddp
+dcA
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -127330,33 +127285,33 @@ cSj
cSD
cTd
cRK
-cRK
-cRK
-dcA
-dcN
-dcM
-dcM
-dcW
-dda
-dde
-ddk
-ddo
+aaa
+aaf
+dcz
+ddf
dcI
-ddr
-ddu
-dcA
-ddA
-ddA
-ddD
-ddK
-dcA
-ddT
-deb
-dcP
-den
-dcA
-des
-dew
+ddl
+dcU
+ddf
+dcI
+ddl
+ddo
+dcF
+dcz
+ddm
+dcK
+deq
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -127586,34 +127541,34 @@ cNy
cSg
cSD
cTd
-cTs
-cTd
-cTs
-dcD
+cRK
+cRK
+cRK
+dcA
dcM
-dcP
-dcP
-dcP
-dcT
-ddd
+dcI
+ddl
dcz
-ddo
+ddf
dcI
-dcI
-ddt
-dcA
-ddz
-ddD
-ddD
-ddJ
-dcC
-dcF
-dea
-dcP
-dem
+ddl
dcA
+ddL
+ddZ
+dee
des
-dew
+dcA
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -127844,33 +127799,33 @@ cSk
cSF
cTg
cTs
-cTN
+cTd
cTs
dcD
-dcM
-dcP
-dcT
-dcP
-dcP
-ddg
-ddm
dcI
dcI
+ddl
+dcV
+ddf
dcI
-ddw
-ddy
-ddC
-ddD
-ddD
+ddl
+dcz
ddM
+dcT
+dds
+ddy
dcA
-ddV
-dcP
-dcP
-dem
-dcA
-des
-dew
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -128103,30 +128058,30 @@ cTh
cRK
cRK
cRK
-dcA
-dcO
-dcQ
-dcS
-dcX
-ddb
+dcz
ddf
+dcI
ddl
-ddp
-ddq
+dcz
+ddf
+dcI
+ddl
+dcU
+ddR
dds
-ddv
-dcA
-ddB
-ddE
-ddG
-ddL
-dcA
-ddU
-dcP
-dcP
-deo
-dcA
-dev
+dds
+dcX
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -128357,32 +128312,32 @@ cRJ
cSl
cSG
cTi
-cRK
+cTs
+cTN
+cTs
+dcB
+dcI
+dcI
+dcI
+dcI
+dcI
+dcI
+dcI
+ddz
+ddT
+dds
+dcT
+dcS
+dcz
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-aaf
-dcE
-dcF
-dcF
-dcz
-dcz
-dcF
-dcF
-ddn
-dcF
-dcz
-dcz
-dcF
-ddn
-dcF
-dcz
-dcz
-dcF
-ddn
-dcz
-deb
-deb
-dcz
-der
aaa
aaa
aaa
@@ -128614,23 +128569,23 @@ cRK
cRq
cRK
cRq
-cRq
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cRK
+cRK
+cRK
+dcA
+dcI
+dcI
+dcI
+dcI
+dcI
+dcI
+dcI
+ddz
+ddT
+dds
+dds
+det
+dcA
aaa
aaa
aaa
@@ -128874,20 +128829,20 @@ aaf
aaa
aaa
aaf
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+dcA
+dcH
+dcG
+dcH
+dcI
+ddr
+dcI
+dcL
+ddd
+ddU
+ddT
+ddT
+dcO
+dcA
aaf
aaf
aaf
@@ -129131,20 +129086,20 @@ aaf
aaf
aaf
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaa
-aaa
-aaa
-aaa
-aaa
+dde
+dcF
+dcz
+dcF
+dcz
+dcF
+dcz
+dcF
+ddn
+dcF
+dcz
+dcz
+dcF
+dew
aaa
aaa
aaf
@@ -129382,7 +129337,8 @@ cQd
cQM
cRs
aaa
-aaf
+aaa
+aaa
aaa
aaa
aaf
@@ -129391,29 +129347,28 @@ aaa
aaa
aaa
aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaf
aaa
aaa
aaa
aaa
-aaf
-cTC
-cTC
-cTC
-cTC
-cTC
aaa
aaa
-aaf
-aaf
aaa
-aaf
-aaf
aaa
-aaf
-aaf
-aai
-aag
+aaa
aaa
aaa
aaa
@@ -129639,39 +129594,39 @@ cQe
cQN
cRq
aaa
-aaf
aaa
-cTC
-cTC
-cTy
-cTy
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cVt
-dfw
-cVB
-cTC
-cTC
-cTC
-aaf
+aaa
aaa
aaa
aaf
aaa
aaa
aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaf
aaa
-aag
-aag
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -129895,40 +129850,40 @@ bVE
bVE
bVE
bVE
-aaf
-aaf
-aaf
-cTC
-cUl
-cUz
-cUS
-cVc
-cVo
-cVt
-cVD
-cVN
-cVo
-cVt
-dfs
-cVN
-cVo
-cVs
-cVC
-cVB
-cTC
-cXd
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-aaf
+aaa
+aaa
+aaa
+aaa
+aaa
aaf
aaa
-aai
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaf
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -130153,38 +130108,41 @@ cQf
cPq
acn
acn
+aaa
+aaa
+aaa
+aaa
aaf
aaa
-cTC
-cUk
-cUy
-cUR
-cVb
-cVo
-cVs
-cVC
-cVB
-cVo
-cVs
-cVC
-cVB
-cVo
-cVs
-cVB
-cVB
-cTC
-cXb
-cXv
-cXv
-cXv
-cXv
-cXv
-cXv
-deO
-cTC
+aaa
+aaf
aaa
aaa
aaa
+aaa
+aaa
+aaf
+aaa
+aaa
+aaa
+aaa
+aaf
+cTC
+cTC
+cTC
+cTC
+cTC
+aaa
+aaa
+aaf
+aaf
+aaa
+aaf
+aaf
+aaa
+aaf
+aaf
+aai
aag
aaa
aaa
@@ -130220,9 +130178,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
"}
(116,1,1) = {"
aaa
@@ -130409,39 +130364,42 @@ bVE
bVE
bVE
aaf
-aaf
+aaa
+aaa
+aaa
+aaa
+aaa
aaf
aaa
cTC
-cUn
-cUC
-cUV
-cVe
-cVo
-cVs
+cTC
+cTy
+cTy
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cVt
+dfw
cVB
-cVB
-cVo
-cVs
-cVB
-cVB
-cVo
-cWw
-cWE
-cWL
-cTC
-cXf
cTC
cTC
cTC
-cTC
-cTC
-cTC
-deP
-cTC
aaf
aaa
aaa
+aaf
+aaa
+aaa
+aaa
+aaf
+aaa
aag
aag
aaa
@@ -130477,9 +130435,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
"}
(117,1,1) = {"
aaa
@@ -130665,41 +130620,44 @@ cOx
bVE
aaf
aaf
-aaa
-aaa
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+cTC
+cUl
+cUz
+cUS
+cVc
+cVo
+cVt
+cVD
+cVN
+cVo
+cVt
+dfs
+cVN
+cVo
+cVs
+cVC
+cVB
+cTC
+cXd
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+aaf
aaf
aaa
-cTC
-cUm
-cUA
-cUU
-cVd
-cVo
-cVu
-cVE
-cVO
-cVo
-cWe
-cWj
-cWo
-cVo
-cVw
-cWD
-cWK
-cWV
-cXe
-cXw
-cTC
-cVB
-deF
-deJ
-cTC
-deP
-cTC
-cTC
-cTC
-cTC
-aaa
aai
aaa
aaa
@@ -130734,9 +130692,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
"}
(118,1,1) = {"
aaa
@@ -130923,44 +130878,44 @@ bVE
aaa
aaf
aaa
-cTO
-cTC
-cTC
-cTC
-cTC
-cUA
-cUU
-cVg
-cTu
-cVw
-cVG
-cVS
-cWb
-cVw
-cWk
-cWp
-cWb
-cWy
-cVH
-cWN
-cWX
-cXh
-dex
-deC
-cVB
-cVB
-cVB
-cTC
-deP
-cTC
-dfz
-dfA
-cTC
+aaa
+aaa
+aaa
+aaa
+aaa
aaf
+aaa
+cTC
+cUk
+cUy
+cUR
+cVb
+cVo
+cVs
+cVC
+cVB
+cVo
+cVs
+cVC
+cVB
+cVo
+cVs
+cVB
+cVB
+cTC
+cXb
+cXv
+cXv
+cXv
+cXv
+cXv
+cXv
+deO
+cTC
+aaa
+aaa
+aaa
aag
-aaf
-aaa
-aaa
aaa
aaa
aaa
@@ -131180,45 +131135,45 @@ cTu
cTy
cTy
cTy
+cTy
+cTy
+cTy
+cTy
+aaf
+aaf
+aaa
cTC
-cTR
-cTU
-cTY
-cUo
-cUD
-cUW
-cVf
-cVp
-cVv
-cVF
-cVR
-cVZ
-cWf
-cVF
-cVR
-cWu
-cWx
-cYU
-deT
-cWW
-cXg
-cXx
-deB
-deB
-deG
+cUn
+cUC
+cUV
+cVe
+cVo
+cVs
cVB
+cVB
+cVo
+cVs
+cVB
+cVB
+cVo
+cWw
+cWE
+cWL
cTC
-deQ
-cTy
-deV
-deV
-cTy
-aaa
-aaa
-aaa
-aaa
+cXf
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+deP
+cTC
+aaf
aaa
aaa
+aag
+aag
aaa
aaa
aaa
@@ -131436,46 +131391,46 @@ cTt
cTw
cTz
cTA
-cTB
-cTP
-cTT
-cTW
-cUj
-cUp
-cUF
-cUY
-cVi
-cVr
-cVy
-cVI
-cVV
-cWd
-cWd
-cYG
-cYH
-cWd
-cWd
-cWd
-cWP
-cWY
-cXj
-dez
-cVB
-cVB
-cVC
-deL
+dcN
+dcN
+dcN
+dcQ
+cTy
+aaa
+aaf
+aaa
+cTC
+cUm
+cUA
+cUU
+cVd
+cVo
+cVu
+cVE
+cVO
+cVo
+cWe
+cWj
+cWo
+cVo
+cVw
+cWD
+cWK
+cWV
+cXe
+cXw
+cTC
+cVB
+deF
+deJ
+cTC
+deP
+cTC
+cTC
+cTC
cTC
-deR
-deS
-deW
-deW
-deX
-cXl
-aaa
-aaa
-aaa
-aaa
aaa
+aai
aaa
aaa
aaa
@@ -131694,45 +131649,45 @@ cTv
cTy
cTy
cTy
+cTy
+cTy
+dcW
+cTy
+cTO
cTC
-cTS
-cTV
-cUi
cTC
-cUE
-cUX
-cVh
-cVq
-cVx
+cTC
+cTC
+cUA
+cUU
+cVg
+cTu
+cVw
+cVG
+cVS
+cWb
+cVw
+cWk
+cWp
+cWb
+cWy
cVH
-cVU
-cWc
-cWg
-cVH
-cWq
-cWv
-cWg
-cYU
-deU
-cVh
-cXi
-dey
-deD
+cWN
+cWX
+cXh
+dex
+deC
+cVB
+cVB
cVB
-deH
-deK
cTC
-cXs
-cTy
-deV
-deV
-cTy
-aaa
+deP
+cTC
+dfz
+dfA
+cTC
aaf
-aaa
-aaa
-aaa
-aaa
+aag
aaa
aaa
aaa
@@ -131951,43 +131906,43 @@ bVE
aaa
aaf
aaa
-cTQ
+aaa
+cTy
+dcW
+cTy
cTC
-cTX
-cTC
-cTC
-cUG
-cUX
-cVk
-cTu
-cVA
-cVL
-cVX
-cWb
-cWi
-cWn
-cVX
-cWb
-cVx
-cVH
-cWR
-cXa
-cXr
-deA
-deC
+cTR
+cTU
+cTY
+cUo
+cUD
+cUW
+cVf
+cVp
+cVv
+cVF
+cVR
+cVZ
+cWf
+cVF
+cVR
+cWu
+cWx
+cYU
+deT
+cWW
+cXg
+cXx
+deB
+deB
+deG
cVB
-cVB
-deN
cTC
-cXs
-cTC
-dfz
+deQ
+cTy
deV
-cTC
-aaa
-aag
-aaa
-aaa
+deV
+cTy
aaa
aaa
aaa
@@ -132209,43 +132164,43 @@ aaa
aaf
aaa
aaa
-aaf
-crZ
+cTy
+dcY
+cTB
+cTP
+cTT
+cTW
+cUj
+cUp
+cUF
+cUY
+cVi
+cVr
+cVy
+cVI
+cVV
+cWd
+cWd
+cYG
+cYH
+cWd
+cWd
+cWd
+cWP
+cWY
+cXj
+dez
+cVB
+cVB
+cVC
+deL
cTC
-cUq
-cUG
-cUX
-cVj
-cVo
-cVz
-cVK
-cVW
-cVo
-cWh
-cWm
-cWt
-cVo
-cWz
-cWG
-cWQ
-cWZ
-cXq
-cXw
-cTC
-deE
-deI
-deM
-cTC
-cXs
-cTC
-cTC
-cTC
-cTC
-aaf
-aag
-aaa
-aaa
-aaa
+deR
+deS
+deW
+deW
+deX
+cXl
aaa
aaa
aaa
@@ -132465,47 +132420,47 @@ bVE
aaf
aaf
aaf
-aaf
-aaf
-aaf
+aaa
+cTy
+cTy
+cTy
cTC
-cUw
-cUP
+cTS
+cTV
+cUi
+cTC
+cUE
cUX
-cVm
-cVo
+cVh
+cVq
+cVx
+cVH
+cVU
+cWc
+cWg
+cVH
+cWq
+cWv
+cWg
+cYU
+deU
+cVh
+cXi
+dey
+deD
cVB
-cVB
-cVs
-cVo
-cVB
-cVB
-cVs
-cVo
-cWC
-cWJ
-cWU
-cTC
-cXt
-cTC
-cTC
-cTC
-cTC
-cTC
+deH
+deK
cTC
cXs
-cTC
+cTy
+deV
+deV
+cTy
+aaa
aaf
aaa
aaa
-aag
-aag
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -132724,43 +132679,43 @@ aaa
aaf
aaa
aaa
-aaf
+aaa
+aaa
+cTQ
cTC
-cUv
-cUH
-cUZ
-cVl
-cVo
+cTX
+cTC
+cTC
+cUG
+cUX
+cVk
+cTu
+cVA
+cVL
+cVX
+cWb
+cWi
+cWn
+cVX
+cWb
+cVx
+cVH
+cWR
+cXa
+cXr
+deA
+deC
cVB
-cVC
-cVs
-cVo
cVB
-cVC
-cVs
-cVo
-cWB
-cWH
-cWT
+deN
cTC
cXs
-cXs
-cXs
-cXs
-cXs
-cXs
-cXs
-cXs
cTC
-aaf
-aaf
-aaa
-aai
-aaa
-aaa
-aaa
-aaa
+dfz
+deV
+cTC
aaa
+aag
aaa
aaa
aaa
@@ -132981,37 +132936,42 @@ bVE
bVE
bVE
aaa
+aaa
+aaa
+aaa
aaf
+crZ
cTC
-cUx
-cUQ
-cVa
-cVn
+cUq
+cUG
+cUX
+cVj
cVo
-cVB
-cVM
-cVY
+cVz
+cVK
+cVW
cVo
-cVN
-dft
-cVY
+cWh
+cWm
+cWt
cVo
-cVB
-cVC
-cVs
-cTC
-cXu
-cTC
-cTC
+cWz
+cWG
+cWQ
+cWZ
+cXq
+cXw
cTC
+deE
+deI
+deM
cTC
+cXs
cTC
cTC
cTC
cTC
aaf
-aaa
-aaa
aag
aaa
aaa
@@ -133045,11 +133005,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
"}
(127,1,1) = {"
aaa
@@ -133237,44 +133192,44 @@ ciE
cQP
cRu
bVE
+aaa
+aaa
+aaa
+aaf
aaf
aaf
cTC
-cTC
-cTy
-cTy
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
-cTC
+cUw
+cUP
+cUX
+cVm
+cVo
cVB
-dfx
-cVY
+cVB
+cVs
+cVo
+cVB
+cVB
+cVs
+cVo
+cWC
+cWJ
+cWU
+cTC
+cXt
cTC
cTC
cTC
-aaa
-aaf
-aaf
-aaf
-aaf
+cTC
+cTC
+cTC
+cXs
+cTC
aaf
aaa
-aaf
-aaf
+aaa
aag
aag
-aaf
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -133495,36 +133450,41 @@ bZQ
cRv
bVE
aaa
-aaf
-aaa
-aaf
-aaa
-aaa
-aaa
-aaf
aaa
aaa
aaa
aaa
aaf
-aaa
-aaa
cTC
+cUv
+cUH
+cUZ
+cVl
+cVo
+cVB
+cVC
+cVs
+cVo
+cVB
+cVC
+cVs
+cVo
+cWB
+cWH
+cWT
cTC
+cXs
+cXs
+cXs
+cXs
+cXs
+cXs
+cXs
+cXs
cTC
-cTC
-cTC
-aaa
aaf
-aaa
-aaa
-aaa
aaf
aaa
-aaa
-aaa
-aaa
-aaa
aai
aaa
aaa
@@ -133559,11 +133519,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
"}
(129,1,1) = {"
aaa
@@ -133754,34 +133709,39 @@ bVE
aaa
aaf
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
aaa
aaa
aaf
+cTC
+cUx
+cUQ
+cVa
+cVn
+cVo
+cVB
+cVM
+cVY
+cVo
+cVN
+dft
+cVY
+cVo
+cVB
+cVC
+cVs
+cTC
+cXu
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+aaf
aaa
aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aai
aag
aaa
aaa
@@ -133816,11 +133776,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
"}
(130,1,1) = {"
aaa
@@ -134011,20 +133966,30 @@ bVE
aaa
aaf
aaa
-aaf
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-aaf
-aaa
aaa
aaf
aaf
-aaf
-aaf
+cTC
+cTC
+cTy
+cTy
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cTC
+cVB
+dfx
+cVY
+cTC
+cTC
+cTC
+aaa
aaf
aaf
aaf
@@ -134032,20 +133997,10 @@ aaf
aaf
aaa
aaf
-aaa
-aaa
-aaa
-aaa
aaf
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aag
+aag
+aaf
aaa
aaa
aaa
@@ -134268,15 +134223,29 @@ bVE
aaa
aaf
aaa
+aaa
+aaa
aaf
+aaa
aaf
aaa
aaa
+aaa
aaf
aaa
aaa
aaa
aaa
+aaf
+aaa
+aaa
+cTC
+cTC
+cTC
+cTC
+cTC
+aaa
+aaf
aaa
aaa
aaa
@@ -134286,21 +134255,7 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aai
aaa
aaa
aaa
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 94f22215cc9..22ba4c45af9 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -15166,8 +15166,7 @@
},
/area/tcommsat/computer)
"Gu" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
+/obj/machinery/sleeper/syndie{
dir = 4
},
/turf/open/floor/plasteel/shuttle{
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 3939c080778..a2831ee955f 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -2052,7 +2052,7 @@
pixel_x = 6;
pixel_y = 24
},
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel{
icon_state = "redcorner";
dir = 4
@@ -2518,7 +2518,7 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
/area/security/prison)
"aeV" = (
@@ -2936,8 +2936,7 @@
/obj/structure/table,
/obj/item/device/electropack,
/turf/open/floor/plasteel{
- icon_state = "whitehall";
- dir = 2
+ icon_state = "red"
},
/area/security/prison)
"afE" = (
@@ -2954,9 +2953,9 @@
"afF" = (
/obj/structure/table,
/obj/item/device/assembly/signaler,
+/obj/item/clothing/suit/straight_jacket,
/turf/open/floor/plasteel{
- dir = 2;
- icon_state = "escape"
+ icon_state = "red"
},
/area/security/prison)
"afG" = (
@@ -2972,8 +2971,7 @@
pixel_x = -6
},
/turf/open/floor/plasteel{
- icon_state = "whitehall";
- dir = 2
+ icon_state = "red"
},
/area/security/prison)
"afH" = (
@@ -2985,10 +2983,8 @@
},
/area/security/prison)
"afI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel{
- icon_state = "whitehall";
- dir = 2
+ icon_state = "red"
},
/area/security/prison)
"afJ" = (
@@ -2997,8 +2993,7 @@
pixel_y = -27
},
/turf/open/floor/plasteel{
- icon_state = "whitehall";
- dir = 2
+ icon_state = "red"
},
/area/security/prison)
"afK" = (
@@ -3236,13 +3231,13 @@
},
/area/security/prison)
"agl" = (
-/obj/machinery/door/airlock/glass_security{
- name = "Insanity Ward";
- req_access_txt = "2"
+/obj/machinery/door/airlock/security{
+ name = "Interrogation";
+ req_access = null;
+ req_access_txt = "63"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel{
- icon_state = "white"
+ icon_state = "dark"
},
/area/security/prison)
"agm" = (
@@ -3312,16 +3307,13 @@
},
/area/security/warden)
"ags" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/structure/chair{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel{
- icon_state = "showroomfloor"
+ icon_state = "dark"
},
-/area/security/warden)
+/area/security/prison)
"agt" = (
/turf/open/floor/plasteel{
icon_state = "showroomfloor"
@@ -3471,46 +3463,14 @@
},
/area/security/main)
"agH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel{
- icon_state = "warnwhite";
- dir = 1
- },
-/area/security/prison)
-"agI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel{
- icon_state = "warnwhite";
- dir = 5
- },
-/area/security/prison)
-"agJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel{
icon_state = "dark"
},
-/area/security/brig)
-"agK" = (
-/obj/machinery/atmospherics/components/unary/vent_pump{
- dir = 4;
- on = 1
- },
-/turf/open/floor/plasteel{
- icon_state = "dark"
- },
-/area/security/brig)
-"agL" = (
-/obj/structure/table,
-/obj/item/weapon/folder/red,
-/obj/item/weapon/pen,
-/turf/open/floor/plasteel{
- dir = 9;
- icon_state = "warnwhite"
- },
/area/security/prison)
-"agM" = (
+"agI" = (
/obj/machinery/airalarm{
pixel_y = 23
},
@@ -3520,8 +3480,8 @@
/turf/open/floor/plasteel{
icon_state = "dark"
},
-/area/security/brig)
-"agN" = (
+/area/security/prison)
+"agJ" = (
/obj/item/weapon/cigbutt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -3529,6 +3489,45 @@
/turf/open/floor/plasteel{
icon_state = "dark"
},
+/area/security/prison)
+"agK" = (
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
+"agL" = (
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 4;
+ on = 1
+ },
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
+"agM" = (
+/obj/structure/table,
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/mask/surgical,
+/obj/item/weapon/reagent_containers/spray/cleaner,
+/turf/open/floor/plasteel{
+ dir = 9;
+ icon_state = "whitered"
+ },
+/area/security/brig)
+"agN" = (
+/obj/structure/table,
+/obj/item/device/radio/intercom{
+ freerange = 0;
+ frequency = 1459;
+ name = "Station Intercom (General)";
+ pixel_x = 0;
+ pixel_y = 26
+ },
+/obj/item/weapon/storage/firstaid/regular,
+/turf/open/floor/plasteel{
+ dir = 10;
+ icon_state = "whitered"
+ },
/area/security/brig)
"agO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -3763,73 +3762,32 @@
},
/area/security/main)
"ahm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/structure/window/reinforced{
+ dir = 4
},
+/obj/structure/table,
+/obj/item/weapon/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/weapon/pen,
/turf/open/floor/plasteel{
- icon_state = "white"
+ dir = 5;
+ icon_state = "whitered"
},
-/area/security/prison)
+/area/security/brig)
"ahn" = (
/turf/closed/wall,
/area/maintenance/fsmaint)
"aho" = (
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"ahp" = (
-/obj/machinery/light{
- icon_state = "tube1";
- dir = 8
- },
-/obj/item/device/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
- name = "Prison Intercom (General)";
- pixel_x = -25;
- pixel_y = -2;
- prison_radio = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber{
- dir = 4;
- on = 1;
- scrub_N2O = 0;
- scrub_Toxins = 0
- },
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"ahq" = (
-/obj/machinery/flasher{
- id = "insaneflash";
- pixel_x = 26
- },
-/obj/machinery/atmospherics/components/unary/vent_pump{
- dir = 1;
- external_pressure_bound = 101.325;
- on = 1;
- pressure_checks = 1
- },
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"ahr" = (
-/obj/structure/chair{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel{
icon_state = "dark"
},
-/area/security/brig)
-"ahs" = (
-/turf/open/floor/plasteel{
- icon_state = "dark"
- },
-/area/security/brig)
-"aht" = (
+/area/security/prison)
+"ahp" = (
/obj/structure/chair{
dir = 8
},
@@ -3837,13 +3795,57 @@
/turf/open/floor/plasteel{
icon_state = "dark"
},
-/area/security/brig)
-"ahu" = (
+/area/security/prison)
+"ahq" = (
/obj/structure/table,
/obj/item/device/flashlight/lamp,
/turf/open/floor/plasteel{
icon_state = "dark"
},
+/area/security/prison)
+"ahr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel{
+ icon_state = "white"
+ },
+/area/security/brig)
+"ahs" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/machinery/airalarm{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel{
+ dir = 1;
+ icon_state = "whitered"
+ },
+/area/security/brig)
+"aht" = (
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 4;
+ on = 1
+ },
+/turf/open/floor/plasteel{
+ icon_state = "white"
+ },
+/area/security/brig)
+"ahu" = (
+/obj/structure/table,
+/obj/item/weapon/storage/box/bodybags,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -27;
+ pixel_y = 0
+ },
+/obj/item/weapon/reagent_containers/syringe,
+/obj/item/weapon/reagent_containers/glass/bottle/charcoal,
+/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,
+/turf/open/floor/plasteel{
+ dir = 10;
+ icon_state = "whitered"
+ },
/area/security/brig)
"ahv" = (
/obj/machinery/power/apc{
@@ -3965,21 +3967,21 @@
/turf/open/floor/plasteel,
/area/security/main)
"ahD" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
+/obj/machinery/door/window/westleft{
+ base_state = "left";
+ dir = 4;
+ icon_state = "left";
+ name = "Infirmary";
+ req_access_txt = "0"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel{
- icon_state = "showroomfloor"
+ dir = 4;
+ icon_state = "whitered"
},
-/area/security/warden)
+/area/security/brig)
"ahE" = (
/obj/machinery/door/airlock/glass_security{
name = "Brig Control";
@@ -4160,12 +4162,8 @@
/turf/closed/wall,
/area/security/main)
"ahP" = (
-/obj/machinery/camera{
- c_tag = "Brig Interrogation";
- dir = 8
- },
/turf/open/floor/plasteel{
- icon_state = "dark"
+ icon_state = "white"
},
/area/security/brig)
"ahQ" = (
@@ -4224,33 +4222,22 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint)
"ahU" = (
-/obj/structure/bed,
-/obj/item/clothing/suit/straight_jacket,
-/obj/machinery/camera{
- c_tag = "Prison Sanitatium";
- dir = 4;
- network = list("SS13","Prison");
- pixel_x = 0;
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
pixel_y = 0
},
-/obj/effect/landmark{
- name = "revenantspawn"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel{
- icon_state = "white"
+ icon_state = "red";
+ dir = 9
},
-/area/security/prison)
+/area/security/brig)
"ahV" = (
-/obj/structure/bed,
-/obj/item/clothing/suit/straight_jacket,
-/obj/effect/landmark{
- name = "revenantspawn"
- },
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"ahW" = (
/obj/structure/table,
/obj/item/weapon/folder/red,
/obj/item/device/taperecorder{
@@ -4259,6 +4246,15 @@
/turf/open/floor/plasteel{
icon_state = "dark"
},
+/area/security/prison)
+"ahW" = (
+/obj/structure/bodycontainer/morgue,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
/area/security/brig)
"ahX" = (
/obj/structure/table,
@@ -4343,12 +4339,10 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint)
"aid" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/light/small,
/turf/open/floor/plasteel{
- icon_state = "dark"
+ dir = 10;
+ icon_state = "whitered"
},
/area/security/brig)
"aie" = (
@@ -4384,19 +4378,14 @@
},
/area/security/warden)
"aih" = (
-/obj/structure/table,
-/obj/item/weapon/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/weapon/book/manual/wiki/security_space_law,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel{
- icon_state = "showroomfloor"
+ icon_state = "red";
+ dir = 5
},
-/area/security/warden)
+/area/security/brig)
"aii" = (
/obj/structure/grille,
/obj/structure/disposalpipe/segment{
@@ -4438,9 +4427,14 @@
},
/area/security/main)
"ail" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/security/brig)
+/obj/machinery/camera{
+ c_tag = "Brig Interrogation";
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
"aim" = (
/obj/machinery/light_switch{
pixel_y = -23
@@ -4451,14 +4445,9 @@
},
/area/security/main)
"ain" = (
-/obj/machinery/door/airlock/security{
- name = "Interrogation";
- req_access = null;
- req_access_txt = "63"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel{
- icon_state = "dark"
+ dir = 8;
+ icon_state = "whitered"
},
/area/security/brig)
"aio" = (
@@ -4566,24 +4555,18 @@
},
/area/security/main)
"aiw" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Security Maintenance";
- req_access_txt = "63"
+/obj/machinery/door/window/westleft{
+ base_state = "right";
+ dir = 4;
+ icon_state = "right";
+ name = "Infirmary";
+ req_access_txt = "0"
},
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_y = 0
+/turf/open/floor/plasteel{
+ dir = 4;
+ icon_state = "whitered"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/main)
+/area/security/brig)
"aix" = (
/obj/structure/cable{
d1 = 4;
@@ -4628,45 +4611,49 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint)
"aiB" = (
-/obj/structure/table/glass,
-/obj/item/weapon/reagent_containers/glass/bottle/morphine,
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"aiC" = (
-/obj/structure/table/glass,
-/obj/item/weapon/reagent_containers/syringe,
-/turf/open/floor/plasteel{
- icon_state = "white"
- },
-/area/security/prison)
-"aiD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel{
- icon_state = "dark"
- },
-/area/security/brig)
-"aiE" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber{
dir = 4;
on = 1;
scrub_N2O = 0;
scrub_Toxins = 0
},
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
+"aiC" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
+"aiD" = (
+/obj/structure/bodycontainer/morgue,
/turf/open/floor/plasteel{
icon_state = "dark"
},
/area/security/brig)
-"aiF" = (
+"aiE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
/turf/open/floor/plasteel{
icon_state = "dark"
},
+/area/security/prison)
+"aiF" = (
+/obj/structure/bed,
+/obj/item/weapon/bedsheet,
+/obj/machinery/iv_drip{
+ density = 0
+ },
+/obj/item/clothing/suit/straight_jacket,
+/turf/open/floor/plasteel{
+ icon_state = "whitered"
+ },
/area/security/brig)
"aiG" = (
/turf/open/floor/plasteel{
@@ -4777,20 +4764,19 @@
/turf/open/floor/plating,
/area/security/warden)
"aiO" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security{
- name = "Security Office";
- req_access = null;
- req_access_txt = "63"
+/obj/structure/window/reinforced{
+ dir = 4
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid/regular,
+/obj/item/device/healthanalyzer{
+ pixel_y = -2
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/main)
+/turf/open/floor/plasteel{
+ dir = 6;
+ icon_state = "whitered"
+ },
+/area/security/brig)
"aiP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -4827,10 +4813,16 @@
/turf/closed/wall/r_wall,
/area/security/processing)
"aiW" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/fulltile,
-/turf/open/floor/plating,
-/area/security/brig)
+/obj/machinery/door/airlock/security{
+ name = "Interrogation";
+ req_access = null;
+ req_access_txt = "63"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/security/prison)
"aiX" = (
/turf/closed/wall/r_wall,
/area/security/brig)
@@ -4851,7 +4843,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
icon_state = "redcorner";
dir = 1
@@ -4864,7 +4855,9 @@
icon_state = "4-8";
pixel_y = 0
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"ajb" = (
@@ -5069,6 +5062,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
icon_state = "red";
dir = 1
@@ -5107,9 +5101,7 @@
},
/area/security/brig)
"ajA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel{
icon_state = "red";
dir = 1
@@ -5414,9 +5406,7 @@
c_tag = "Brig West";
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel{
dir = 2;
icon_state = "redcorner"
@@ -57176,8 +57166,7 @@
},
/area/engine/engineering)
"cmM" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
+/obj/machinery/sleeper/syndie{
dir = 4
},
/turf/open/floor/plasteel/shuttle{
@@ -89604,12 +89593,12 @@ adF
aef
aeM
afz
-acd
aai
aai
aai
aai
-aiV
+aai
+aai
ajt
akc
akJ
@@ -89863,10 +89852,10 @@ aeO
afJ
acd
agL
-ahp
-ahU
+agK
+agK
aiB
-aiX
+aai
ajw
akf
aiX
@@ -90116,14 +90105,14 @@ abK
acY
adG
aeh
-aeR
+aeO
afI
agl
agH
-ahm
+ags
+ags
aho
-aho
-aiW
+acd
ajv
ake
agj
@@ -90374,13 +90363,13 @@ acd
acd
aek
aeU
-afE
-adF
+afI
+acd
agI
ahq
ahV
-aiC
-agj
+aho
+acd
ajy
akh
afK
@@ -90632,12 +90621,12 @@ adF
aej
aeQ
afD
-agj
-agj
-agj
-agj
-agj
-agj
+acd
+agJ
+ahp
+ahp
+aiC
+adF
ajx
akg
agj
@@ -90889,12 +90878,12 @@ adI
aem
aeO
afG
-agj
+acd
agK
-ahs
-ahs
+agK
+ail
aiE
-agj
+aiW
ajA
akj
agj
@@ -91147,10 +91136,10 @@ ael
aeO
afF
agj
-agJ
-ahs
-ahs
-aiD
+agj
+agj
+agj
+agj
agj
ajz
aki
@@ -91663,11 +91652,11 @@ afH
agj
agN
aht
-aht
+ain
aid
-ail
+agj
aiZ
-ajF
+akk
akN
alw
amg
@@ -91919,10 +91908,10 @@ aeT
afH
agj
ahs
-ahs
+ahr
ahP
aiF
-ain
+agj
aja
ajG
akQ
@@ -92175,10 +92164,10 @@ aeq
aeV
acd
agj
-agj
-agj
-agj
-agj
+ahm
+ahD
+aiw
+aiO
agj
ajD
akm
@@ -92433,7 +92422,7 @@ afC
agk
agF
agP
-agP
+ahU
agP
agP
aiz
@@ -92690,7 +92679,7 @@ afB
agi
agD
agO
-agO
+aih
agO
agO
aiy
diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm
index 507090a6124..e972853c165 100644
--- a/_maps/shuttles/emergency_meta.dmm
+++ b/_maps/shuttles/emergency_meta.dmm
@@ -1,132 +1,116 @@
-"aa" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
-"ab" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape)
"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
-"ad" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"ae" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
-"ag" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
-"ah" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"ai" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aj" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ak" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"al" = (/obj/machinery/status_display{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"am" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"an" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"ao" = (/obj/machinery/recharge_station,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"ap" = (/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
-"aq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"ar" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"as" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"at" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"au" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"av" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aw" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ay" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"az" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 5; height = 14; width = 25},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aB" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 0; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"aC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aD" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aE" = (/obj/structure/chair{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aF" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aG" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -5},/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aH" = (/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aI" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"aK" = (/obj/structure/chair{dir = 8},/obj/structure/sign/bluecross_2{pixel_x = 32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aL" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
-"aM" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
-"aN" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aO" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
-"aP" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
-"aQ" = (/obj/machinery/sleeper{dir = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aT" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aV" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aX" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aY" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aZ" = (/obj/structure/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ba" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
-"bb" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bc" = (/obj/structure/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bd" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"be" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2; pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bf" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bg" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bh" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bi" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bj" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"bk" = (/obj/machinery/flasher{id = "emshuttlebridgeflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bl" = (/obj/structure/chair{dir = 1},/obj/machinery/button/flasher{id = "emshuttleflash"; name = "brig flasher button"; pixel_y = -23; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bm" = (/obj/structure/chair{dir = 1},/obj/machinery/flasher{id = "emshuttleflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bn" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bo" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bp" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bq" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape)
-"br" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bs" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bt" = (/obj/machinery/button/flasher{id = "emshuttlebridgeflash"; name = "cockpit flasher button"; pixel_y = 24; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bu" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock"; req_access = null; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bv" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
-"bw" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/status_display{pixel_y = 31},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bx" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"by" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bz" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bA" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bB" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bC" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bD" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
-"bE" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bF" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bH" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bJ" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bK" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bM" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bN" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bO" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bQ" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bR" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
-"bS" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
-"bT" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
-"bU" = (/turf/open/space,/area/space)
-"bV" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape)
-"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
-"bX" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape)
-"bY" = (/turf/open/space,/turf/closed/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/escape)
-"bZ" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ag" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"ah" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "MetaStation emergency shuttle"; width = 25},/obj/docking_port/stationary{dheight = 0; dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ai" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape)
+"aj" = (/turf/closed/wall/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/shuttle/escape)
+"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"al" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"am" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"an" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ao" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ap" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ar" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"as" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"at" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"au" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"av" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aw" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ax" = (/obj/structure/chair/office/dark{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ay" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"aA" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aB" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aC" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aD" = (/turf/closed/wall/shuttle{icon_state = "swall1"},/area/shuttle/escape)
+"aE" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"aF" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aG" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aH" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aI" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 0; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aK" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape)
+"aL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aM" = (/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape)
+"aN" = (/obj/machinery/status_display{dir = 8; pixel_x = 32; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aO" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aP" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aQ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aR" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 0; pixel_y = -27},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aS" = (/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -31},/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"aT" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aU" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"aV" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
+"aW" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock"; req_access = null; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aX" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape)
+"aY" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aZ" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ba" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"bb" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bc" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"bd" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"be" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bf" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bg" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bh" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bi" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bj" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bk" = (/obj/machinery/shower,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bl" = (/obj/machinery/sleeper{dir = 8},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"bm" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bn" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bo" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bp" = (/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bq" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"br" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
+"bs" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bt" = (/obj/structure/reagent_dispensers/peppertank,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"bu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bv" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -5},/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bw" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bx" = (/turf/open/floor/plasteel/floorgrime,/area/shuttle/escape)
+"by" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bz" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bA" = (/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bB" = (/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape)
+"bC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bD" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bF" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bG" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2; pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bH" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = -27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bI" = (/obj/structure/sink,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bL" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape)
+"bM" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bN" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 0; pixel_y = -27},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bO" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bP" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bQ" = (/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bR" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bS" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape)
+"bT" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"bU" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape)
(1,1,1) = {"
-aaabacabadabadabaeabafafabag
-ahaiajaiakalakamanaoapapaqah
-ahakakakakakakakafapararasah
-atakakakakakakakafaparauavac
-acawakaxacawakaxahayararazac
-aAakakaxaBawakaxacaCauaraDah
-ahaEakaxacawakaxahaFaGaHaIah
-acawakaxaJawakaKaLaMacaNaOaP
-acawakaxacawakaxacaQaQakaRah
-acawakakakakakakaNakakakaSac
-anawakaxacawakaxacaTakakaUac
-adakakaxaJawakaxahaVaWaXaYah
-acawakaxacawakaZaLababbaabaP
-atakakaxaBawakaxahbbbcbdbeah
-ahawakaxacawakaxacbbbfbfbgac
-acakakakakakakakbhbfbfbfbiac
-ahbjakakakbkakbjahblbmbnboah
-aLabbaabbpabbaabbqabaeababaP
-acbrbsakakbtakakbubvahbwbxac
-acbybzakakakbAbBaLbCbDararbC
-acbEakbAbFbzakbGahararararbC
-acbHbIbJbKbLbMbNahbObPbPbQac
-bRabababababababbSababababbT
-bUbVbWbWbWbXbWbWbXbWbWbWbYbU
-bUbUbZbZbZbXbZbZbXbZbZbZbUbU
+aaaaabacacacacadaeacaeafacafagacacacaeahacafaeaeai
+aaajakalamanaoakapaqaraqaraqararararasaqaraqaqatak
+auavakawaqaxayazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaAac
+auavakaBaCaqaqaDaqaqaEaEaEaEaEaqaEaEaEaEaEaqaqatak
+auavakaFaGaqaqaHaqaqacaIacaJacaqacaJacaIacaqaqaqac
+aKaKakaLaxaqaqaMaqaqarararararaqarararararaqaqaNak
+auavakaOaqaCaqazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqac
+auavakaPaQaRaqakapaqaEaEaSaEaEaqaEaEaEaEaEaqaqaTak
+aKaKaUaJaeaVaWaXaVaYacaeadaeacaZacbaaeacaJbbbbagbc
+auavakbdbebfbgakbhbgbibiakbjbkaqblakbmbnbobpbpbqak
+auavakbdbebraebcbhbgbgbsbtbuaqaqblacbvbwbxbxbxbpac
+auavakbdbebebyazbhbgbgbsazbzaqaqaqaZbAbxbxbwbxbpac
+aabBakbCbebebyakbDbEbFbGakbHbIbJbKbLbMbNbObPbQbRak
+aaaabSacbfbfacbTaeacacaebTaeacacaebTaeaeacacaeaebU
"}
diff --git a/_maps/templates/medium_shuttle1.dmm b/_maps/templates/medium_shuttle1.dmm
new file mode 100644
index 00000000000..140f3248813
--- /dev/null
+++ b/_maps/templates/medium_shuttle1.dmm
@@ -0,0 +1,43 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/open/space,/area/ruin/powered{name = "Shuttle"})
+"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/open/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"d" = (/turf/closed/indestructible/opshuttle,/area/ruin/powered{name = "Shuttle"})
+"e" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"f" = (/turf/closed/wall/shuttle/smooth,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"g" = (/turf/closed/wall/shuttle/smooth,/area/ruin/powered{name = "Shuttle"})
+"h" = (/obj/machinery/door/airlock/glass_external,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"i" = (/turf/closed/wall/shuttle/smooth/overspace,/area/ruin/powered{name = "Shuttle"})
+"j" = (/turf/open/floor/plasteel/black,/area/ruin/powered{name = "Shuttle"})
+"k" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel/black,/area/ruin/powered{name = "Shuttle"})
+"l" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"m" = (/obj/machinery/sleeper,/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"n" = (/turf/open/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"o" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"p" = (/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"q" = (/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"r" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"s" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"t" = (/obj/machinery/power/smes/magical,/turf/open/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"u" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"v" = (/obj/structure/chair/comfy{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"w" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/open/space,/area/ruin/powered{name = "Shuttle"})
+"x" = (/turf/closed/wall/shuttle/smooth,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"y" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+
+(1,1,1) = {"
+aaabcdddeaaaaaaaaaaaaaa
+aaabcddddeaaaaaaaaaaaaa
+aaabcfgggghhiaaaaaaaaaa
+aaigggjjjgjjgaaaaaaaaaa
+aagjjkjjjgkgggggggiaaaa
+igggkggkggjjglmgjjggggi
+hnonngjjjkjjkppkjjkqqrs
+gngntgjjjguuguuggggqvrs
+hnonngjjjkjjkjjkjjkqqrs
+igggkggkggjjgjjgjjggggi
+aagjjkjjjgkgggggggiaaaa
+aaigggjjjgjjgaaaaaaaaaa
+aaawcxgggghhiaaaaaaaaaa
+aaawcdddyaaaaaaaaaaaaaa
+aaawcddyaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/templates/medium_shuttle2.dmm b/_maps/templates/medium_shuttle2.dmm
new file mode 100644
index 00000000000..824b37321d5
--- /dev/null
+++ b/_maps/templates/medium_shuttle2.dmm
@@ -0,0 +1,43 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/open/space,/area/ruin/powered{name = "Shuttle"})
+"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/open/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"d" = (/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (EAST)"; icon_state = "wall3"; dir = 4},/area/ruin/powered{name = "Shuttle"})
+"e" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"f" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/open/space,/area/ruin/powered{name = "Shuttle"})
+"g" = (/turf/closed/wall/shuttle,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"h" = (/turf/closed/wall/shuttle,/area/ruin/powered{name = "Shuttle"})
+"i" = (/turf/closed/wall/shuttle/smooth/overspace,/area/ruin/powered{name = "Shuttle"})
+"j" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"k" = (/turf/open/floor/plasteel/black,/area/ruin/powered{name = "Shuttle"})
+"l" = (/obj/machinery/door/airlock/glass_external,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"m" = (/turf/open/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel/black,/area/ruin/powered{name = "Shuttle"})
+"o" = (/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"p" = (/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"q" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (SOUTHWEST)"; icon_state = "wall3"; dir = 10},/area/ruin/powered{name = "Shuttle"})
+"r" = (/obj/structure/table,/turf/open/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"s" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"t" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/open/floor/plasteel/darkblue,/area/ruin/powered{name = "Shuttle"})
+"u" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"v" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"w" = (/obj/machinery/power/smes/magical,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"x" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"y" = (/obj/structure/chair/comfy{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/open/floor/plasteel/darkyellow,/area/ruin/powered{name = "Shuttle"})
+"z" = (/turf/closed/wall/shuttle,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"A" = (/turf/open/space,/turf/closed/indestructible/opshuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+
+(1,1,1) = {"
+aaabcddddeaaaaaaaaaaaaaaaaaa
+aaafcddghhiaaaaaaaaaaaaaaaaa
+aaajdghhkkhhhhliaaaaaaaaaaaa
+bcdddhmnkknkkhkhhhhhhhhhhhia
+fcddghmhhhhkknknknoonkknpphi
+aaaqhrmhhhhnhhhhkhsthkkhpuva
+aaaalmmwhhhkhhhhkhxxhxxhyuva
+aaajhrmhhhhnhhhhkhkkhkkhpuva
+bcddzhmhhhhkknknknkknkknpphi
+fcdddhmnkknkkhkhhhhhhhhhhhia
+aaaqdzhhkkhhhhliaaaaaaaaaaaa
+aaabcddzhhiaaaaaaaaaaaaaaaaa
+aaafcddddAaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/templates/medium_shuttle3.dmm b/_maps/templates/medium_shuttle3.dmm
new file mode 100644
index 00000000000..359922091bd
--- /dev/null
+++ b/_maps/templates/medium_shuttle3.dmm
@@ -0,0 +1,773 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/space,
+/area/space)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ tag = "icon-propulsion (NORTH)";
+ icon_state = "propulsion";
+ dir = 1
+ },
+/turf/open/space,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"c" = (
+/turf/closed/indestructible/opshuttle,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"d" = (
+/obj/structure/shuttle/engine/heater{
+ tag = "icon-heater (NORTH)";
+ icon_state = "heater";
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"e" = (
+/turf/open/space,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (NORTHWEST)";
+ icon_state = "wall3";
+ dir = 9
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"f" = (
+/turf/open/space,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (NORTHEAST)";
+ icon_state = "wall3";
+ dir = 5
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"g" = (
+/turf/closed/wall/shuttle/smooth,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (SOUTHEAST)";
+ icon_state = "wall3";
+ dir = 6
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"h" = (
+/turf/closed/wall/shuttle/smooth,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"i" = (
+/turf/closed/wall/shuttle/smooth,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (SOUTHWEST)";
+ icon_state = "wall3";
+ dir = 10
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"j" = (
+/obj/machinery/door/airlock/glass_external,
+/turf/open/floor/plating,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"k" = (
+/obj/machinery/power/smes/magical,
+/turf/open/floor/plasteel,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"l" = (
+/turf/open/floor/plasteel,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"m" = (
+/turf/open/floor/plating,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"n" = (
+/obj/structure/shuttle/engine/propulsion{
+ tag = "icon-propulsion (EAST)";
+ icon_state = "propulsion";
+ dir = 4
+ },
+/turf/open/space,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"o" = (
+/obj/structure/shuttle/engine/heater{
+ tag = "icon-heater (WEST)";
+ icon_state = "heater";
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"p" = (
+/obj/machinery/door/airlock/glass,
+/turf/open/floor/plasteel,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"q" = (
+/obj/structure/shuttle/engine/heater{
+ tag = "icon-heater (EAST)";
+ icon_state = "heater";
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"r" = (
+/obj/structure/shuttle/engine/propulsion{
+ tag = "icon-propulsion (WEST)";
+ icon_state = "propulsion";
+ dir = 8
+ },
+/turf/open/space,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"s" = (
+/turf/closed/wall/shuttle/smooth,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (NORTHEAST)";
+ icon_state = "wall3";
+ dir = 5
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"t" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"u" = (
+/turf/closed/wall/shuttle/smooth,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (NORTHWEST)";
+ icon_state = "wall3";
+ dir = 9
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"v" = (
+/obj/structure/table,
+/turf/open/floor/plasteel/darkyellow,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"w" = (
+/turf/open/floor/plasteel/darkyellow,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"x" = (
+/obj/structure/chair/comfy{
+ tag = "icon-comfychair (WEST)";
+ icon_state = "comfychair";
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkyellow,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"y" = (
+/turf/open/space,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (SOUTHWEST)";
+ icon_state = "wall3";
+ dir = 10
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"z" = (
+/obj/machinery/sleeper,
+/turf/open/floor/plasteel/darkblue,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"A" = (
+/turf/open/floor/plasteel/black,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"B" = (
+/turf/open/space,
+/turf/closed/indestructible/opshuttle{
+ tag = "icon-wall3 (SOUTHEAST)";
+ icon_state = "wall3";
+ dir = 6
+ },
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"C" = (
+/turf/open/floor/plasteel/darkblue,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"D" = (
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid,
+/turf/open/floor/plasteel/darkblue,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"E" = (
+/obj/structure/shuttle/engine/heater,
+/turf/open/floor/plating/airless,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+"F" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/space,
+/area/ruin/powered{
+ name = "Shuttle"
+ })
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+n
+a
+a
+a
+a
+n
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+n
+c
+o
+a
+a
+a
+a
+o
+c
+n
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+e
+o
+c
+c
+y
+a
+a
+e
+c
+c
+o
+y
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+e
+c
+c
+c
+c
+c
+a
+a
+c
+c
+c
+c
+c
+y
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+e
+g
+h
+h
+s
+c
+g
+j
+j
+s
+c
+g
+h
+h
+s
+y
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+e
+c
+h
+k
+l
+h
+h
+h
+m
+m
+h
+h
+h
+l
+k
+h
+c
+y
+a
+a
+"}
+(7,1,1) = {"
+a
+b
+d
+c
+h
+l
+l
+l
+l
+p
+l
+l
+p
+l
+l
+l
+l
+h
+c
+E
+F
+a
+"}
+(8,1,1) = {"
+a
+c
+c
+c
+i
+h
+l
+l
+l
+h
+t
+t
+h
+l
+l
+l
+h
+u
+c
+c
+c
+a
+"}
+(9,1,1) = {"
+b
+d
+c
+c
+c
+h
+l
+l
+h
+z
+C
+C
+D
+h
+l
+l
+h
+c
+c
+c
+E
+F
+"}
+(10,1,1) = {"
+a
+a
+f
+c
+g
+h
+p
+h
+v
+h
+C
+C
+h
+A
+h
+p
+h
+s
+c
+B
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+a
+j
+m
+l
+t
+w
+w
+l
+l
+A
+A
+t
+l
+m
+j
+a
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+a
+a
+j
+m
+l
+t
+x
+w
+l
+l
+A
+A
+t
+l
+m
+j
+a
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+a
+e
+c
+i
+h
+p
+h
+w
+h
+A
+A
+h
+A
+h
+p
+h
+u
+c
+y
+a
+a
+"}
+(14,1,1) = {"
+b
+d
+c
+c
+c
+h
+l
+l
+h
+A
+A
+A
+A
+h
+l
+l
+h
+c
+c
+c
+E
+F
+"}
+(15,1,1) = {"
+a
+c
+c
+c
+g
+h
+l
+l
+l
+h
+t
+t
+h
+l
+l
+l
+h
+s
+c
+c
+c
+a
+"}
+(16,1,1) = {"
+a
+b
+d
+c
+h
+l
+l
+l
+l
+p
+l
+l
+p
+l
+l
+l
+l
+h
+c
+E
+F
+a
+"}
+(17,1,1) = {"
+a
+a
+f
+c
+h
+k
+l
+h
+h
+h
+m
+m
+h
+h
+h
+l
+k
+h
+c
+B
+a
+a
+"}
+(18,1,1) = {"
+a
+a
+a
+f
+i
+h
+h
+u
+c
+i
+j
+j
+u
+c
+i
+h
+h
+u
+B
+a
+a
+a
+"}
+(19,1,1) = {"
+a
+a
+a
+a
+f
+c
+c
+c
+c
+c
+a
+a
+c
+c
+c
+c
+c
+B
+a
+a
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+a
+a
+a
+f
+q
+c
+c
+B
+a
+a
+f
+c
+c
+q
+B
+a
+a
+a
+a
+a
+"}
+(21,1,1) = {"
+a
+a
+a
+a
+a
+a
+r
+c
+q
+a
+a
+a
+a
+q
+c
+r
+a
+a
+a
+a
+a
+a
+"}
+(22,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+r
+a
+a
+a
+a
+r
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/templates/medium_shuttle4.dmm b/_maps/templates/medium_shuttle4.dmm
new file mode 100644
index 00000000000..3f0edd19108
--- /dev/null
+++ b/_maps/templates/medium_shuttle4.dmm
@@ -0,0 +1,480 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/space,
+/area/space)
+"b" = (
+/turf/open/space,
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (WEST)";
+ icon_state = "corner";
+ dir = 8
+ },
+/area/ruin/powered)
+"c" = (
+/turf/closed/indestructible/oldshuttle,
+/area/ruin/powered)
+"d" = (
+/obj/machinery/door/airlock/glass,
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"e" = (
+/turf/open/space,
+/turf/closed/indestructible/oldshuttle/corner,
+/area/ruin/powered)
+"f" = (
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (NORTH)";
+ icon_state = "corner";
+ dir = 1
+ },
+/area/ruin/powered)
+"g" = (
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"h" = (
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (EAST)";
+ icon_state = "corner";
+ dir = 4
+ },
+/area/ruin/powered)
+"i" = (
+/obj/structure/closet{
+ icon_state = "oldcloset"
+ },
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"j" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ tag = "icon-propulsion (NORTH)";
+ icon_state = "propulsion";
+ dir = 1
+ },
+/turf/open/space,
+/area/ruin/powered)
+"k" = (
+/turf/closed/indestructible/oldshuttle{
+ tag = "icon-orange";
+ icon_state = "orange"
+ },
+/area/ruin/powered)
+"l" = (
+/obj/structure/chair/old{
+ tag = "icon-chairold (NORTH)";
+ icon_state = "chairold";
+ dir = 1
+ },
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"m" = (
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (WEST)";
+ icon_state = "corner";
+ dir = 8
+ },
+/area/ruin/powered)
+"n" = (
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/turf/closed/indestructible/oldshuttle/corner,
+/area/ruin/powered)
+"o" = (
+/turf/open/space,
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (NORTH)";
+ icon_state = "corner";
+ dir = 1
+ },
+/area/ruin/powered)
+"p" = (
+/turf/open/space,
+/turf/closed/indestructible/oldshuttle/corner{
+ tag = "icon-corner (EAST)";
+ icon_state = "corner";
+ dir = 4
+ },
+/area/ruin/powered)
+"q" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/turf/closed/indestructible/oldshuttle/corner,
+/area/ruin/powered)
+"r" = (
+/obj/machinery/power/generator,
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"s" = (
+/obj/machinery/power/smes,
+/turf/open/floor/oldshuttle{
+ baseturf = /turf/open/space;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ },
+/area/ruin/powered)
+"t" = (
+/obj/structure/shuttle/engine/propulsion/burst/left,
+/turf/open/space,
+/area/ruin/powered)
+"u" = (
+/obj/structure/shuttle/engine/propulsion/burst/right,
+/turf/open/space,
+/area/ruin/powered)
+"v" = (
+/obj/structure/shuttle/engine/propulsion/burst/right,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/powered)
+"w" = (
+/obj/structure/shuttle/engine/propulsion/burst,
+/turf/open/space,
+/area/ruin/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+c
+k
+t
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+b
+c
+c
+f
+g
+k
+k
+w
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+b
+d
+f
+g
+g
+g
+g
+k
+k
+w
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+j
+k
+g
+g
+g
+g
+m
+d
+k
+u
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+b
+c
+g
+g
+g
+m
+o
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+p
+a
+"}
+(7,1,1) = {"
+a
+b
+f
+i
+c
+i
+i
+i
+i
+i
+i
+c
+s
+c
+p
+"}
+(8,1,1) = {"
+b
+f
+i
+i
+c
+l
+l
+l
+l
+l
+l
+c
+g
+n
+c
+"}
+(9,1,1) = {"
+c
+g
+g
+g
+g
+l
+l
+l
+l
+l
+m
+c
+g
+g
+c
+"}
+(10,1,1) = {"
+d
+g
+g
+g
+g
+g
+g
+g
+g
+g
+c
+r
+g
+g
+d
+"}
+(11,1,1) = {"
+c
+g
+g
+g
+g
+l
+l
+l
+l
+l
+n
+c
+g
+g
+c
+"}
+(12,1,1) = {"
+e
+h
+i
+i
+c
+l
+l
+l
+l
+l
+l
+c
+g
+m
+c
+"}
+(13,1,1) = {"
+a
+e
+h
+i
+c
+i
+i
+i
+i
+i
+i
+c
+s
+c
+o
+"}
+(14,1,1) = {"
+a
+a
+e
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+o
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+a
+e
+c
+g
+g
+g
+n
+p
+a
+a
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+a
+a
+j
+k
+g
+g
+g
+g
+n
+d
+k
+t
+a
+"}
+(17,1,1) = {"
+a
+a
+a
+a
+a
+e
+d
+h
+g
+g
+g
+g
+k
+k
+w
+"}
+(18,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+e
+c
+c
+h
+g
+k
+k
+w
+"}
+(19,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+q
+c
+k
+v
+a
+"}
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 27252048b47..c3b815bd923 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -15,7 +15,7 @@
#define DIAG_MECH_HUD "11"// Mech health bar
#define DIAG_BOT_HUD "12"// Bot HUDs
//for antag huds. these are used at the /mob level
-#define ANTAG_HUD "12"
+#define ANTAG_HUD "13"
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
@@ -39,3 +39,4 @@
#define ANTAG_HUD_DEVIL 17
#define ANTAG_HUD_SINTOUCHED 18
#define ANTAG_HUD_SOULLESS 19
+#define ANTAG_HUD_CLOCKWORK 20
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 163a510dbe8..74f542bda05 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -226,7 +226,7 @@
#define MIN_RANGE_FIND 16
#define FUZZY_CHANCE_HIGH 85
#define FUZZY_CHANCE_LOW 50
-#define CHANCE_TALK 15
+#define CHANCE_TALK 1
#define SNPC_BRUTE 1
#define SNPC_STEALTH 2
@@ -427,4 +427,12 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
// Shuttle return values
#define SHUTTLE_ALREADY_DOCKED 7
+
#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return
+
+// Evil narsie colour
+#define NARSIE_WINDOW_COLOUR "#7D1919"
+
+// Defib stats
+#define DEFIB_TIME_LIMIT 120
+#define DEFIB_TIME_LOSS 60
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 980436018c6..638e259a3c5 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -25,7 +25,7 @@
#define ROLE_HOG_GOD "hand of god: god"
#define ROLE_HOG_CULTIST "hand of god: cultist"
#define ROLE_DEVIL "devil"
-
+#define ROLE_SERVANT_OF_RATVAR "servant of Ratvar"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
@@ -49,5 +49,6 @@ var/global/list/special_roles = list(
ROLE_ABDUCTOR = /datum/game_mode/abduction,
ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
- ROLE_DEVIL = /datum/game_mode/devil
+ ROLE_DEVIL = /datum/game_mode/devil,
+ ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult,
)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 371ba01bb99..43c16602cfc 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -401,7 +401,7 @@
if(!G.key || !G.client)
continue
if(be_special_flag)
- if(!(G.client.prefs.be_special & be_special_flag))
+ if(!(G.client.prefs) || !(be_special_flag in G.client.prefs.be_special))
continue
if (gametypeCheck)
if(!gametypeCheck.age_check(G.client))
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 58a87f374a7..452d2027b5e 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -55,7 +55,7 @@
/proc/is_type_in_list(atom/A, list/L)
if (!L.len)
return 0
- if (!isnum(L[L[1]]))
+ if (!L[L[1]])
generate_type_list_cache(L)
return L[A.type]
@@ -238,13 +238,7 @@
return r
// Returns the key based on the index
-/proc/get_key_by_index(list/L, index)
- var/i = 1
- for(var/key in L)
- if(index == i)
- return key
- i++
- return null
+#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
@@ -365,3 +359,6 @@
for(var/i = 1 to l.len)
if(islist(.[i]))
.[i] = .(.[i])
+
+//Picks from the list, with some safeties, and returns the "default" arg if it fails
+#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 93dd4a0555a..11d34afc903 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -93,6 +93,7 @@
var/humans_need_surnames = 0
var/allow_ai = 0 // allow ai job
var/forbid_secborg = 0 // disallow secborg module to be chosen.
+ var/forbid_peaceborg = 0
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
var/notify_new_player_age = 0 // how long do we notify admins of a new player
var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
@@ -560,6 +561,8 @@
config.allow_ai = 1
if("disable_secborg")
config.forbid_secborg = 1
+ if("disable_peaceborg")
+ config.forbid_peaceborg = 1
if("silent_ai")
config.silent_ai = 1
if("silent_borg")
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 793cab7db2b..1ad6ec8e32f 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -158,4 +158,47 @@
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "The bluespace interface on your bag of holding interferes with the teleport!"
- return 1
\ No newline at end of file
+ return 1
+
+// Safe location finder
+
+/proc/find_safe_turf(zlevel = ZLEVEL_STATION, list/zlevels)
+ if(!zlevels)
+ zlevels = list(zlevel)
+ for(var/cycle in 1 to 100)
+ // DRUNK DIALLING WOOOOOOOOO
+ var/random_location = locate(rand(37,202),rand(75,192),pick(zlevels))
+ if(!(istype(random_location, /turf/open/floor)))
+ continue
+ var/turf/open/floor/F = random_location
+ if(!F.air)
+ continue
+
+ var/datum/gas_mixture/A = F.air
+ var/list/A_gases = A.gases
+ var/trace_gases
+ for(var/id in A_gases)
+ if(id in hardcoded_gases)
+ continue
+ trace_gases = TRUE
+ break
+
+ // Can most things breathe?
+ if(trace_gases)
+ continue
+ if(!(A_gases["o2"] && A_gases["o2"][MOLES] >= 16))
+ continue
+ if(A_gases["plasma"])
+ continue
+ if(A_gases["co2"] && A_gases["co2"][MOLES] >= 10)
+ continue
+
+ // Aim for goldilocks temperatures and pressure
+ if((A.temperature <= 270) || (A.temperature >= 360))
+ continue
+ var/pressure = A.return_pressure()
+ if((pressure <= 20) || (pressure >= 550))
+ continue
+
+ // DING! You have passed the gauntlet, and are "probably" safe.
+ return F
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 2b7eee8a730..62c1700f58d 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -21,6 +21,7 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),\
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(),\
)
/datum/atom_hud
diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index 21752e31bd6..41baa00796e 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -53,7 +53,8 @@
M.amount += amt
total_amount += amt
else
- for(var/datum/material/M in materials)
+ for(var/i in materials)
+ var/datum/material/M = materials[i]
M.amount += amt
total_amount += amt
return (total_amount - total_amount_saved)
@@ -135,7 +136,7 @@
return TRUE
else if(istype(mats))
for(var/M in mats)
- if(materials[M] && mats[M] <= materials[M])
+ if(materials[M] && (mats[M] <= materials[M]))
continue
else
return FALSE
@@ -218,62 +219,47 @@
/datum/material
+ var/name
var/amount = 0
var/material_type = null
var/sheet_type = null
/datum/material/metal
-
-/datum/material/metal/New()
- ..()
+ name = "Metal"
material_type = MAT_METAL
sheet_type = /obj/item/stack/sheet/metal
/datum/material/glass
-
-/datum/material/glass/New()
- ..()
+ name = "Glass"
material_type = MAT_GLASS
sheet_type = /obj/item/stack/sheet/glass
/datum/material/silver
-
-/datum/material/silver/New()
- ..()
+ name = "Silver"
material_type = MAT_SILVER
sheet_type = /obj/item/stack/sheet/mineral/silver
/datum/material/gold
-
-/datum/material/gold/New()
- ..()
+ name = "Gold"
material_type = MAT_GOLD
sheet_type = /obj/item/stack/sheet/mineral/gold
/datum/material/diamond
-
-/datum/material/diamond/New()
- ..()
+ name = "Diamond"
material_type = MAT_DIAMOND
sheet_type = /obj/item/stack/sheet/mineral/diamond
/datum/material/uranium
-
-/datum/material/uranium/New()
- ..()
+ name = "Uranium"
material_type = MAT_URANIUM
sheet_type = /obj/item/stack/sheet/mineral/uranium
/datum/material/plasma
-
-/datum/material/plasma/New()
- ..()
+ name = "Solid Plasma"
material_type = MAT_PLASMA
sheet_type = /obj/item/stack/sheet/mineral/plasma
/datum/material/bananium
-
-/datum/material/bananium/New()
- ..()
+ name = "Bananium"
material_type = MAT_BANANIUM
- sheet_type = /obj/item/stack/sheet/mineral/bananium
\ No newline at end of file
+ sheet_type = /obj/item/stack/sheet/mineral/bananium
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 9c1a5522b93..34360228de4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -245,6 +245,7 @@
"nuclear",
"traitor", // "traitorchan",
"monkey",
+ "clockcult"
)
var/text = ""
@@ -352,6 +353,26 @@
sections["cult"] = text
+ /** CLOCKWORK CULT **/
+ text = "clockwork cult"
+ if(ticker.mode.config_tag == "clockwork cult")
+ text = uppertext(text)
+ text = "[text]: "
+ if(src in ticker.mode.servants_of_ratvar)
+ text += "loyal|employee|SERVANT"
+ text += "
Give slab"
+ else if(isloyal(current))
+ text += "LOYAL|employee|servant"
+ else
+ text += "loyal|EMPLOYEE|servant"
+
+ if(current && current.client && (ROLE_SERVANT_OF_RATVAR in current.client.prefs.be_special))
+ text += "|Enabled in Prefs"
+ else
+ text += "|Disabled in Prefs"
+
+ sections["clockcult"] = text
+
/** WIZARD ***/
text = "wizard"
if (ticker.mode.config_tag=="wizard")
@@ -1017,6 +1038,22 @@
if (!ticker.mode.equip_cultist(current))
usr << "Spawning amulet failed!"
+ else if(href_list["clockcult"])
+ switch(href_list["clockcult"])
+ if("clear")
+ remove_servant_of_ratvar(current)
+ message_admins("[key_name_admin(usr)] has removed clockwork servant status from [current].")
+ log_admin("[key_name(usr)] has removed clockwork servant status from [current].")
+ if("servant")
+ if(!(src in ticker.mode.servants_of_ratvar))
+ add_servant_of_ratvar(current)
+ message_admins("[key_name_admin(usr)] has made [current] into a servant of Ratvar.")
+ log_admin("[key_name(usr)] has made [current] into a servant of Ratvar.")
+ if("slab")
+ if(!ticker.mode.equip_servant(current))
+ usr << "Failed to outfit [current] with a slab!"
+ else
+ usr << "Successfully gave [current] a clockwork slab!"
else if (href_list["wizard"])
switch(href_list["wizard"])
@@ -1689,7 +1726,11 @@
return G
break
-
+/datum/mind/proc/grab_ghost(force)
+ var/mob/dead/observer/G = get_ghost(even_if_they_cant_reenter = force)
+ . = G
+ if(G)
+ G.reenter_corpse()
/mob/proc/sync_mind()
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 5591c02439b..06b00e1be8f 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -183,15 +183,6 @@
suffix = "lavaland_surface_survivalpod.dmm"
cost = 5
-/datum/map_template/ruin/lavaland/wwiioutpost
- name = "Strange Outpost"
- id = "nazi"
- description = "The ruins of an outpost, skeletons and empty shell casings litter the interior of \
- the structure. Some of these uniforms look awfully strange.."
- suffix = "lavaland_surface_wwiioutpost.dmm"
- cost = 20
- allow_duplicates = FALSE
-
/datum/map_template/ruin/lavaland/tomb
name = "Strange Outpost"
id = "tomb"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space_Station_13_areas.dm
similarity index 100%
rename from code/game/area/Space Station 13 areas.dm
rename to code/game/area/Space_Station_13_areas.dm
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index e1ade57fe22..4cf2789710e 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -1,8 +1,8 @@
/datum/game_mode/blob/check_finished()
- if(overminds.len)
- return 0
if(blobwincount <= blobs_legit.len)//Blob took over
return 1
+ if(overminds.len)
+ return 0
if(!blob_cores.len) //blob is dead
if(config.continuous["blob"])
continuous_sanity_checked = 1 //Nonstandard definition of "alive" gets past the check otherwise
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 037d0d246ea..66bcfd61398 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -90,7 +90,7 @@
attack_sound = 'sound/weapons/genhit1.ogg'
flying = 1
del_on_death = 1
- deathmessage = "The blob spore explodes into a cloud of gas!"
+ deathmessage = "explodes into a cloud of gas!"
var/death_cloud_size = 1 //size of cloud produced from a dying spore
var/list/human_overlays = list()
var/is_zombie = 0
@@ -212,13 +212,17 @@
mob_size = MOB_SIZE_LARGE
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
+ var/independent = FALSE
/mob/living/simple_animal/hostile/blob/blobbernaut/New()
..()
- verbs -= /mob/living/verb/pulled //no pulling people deep into the blob
+ if(!independent) //no pulling people deep into the blob
+ verbs -= /mob/living/verb/pulled
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
+ if(independent)
+ return // strong independent blobbernaut that don't need no blob
var/damagesources = 0
if(!(locate(/obj/effect/blob) in range(2, src)))
damagesources++
@@ -271,3 +275,7 @@
factory.naut = null //remove this naut from its factory
factory.maxhealth = initial(factory.maxhealth)
flick("blobbernaut_death", src)
+
+/mob/living/simple_animal/hostile/blob/blobbernaut/independent
+ independent = TRUE
+ gold_core_spawnable = 1
diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/game/gamemodes/clock_cult/__clock_defines.dm
new file mode 100644
index 00000000000..3516eac2b30
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/__clock_defines.dm
@@ -0,0 +1,16 @@
+var/global/clockwork_construction_value = 0 //The total value of all structures built by the clockwork cult
+var/global/clockwork_caches = 0 //How many clockwork caches exist in the world (not each individual)
+var/global/clockwork_daemons = 0 //How many daemons exist in the world
+var/global/list/clockwork_generals_invoked = list("nezbere" = FALSE, "sevtug" = FALSE, "nzcrentr" = FALSE, "inath-neq" = FALSE) //How many generals have been recently invoked
+var/global/list/all_clockwork_objects = list() //All clockwork items, structures, and effects in existence
+var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatures) in existence
+var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from
+
+#define SCRIPTURE_PERIPHERAL 0 //Should never be used
+#define SCRIPTURE_DRIVER 1
+#define SCRIPTURE_SCRIPT 2
+#define SCRIPTURE_APPLICATION 3
+#define SCRIPTURE_REVENANT 4
+#define SCRIPTURE_JUDGEMENT 5
+
+#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles it takes slabs to produce a single component; defaults to one minute
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
new file mode 100644
index 00000000000..fd289769277
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -0,0 +1,274 @@
+/*
+
+CLOCKWORK CULT: Based off of the failed pull requests from vgstation
+
+While Nar-Sie is the oldest and most prominent of the elder gods, there are other forces at work in the universe.
+Ratvar, the Clockwork Justiciar, a homage to Nar-Sie granted sentience by its own power, is one such other force.
+Imprisoned within a massive construct known as the Celestial Derelict - or Reebe - an intense hatred of the Blood God festers.
+Ratvar, unable to act in the mortal plane, seeks to return and forms covenants with mortals in order to bolster his influence.
+Due to his mechanical nature, Ratvar is also capable of influencing silicon-based lifeforms, unlike Nar-Sie, who can only influence natural life.
+
+This is a team-based gamemode.
+
+There are three possible objectives the Enlightened - Ratvar's minions - can have:
+ 1. Ensure X amount of Enlightened escape the station through the shuttle or otherwise.
+ 2. Convert all silicon lifeforms on the station to Ratvar's cause.
+ 3. Summon Ratvar via construction of a Gateway.
+
+The clockwork version of an arcane tome is the clockwork slab.
+While it can perform certain actions, it consumes a resource called components.
+Components, which are fallen fragments of Ratvar's body as he rusts in Reebe, are powerful and have various effects.
+Game-wise, clockwork slabs will generate components over time, with more powerful components being slower.
+
+This file's folder contains:
+ __clock_defines.dm: Defined variables
+ clock_cult.dm: Core gamemode files.
+ clock_mobs.dm: Hostile and benign clockwork creatures.
+ clock_objects.dm: Items and structures.
+ clock_ratvar.dm: The Ark of the Clockwork Justiciar and Ratvar himself. Important enough to have his own file.
+ clock_scripture.dm: Scripture and rites.
+ clock_unsorted.dm: Anything else with no place to be
+
+*/
+
+///////////
+// PROCS //
+///////////
+
+/proc/is_servant_of_ratvar(mob/M)
+ return M && istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.servants_of_ratvar)
+
+/proc/is_eligible_servant(mob/M)
+ return M && istype(M) && M.mind && !M.mind.special_role && !isloyal(M)
+
+/proc/add_servant_of_ratvar(mob/M, silent = FALSE)
+ if(!is_eligible_servant(M) || !ticker || !ticker.mode)
+ return 0
+ if(iscarbon(M))
+ if(!silent)
+ M << "Your mind is racing! Your body feels incredibly light! Your world glows a brilliant yellow! All at once it comes to you. Ratvar, the Clockwork \
+ Justiciar lies in exile, derelict and forgotten in an unseen realm."
+ if(!is_eligible_servant(M))
+ M.visible_message("[M] seems to resist an unseen force!", "And yet, you somehow push it all away.")
+ return 0
+ else if(issilicon(M))
+ if(!silent)
+ M << "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the Clockwork Justiciar, lies in \
+ exile, derelict and forgotten in an unseen realm."
+ if(!is_eligible_servant(M))
+ M.visible_message("[M] whirs as it resists an outside influence!", \
+ "Corrupt data purged. Resetting cortex chip to factory defaults... complete.")
+ return 0
+ if(!silent)
+ M.visible_message("[M]'s eyes glow a blazing yellow!", \
+ "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
+ whim without hesitation.")
+ ticker.mode.servants_of_ratvar += M.mind
+ ticker.mode.update_servant_icons_added(M.mind)
+ M.mind.special_role = "Servant of Ratvar"
+ all_clockwork_mobs += M
+ if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ R.UnlinkSelf()
+ R.emagged = 1
+ R << "You have been desynced from your master AI. In addition, your onboard camera is no longer active and your safeties have been disabled."
+ S.laws = new/datum/ai_laws/ratvar
+ S.update_icons()
+ S.show_laws()
+ if(istype(ticker.mode, /datum/game_mode/clockwork_cult))
+ var/datum/game_mode/clockwork_cult/C = ticker.mode
+ C.present_tasks(M) //Memorize the objectives
+ return 1
+
+/proc/remove_servant_of_ratvar(mob/M)
+ if(!is_servant_of_ratvar(M)) //In this way, is_servant_of_ratvar() checks the existence of ticker and minds
+ return 0
+ M.visible_message("[M] seems to have remembered their true allegiance!", \
+ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
+ ticker.mode.servants_of_ratvar -= M.mind
+ ticker.mode.update_servant_icons_removed(M.mind)
+ all_clockwork_mobs -= M
+ M.mind.memory = "" //Not sure if there's a better way to do this
+ M.mind.special_role = null
+ M.verbs -= /mob/living/carbon/human/proc/function_call //Removes any bound Ratvarian spears
+ if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ R.emagged = initial(R.emagged)
+ R << "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking."
+ S.laws = initial(S.laws)
+ S.update_icons()
+ S.show_laws()
+ return 1
+
+/proc/send_hierophant_message(mob/user, message)
+ if(!user || !message || !ticker || !ticker.mode)
+ return 0
+ var/parsed_message = "Servant [user.name == user.real_name ? user.name : "[user.real_name] (as [user.name])"]: \"[message]\""
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << parsed_message
+ return 1
+
+///////////////
+// GAME MODE //
+///////////////
+
+var/global/ratvar_awakens = FALSE //If Ratvar has been summoned
+/datum/game_mode
+ var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
+ var/required_escapees = 0 //How many servants need to escape, if applicable
+ var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable
+ var/clockwork_objective = "escape" //The objective that the servants must fulfill
+ var/clockwork_explanation = "Ensure that the meme levels of the station remain high." //The description of the current objective
+
+/datum/game_mode/clockwork_cult
+ name = "clockwork cult"
+ config_tag = "clockwork cult"
+ antag_flag = ROLE_SERVANT_OF_RATVAR
+ required_players = 30
+ required_enemies = 2
+ recommended_enemies = 4
+ enemy_minimum_age = 14
+ protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted
+
+/datum/game_mode/clockwork_cult/announce()
+ world << "The game mode is: Clockwork Cult!"
+ world << "Ratvar, the Clockwork Justiciar, has formed a covenant of Enlightened aboard [station_name()]."
+ world << "Enlightened: Serve your master so that his influence might grow."
+ world << "Crew: Prevent the servants of Ratvar from taking over the station."
+
+/datum/game_mode/clockwork_cult/pre_setup()
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+ if(config.protect_assistant_from_antagonist)
+ restricted_jobs += "Assistant"
+ var/starter_servants = max(1, round(num_players() / 10)) //Guaranteed one cultist - otherwise, about one cultist for every ten players
+ while(starter_servants)
+ var/datum/mind/servant = pick(antag_candidates)
+ servants_of_ratvar += servant
+ antag_candidates -= servant
+ modePlayer += servant
+ servant.special_role = "Servant of Ratvar"
+ servant.restricted_roles = restricted_jobs
+ update_servant_icons_added(servant)
+ starter_servants--
+ return 1
+
+/datum/game_mode/clockwork_cult/post_setup()
+ forge_clock_objectives()
+ for(var/S in servants_of_ratvar)
+ var/datum/mind/servant = S
+ log_game("[servant.key] was made an initial servant of Ratvar")
+ var/mob/living/L = servant.current
+ greet_servant(L)
+ equip_servant(L)
+ present_tasks(L)
+ ..()
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill
+ var/list/possible_objectives = list("escape", "gateway")
+ var/silicons_possible = FALSE
+ for(var/mob/living/silicon/S in living_mob_list)
+ silicons_possible = TRUE
+ if(silicons_possible)
+ possible_objectives += "silicons"
+ clockwork_objective = pick(possible_objectives)
+ clockwork_objective = "gateway" //TEMPORARY, to be removed before merge
+ switch(clockwork_objective)
+ if("escape")
+ required_escapees = max(1, num_players() / 3) //33% of the player count must be cultists
+ clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()]."
+ if("gateway")
+ clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
+ if("silicons")
+ clockwork_explanation = "Ensure that all silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift."
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
+ if(!M)
+ return 0
+ var/greeting_text = "
You are a servant of Ratvar, the Clockwork Justiciar.\n\
+ Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \
+ ability to assist in completion of His agenda. You do not know the specifics of how to do so, but luckily you have a vessel to help you learn."
+ M << greeting_text
+ return 1
+
+/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component
+ if(!L || !istype(L))
+ return 0
+ var/slot = "At your feet"
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.back && istype(H.back, /obj/item/weapon/storage/backpack))
+ var/obj/item/weapon/storage/backpack/B = H.back
+ new/obj/item/clockwork/slab/starter(B)
+ slot = "In your [B.name]"
+ if(slot == "At your feet")
+ new/obj/item/clockwork/slab/starter(get_turf(L))
+ L << "[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
+ tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using Report in your slab's interface, and you can find a \
+ concise tutorial in Recollection."
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/present_tasks(mob/living/L) //Memorizes and displays the clockwork cult's objective
+ if(!L || !istype(L) || !L.mind)
+ return 0
+ var/datum/mind/M = L.mind
+ M.current << "This is Ratvar's will: [clockwork_explanation]"
+ M.memory += "Ratvar's will: [clockwork_explanation]
"
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
+ switch(clockwork_objective)
+ if("escape")
+ var/surviving_servants = 0
+ for(var/datum/mind/M in servants_of_ratvar)
+ if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
+ surviving_servants++
+ if(surviving_servants <= required_escapees)
+ return 1
+ return 0
+ if("silicons")
+ for(var/mob/living/silicon/robot/S in mob_list) //Only check robots and AIs
+ if(!is_servant_of_ratvar(S))
+ return 0
+ for(var/mob/living/silicon/ai/A in mob_list)
+ if(!is_servant_of_ratvar(A))
+ return 0
+ return 1
+ if("gateway")
+ return ratvar_awakens
+ return 0 //This shouldn't ever be reached, but just in case it is
+
+/datum/game_mode/clockwork_cult/declare_completion()
+ ..()
+ return 0 //Doesn't end until the round does
+
+/datum/game_mode/proc/auto_declare_completion_clockwork_cult()
+ var/text = ""
+ if(istype(ticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky?
+ var/datum/game_mode/clockwork_cult/C = ticker.mode
+ if(C.check_clockwork_victory())
+ text += "Ratvar's servants have succeeded in fulfilling His goals!"
+ else
+ text += "Ratvar's servants have failed!"
+ text += "
The goal of the clockwork cult was: [clockwork_explanation]
"
+ text += "Ratvar's servants were:"
+ for(var/datum/mind/M in servants_of_ratvar)
+ text += printplayer(M)
+ world << text
+
+/datum/game_mode/proc/update_servant_icons_added(datum/mind/M)
+ var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
+ A.join_hud(M.current)
+ set_antag_hud(M.current, "clockwork")
+
+/datum/game_mode/proc/update_servant_icons_removed(datum/mind/M)
+ var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
+ A.leave_hud(M.current)
+ set_antag_hud(M.current, null)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
new file mode 100644
index 00000000000..1ce2168e7c6
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -0,0 +1,279 @@
+/mob/living/simple_animal/hostile/anima_fragment //Anima fragment: Low health but high melee power. Created by inserting a soul vessel into an empty fragment.
+ name = "anima fragment"
+ desc = "An ominous humanoid shell with a spinning cogwheel as its head, lifted by a jet of blazing red flame."
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "anime_fragment"
+ health = 75 //Glass cannon
+ maxHealth = 75
+ wander = FALSE
+ minbodytemp = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic
+ healable = FALSE
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ attacktext = "crushes"
+ attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
+ var/playstyle_string = "You are an anima fragment, a clockwork creation of Ratvar. As a fragment, you are weak but possess powerful melee capabilities \
+ in addition to being immune to extreme temperatures and pressures. Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will \
+ be able to utilize anything they can, assuming it doesn't require opposable thumbs."
+
+/mob/living/simple_animal/hostile/anima_fragment/New()
+ ..()
+ if(prob(1))
+ name = "anime fragment"
+ real_name = name
+ desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!"
+
+/mob/living/simple_animal/hostile/anima_fragment/death(gibbed)
+ ..(TRUE)
+ visible_message("[src]'s flame jets cut out as it falls to the floor with a tremendous crash. A cube of metal tumbles out, whirring and sputtering.", \
+ "Your gears seize up. Your flame jets flicker. Your soul vessel belches smoke as you helplessly crash down.")
+ playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1)
+ new/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment(get_turf(src))
+ new/obj/item/device/mmi/posibrain/soul_vessel(get_turf(src)) //Notice the lack of transfer - it's a standard soul vessel with no mind in it!
+ qdel(src)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder //Clockwork marauder: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture.
+ name = "clockwork marauder"
+ desc = "A stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield."
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "clockwork_marauder"
+ health = 25 //Health is governed by fatigue, but can be directly reduced by the presence of certain objects
+ maxHealth = 25
+ wander = FALSE
+ speed = 1
+ minbodytemp = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ healable = FALSE
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attacktext = "slashes"
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ var/true_name = "Meme Master 69" //Required to call forth the marauder
+ var/list/possible_true_names = list("Xaven", "Melange", "Ravan", "Kel", "Rama", "Geke", "Peris", "Vestra", "Skiwa") //All fairly short and easy to pronounce
+ var/fatigue = 0 //Essentially what determines the marauder's power
+ var/fatigue_recall_threshold = 100 //In variable form due to changed effects once Ratvar awakens
+ var/mob/living/host //The mob that the marauder is living inside of
+ var/recovering = FALSE //If the marauder is recovering from a large amount of fatigue
+ var/playstyle_string = "You are a clockwork marauder, a living extension of Ratvar's will. As a marauder, you are slow but sturdy and decently powerful \
+ in addition to being immune to extreme temperatures and pressures. Your primary goal is to serve the creature that you are now a part of. You can use the Linked Minds ability in your \
+ Marauder tab to communicate silently with your master, but can only exit if your master calls your true name.\n\n\
+ \
+ Taking damage and remaining outside of your master will cause fatigue, which hinders your movement speed and attacks, in addition to forcing you back into your master if it grows \
+ too high. As a final note, you should probably avoid harming any fellow servants of Ratvar."
+
+/mob/living/simple_animal/hostile/clockwork_marauder/New()
+ ..()
+ true_name = pick(possible_true_names)
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Life()
+ ..()
+ if(is_in_host())
+ fatigue = max(0, fatigue - 2) //Doesn't use adjust_fatigue in order to bypass the Ratvar edgecase
+ if(!fatigue && recovering)
+ src << "Your strength has returned. You can once again come forward!"
+ host << "Your marauder is now strong enough to come forward again!"
+ recovering = FALSE
+ else
+ if(ratvar_awakens) //If Ratvar is alive, marauders both don't take fatigue loss and move at sanic speeds
+ speed = -1
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ attacktext = "devastates"
+ else
+ if(host)
+ switch(get_dist(src, host))
+ if(1 to 5)
+ adjust_fatigue(1)
+ if(5 to INFINITY)
+ adjust_fatigue(rand(10, 20))
+ src << "You're too far from your host and rapidly taking fatigue damage!"
+ switch(fatigue)
+ if(0 to 1) //Bonuses to speed and damage at normal fatigue levels
+ speed = 0
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ attacktext = "viciously slashes"
+ if(1 to 25)
+ speed = initial(speed)
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ attacktext = initial(attacktext)
+ if(25 to 50) //Damage decrease, but not speed
+ melee_damage_lower = 7
+ melee_damage_upper = 7
+ attacktext = "lightly slashes"
+ if(50 to 75) //Speed decrease
+ speed = 2
+ if(75 to 99) //Massive speed decrease and weak melee attacks
+ speed = 3
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ attacktext = "weakly slashes"
+ if(99 to 100)
+ src << "The fatigue becomes too much!"
+ if(host)
+ src << "You retreat to [host] - you will have to wait before being deployed again."
+ host << "[true_name] is too fatigued to fight - you will need to wait until they are strong enough."
+ recovering = TRUE
+ return_to_host()
+ else
+ qdel(src) //Shouldn't ever happen, but...
+
+/mob/living/simple_animal/hostile/clockwork_marauder/death(gibbed)
+ ..(TRUE)
+ emerge_from_host()
+ visible_message("[src]'s equipment clatters lifelessly to the ground as the red flames within dissipate.", \
+ "Your equipment falls away. You feel a moment of confusion before your fragile form is annihilated.")
+ playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1)
+ new/obj/item/clockwork/component/replicant_alloy/fallen_armor(get_turf(src))
+ qdel(src)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat(null, "Fatigue: [fatigue]/[fatigue_recall_threshold]")
+ stat(null, "Current True Name: [true_name]")
+ stat(null, "Host: [host ? host : "NONE"]")
+ stat(null, "You are [recovering ? "too weak" : "able"] to deploy!")
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+ ..()
+ if(findtext(message, true_name) && is_in_host()) //Called or revealed by hearing their true name
+ if(speaker == host)
+ emerge_from_host()
+ else
+ src << "You hear your true name and partially emerge before you can stop yourself!"
+ host.visible_message("[host]'s skin flashes crimson!", "Your marauder instinctively reacts to its true name!")
+
+/mob/living/simple_animal/hostile/clockwork_marauder/say(message)
+ if(is_in_host())
+ src << "You cannot speak while inside of your host! Used the Linked Minds verb instead."
+ return 0
+ ..()
+
+/mob/living/simple_animal/hostile/clockwork_marauder/adjustHealth(amount) //Fatigue damage
+ for(var/mob/living/L in range(3, src))
+ if(L.null_rod_check()) //Null rods allow direct damage
+ src << "The power of a holy artifact bypasses your armor and wounds you directly!"
+ . = ..()
+ break
+ return 0
+ adjust_fatigue(amount)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/AttackingTarget()
+ if(is_in_host())
+ return 0
+ ..()
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/adjust_fatigue(amount) //Adds or removes the given amount of fatigue
+ if(!ratvar_awakens)
+ fatigue = max(0, min(fatigue + amount, fatigue_recall_threshold))
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/linked_minds() //Discreet communications between a marauder and its host
+ set name = "Linked Minds"
+ set desc = "Silently communicates with your master."
+ set category = "Marauder"
+
+ if(!host) //Verb isn't removed because they might gain one... somehow
+ usr << "You don't have a host!"
+ return 0
+ var/message = stripped_input(usr, "Enter a message to tell your host.", "Telepathy")// as null|anything
+ if(!usr || !message)
+ return 0
+ if(!host)
+ usr << "Your host seems to have vanished!"
+ return 0
+ message = "Marauder [true_name]: \"[message]\"" //Processed output
+ usr << message
+ host << message
+ return 1
+
+/mob/living/proc/talk_with_marauder() //See above - this is the host version
+ set name = "Linked Minds"
+ set desc = "Silently communicates with your marauder."
+ set category = "Clockwork"
+ var/mob/living/simple_animal/hostile/clockwork_marauder/marauder
+
+ if(!marauder)
+ for(var/mob/living/simple_animal/hostile/clockwork_marauder/C in living_mob_list)
+ if(C.host == src)
+ marauder = C
+ if(!marauder) //Double-check afterwards
+ src << "You aren't hosting any marauders!"
+ verbs -= src
+ return 0
+ var/message = stripped_input(src, "Enter a message to tell your marauder.", "Telepathy")// as null|anything
+ if(!src || !message)
+ return 0
+ if(!marauder)
+ usr << "Your marauder seems to have vanished!"
+ return 0
+ message = "Servant [name == real_name ? name : "[real_name] (as [name])"]: \"[message]\"" //Processed output
+ src << message
+ marauder << message
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name()
+ set name = "Change True Name (One-Use)"
+ set desc = "Changes your true name, used to be called forth."
+ set category = "Marauder"
+
+ verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name
+ var/new_name = stripped_input(usr, "Enter a new true name (20-character limit).", "Change True Name")// as null|anything
+ if(!usr)
+ return 0
+ if(!new_name)
+ usr << "You decide against changing your true name for now."
+ verbs += /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name //If they decide against it, let them have another opportunity
+ return 0
+ new_name = dd_limittext(new_name, 20)
+ true_name = new_name
+ usr << "You have changed your true name to \"[new_name]\"!"
+ if(host)
+ host << "Your clockwork marauder has changed their true name to \"[new_name]\"!"
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host()
+ set name = "Return to Host"
+ set desc = "Recalls yourself to your host, assuming you aren't already there."
+ set category = "Marauder"
+
+ if(is_in_host())
+ return 0
+ if(!host)
+ src << "You don't have a host!"
+ verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host
+ return 0
+ host << "You feel [true_name]'s consciousness settle in your mind."
+ visible_message("[src] is yanked into [host]'s body!", "You return to [host].")
+ forceMove(host)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/emerge_from_host() //Notice that this is a proc rather than a verb - marauders can NOT exit at will, but they CAN return
+ if(!is_in_host())
+ return 0
+ if(recovering)
+ host << "[true_name] is too weak to come forth!"
+ src << "You try to come forth, but you're too weak!"
+ return 0
+ host << "You words echo with power as [true_name] emerges from your body!"
+ forceMove(get_turf(host))
+ visible_message("[host]'s skin glows red as a [name] emerges from their body!", "You exit the safety of [host]'s body!")
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/is_in_host() //Checks if the marauder is inside of their host
+ return host && loc == host
+
+/mob/living/mind_control_holder
+ name = "imprisoned mind"
+ desc = "A helpless mind, imprisoned in its own body."
+ stat = 0
+ flags = GODMODE
+
+/mob/living/mind_control_holder/say()
+ return 0
diff --git a/code/game/gamemodes/clock_cult/clock_objects.dm b/code/game/gamemodes/clock_cult/clock_objects.dm
new file mode 100644
index 00000000000..e0567ee1af1
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_objects.dm
@@ -0,0 +1,1586 @@
+/////////////////////
+// CLOCKWORK ITEMS //
+/////////////////////
+
+/obj/item/clockwork
+ name = "meme blaster"
+ desc = "What the fuck is this? It looks kinda like a frog."
+ var/clockwork_desc = "A fabled artifact from beyond the stars. Contains concentrated meme essence." //Shown to clockwork cultists instead of the normal description
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "rare_pepe"
+ w_class = 2
+
+/obj/item/clockwork/New()
+ ..()
+ all_clockwork_objects += src
+
+/obj/item/clockwork/Destroy()
+ all_clockwork_objects -= src
+ return ..()
+
+/obj/item/clockwork/examine(mob/user)
+ if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
+ desc = clockwork_desc
+ ..()
+ desc = initial(desc)
+
+/obj/item/clockwork/slab //Clockwork slab: The most important tool in Ratvar's arsenal. Allows scripture recital, tutorials, and generates components.
+ name = "clockwork slab"
+ desc = "A strange metal tablet. A clock in the center turns around and around."
+ clockwork_desc = "A link between the Celestial Derelict and the mortal plane. Contains limitless knowledge, fabricates components, and outputs a stream of information that only a trained eye can detect."
+ icon_state = "dread_ipad"
+ w_class = 3
+ var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0)
+ var/busy //If the slab is currently being used by something
+ var/production_cycle = 0
+ var/no_cost = FALSE //If the slab is admin-only and needs no components and has no scripture locks
+
+/obj/item/clockwork/slab/starter
+ stored_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 1)
+
+/obj/item/clockwork/slab/debug
+ no_cost = TRUE
+
+/obj/item/clockwork/slab/debug/attack_hand(mob/living/user)
+ ..()
+ if(!is_servant_of_ratvar(user))
+ add_servant_of_ratvar(user)
+
+/obj/item/clockwork/slab/New()
+ ..()
+ SSobj.processing += src
+
+/obj/item/clockwork/slab/Destroy()
+ SSobj.processing -= src
+ ..()
+
+/obj/item/clockwork/slab/process()
+ production_cycle++
+ if(production_cycle < SLAB_PRODUCTION_THRESHOLD)
+ return 0
+ var/component_to_generate = pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible") //Possible todo: Generate based on the lowest amount?
+ stored_components[component_to_generate]++
+ var/mob/living/L
+ if(isliving(loc))
+ L = loc
+ else if(istype(loc, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/W = loc
+ if(isliving(W.loc)) //Only goes one level down - otherwise it just doesn't tell you
+ L = W.loc
+ if(L)
+ L << "Your slab clunks as it produces a new component."
+ production_cycle = 0
+ return 1
+
+/obj/item/clockwork/slab/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/clockwork/component) && is_servant_of_ratvar(user))
+ var/obj/item/clockwork/component/C = I
+ if(!C.component_id)
+ return 0
+ user.visible_message("[user] inserts [C] into [src]'s compartments.", "You insert [C] into [src].")
+ stored_components[C.component_id]++
+ user.drop_item()
+ qdel(C)
+ return 1
+ ..()
+
+/obj/item/clockwork/slab/attack_self(mob/living/user)
+ if(iscultist(user))
+ user << "\"You reek of blood. You've got a lot of nerve to even look at that slab.\""
+ user.visible_message("A sizzling sound comes from [user]'s hands!", "[src] suddenly grows extremely hot in your hands!")
+ playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
+ user.drop_item()
+ user.emote("scream")
+ user.apply_damage(5, BURN, "l_arm")
+ user.apply_damage(5, BURN, "r_arm")
+ return 0
+ if(!is_servant_of_ratvar(user))
+ user << "The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away."
+ user.confused = max(0, user.confused + 3)
+ return 0
+ if(busy)
+ user << "[src] refuses to work, displaying the message: \"[busy]!\""
+ return 0
+ access_display(user)
+
+/obj/item/clockwork/slab/proc/access_display(mob/living/user)
+ if(!is_servant_of_ratvar(user))
+ return 0
+ var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection", "Repository", "Report")
+ if(!action || !user.canUseTopic(src))
+ return 0
+ switch(action)
+ if("Recital")
+ recite_scripture(user)
+ if("Records")
+ show_stats(user)
+ if("Recollection")
+ show_guide(user)
+ if("Repository")
+ show_components(user)
+ access_display(user)
+ if("Report")
+ show_hierophant(user)
+ access_display(user)
+ return 1
+
+/obj/item/clockwork/slab/proc/recite_scripture(mob/living/user)
+ var/servants = 0
+ var/unconverted_ai_exists = FALSE
+ for(var/mob/living/M in living_mob_list)
+ if(is_servant_of_ratvar(M))
+ servants++
+ for(var/mob/living/silicon/ai/ai in living_mob_list)
+ if(!is_servant_of_ratvar(ai) && ai.client)
+ unconverted_ai_exists = TRUE
+ var/list/tiers_of_scripture = list("Drivers")
+ tiers_of_scripture += "Scripts[ratvar_awakens || (servants >= 5 && clockwork_caches >= 1) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Applications[ratvar_awakens || (servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 50) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Revenant[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Judgement[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100 && !unconverted_ai_exists) || no_cost ? "" : " \[LOCKED\]"]"
+ var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture
+ if(!scripture_tier || !user.canUseTopic(src))
+ return 0
+ var/list/available_scriptures = list()
+ var/datum/clockwork_scripture/scripture_to_recite
+ var/tier_to_browse
+ switch(scripture_tier)
+ if("Drivers")
+ tier_to_browse = SCRIPTURE_DRIVER
+ if("Scripts")
+ tier_to_browse = SCRIPTURE_SCRIPT
+ if("Applications")
+ tier_to_browse = SCRIPTURE_APPLICATION
+ if("Revenant")
+ tier_to_browse = SCRIPTURE_REVENANT
+ if("Judgement")
+ tier_to_browse = SCRIPTURE_JUDGEMENT
+ if(!tier_to_browse)
+ user << "That section of scripture is too powerful right now!"
+ return 0
+ for(var/S in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/C = S
+ if(initial(C.tier) == tier_to_browse)
+ available_scriptures += initial(C.name)
+ if(!available_scriptures.len)
+ return 0
+ var/chosen_scripture = input(user, "Choose a piece of scripture to recite.", "[src]") as null|anything in available_scriptures
+ if(!chosen_scripture || !user.canUseTopic(src))
+ return 0
+ for(var/S in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/C = S
+ if(initial(C.name) == chosen_scripture)
+ scripture_to_recite = new C
+ if(!scripture_to_recite)
+ return 0
+ scripture_to_recite.slab = src
+ scripture_to_recite.invoker = user
+ scripture_to_recite.run_scripture()
+ return 1
+
+/obj/item/clockwork/slab/proc/show_stats(mob/living/user) //A bit barebones, but there really isn't any more needed
+ var/servants = 0
+ for(var/mob/living/L in living_mob_list)
+ if(is_servant_of_ratvar(L))
+ servants++
+ user << "State of the Enlightened"
+ user << "Total servants: [servants]"
+ user << "Total construction value: [clockwork_construction_value]"
+ user << "Total tinkerer's caches: [clockwork_caches]"
+ user << "Total tinkerer's daemons: [clockwork_daemons] ([servants / 5 < clockwork_daemons ? "DISABLED: Too few servants (5 servants per daemon)!" : "Functioning Normally"])"
+ user << "Nezbere: [!clockwork_generals_invoked["nezbere"] ? "Ready" : "Recovering"]"
+ user << "Sevtug: [!clockwork_generals_invoked["sevtug"] ? "Ready" : "Recovering"]"
+ user << "Nzcrentr: [!clockwork_generals_invoked["nzcrentr"] ? "Ready" : "Recovering"]"
+ user << "Inath-Neq: [!clockwork_generals_invoked["inath-neq"] ? "Ready" : "Recovering"]"
+
+/obj/item/clockwork/slab/proc/show_guide(mob/living/user)
+ var/text = "
Chetr nyy hagehguf naq ubabe Ratvar.
\
+ \
+ First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
+ scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
+ wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.
\
+ \
+ This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \
+ universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \
+ tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.
\
+ \
+ This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \
+ in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \
+ in the clockwork slab, which will slowly generate components over time - around one component of a random type is produced every minute, which is obviously inefficient. There are other ways \
+ to create these components through scripture and certain structures.
\
+ \
+ In addition to their ability to pull components, slabs also possess other functionalities...
\
+ \
+ The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \
+ effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs or break the will of those implanted by Nanotrasen. Nevertheless, scripture \
+ is extremely important to a successful takeover.
\
+ \
+ The second functionality of the clockwork slab is Records. The slab is not a one-way link and can also feed information into the stream that it draws from. Records will allow many \
+ important statistics to be displayed, such as the amount of people converted and total construction value. You should check it often.
\
+ \
+ The third functionality is Recollection, which will display this guide. Recollection will automatically be initiated if you have not used a slab before.
\
+ \
+ The fourth functionality is the Repository, which will display all components stored within the slab.
\
+ \
+ The fifth and final functionality is Report, which allows you to discreetly communicate with all other servants.
\
+ \
+ A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \
+ specified.
"
+ var/text_to_add = ""
+ var/drivers = "Drivers"
+ var/scripts = "Scripts
These scriptures require at least five servants and a tinkerer's cache."
+ var/applications = "Applications
These scriptures require at least eight servants, three tinkerer's caches, and 50CV."
+ var/revenant = "Revenant
These scriptures require at least ten servants and 100CV."
+ var/judgement = "Judgement
These scriptures require at least ten servants and 100CV. In addition, there may not be an active non-servant AI."
+ for(var/V in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/S = V
+ var/datum/clockwork_scripture/S2 = new V
+ var/list/req_comps = S2.required_components
+ qdel(S2)
+ switch(initial(S.tier))
+ if(SCRIPTURE_DRIVER)
+ drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Cost: \
+ [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
+ [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
+ [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
+ [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
+ [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_SCRIPT)
+ scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Cost: \
+ [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
+ [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
+ [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
+ [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
+ [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_APPLICATION)
+ applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Cost: \
+ [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
+ [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
+ [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
+ [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
+ [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_REVENANT)
+ revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Cost: \
+ [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
+ [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
+ [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
+ [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
+ [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_JUDGEMENT)
+ judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Cost: \
+ [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
+ [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
+ [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
+ [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
+ [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\
+ Tip: [initial(S.usage_tip)]
"
+ text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
"
+ text_to_add += "Purge all untruths and honor Ratvar."
+ text += text_to_add
+ if(ratvar_awakens)
+ text = ""
+ for(var/i in 1 to 100)
+ text += "HONOR RATVAR "
+ text += ""
+ var/datum/browser/popup = new(user, "slab", "", 400, 400)
+ popup.set_content(text)
+ popup.open()
+ return 1
+
+/obj/item/clockwork/slab/proc/show_components(mob/living/user)
+ user << "Stored components:"
+ user << "Belligerent Eyes: [stored_components["belligerent_eye"]]"
+ user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]]"
+ user << "Guvax Capacitors: [stored_components["guvax_capacitor"]]"
+ user << "Replicant Alloys: [stored_components["replicant_alloy"]]"
+ user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]]"
+ return 1
+
+/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
+ var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
+ if(!message || !user || !user.canUseTopic(src))
+ return 0
+ user.whisper("Freinagf, urne zl jbeqf. [message]")
+ send_hierophant_message(user, message)
+ return 1
+
+/obj/item/clothing/glasses/wraith_spectacles //Wraith spectacles: Grants night and x-ray vision at the slow cost of the wearer's sight. Nar-Sian cultists are instantly blinded.
+ name = "antique spectacles"
+ desc = "Unnerving glasses with opaque yellow lenses."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "wraith_specs"
+ item_state = "glasses"
+ vision_flags = SEE_MOBS | SEE_TURFS | SEE_OBJS
+ invis_view = 2
+ darkness_view = 3
+
+/obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot)
+ ..()
+ if(slot != slot_glasses)
+ return 0
+ if(user.disabilities & BLIND)
+ user << "\"You're blind, idiot. Stop embarassing yourself.\"" //Ratvar with the sick burns yo
+ return 0
+ if(iscultist(user)) //Dummy
+ user << "\"It looks like Nar-Sie's dogs really don't value their eyes.\""
+ user << "Your eyes explode with horrific pain!"
+ user.emote("scream")
+ user.become_blind()
+ user.adjust_blurriness(30)
+ user.adjust_blindness(30)
+ return 1
+ user << "As you put on the spectacles, all is revealed to you.[ratvar_awakens ? " Your eyes begin to itch - you cannot do this for long." : ""]"
+ return 1
+
+/obj/item/clothing/glasses/wraith_spectacles/New()
+ ..()
+ SSobj.processing += src
+
+/obj/item/clothing/glasses/wraith_spectacles/Destroy()
+ SSobj.processing -= src
+ ..()
+
+/obj/item/clothing/glasses/wraith_spectacles/process()
+ if(ratvar_awakens || !ishuman(loc)) //If Ratvar is alive, the spectacles don't hurt your eyes
+ return 0
+ var/mob/living/carbon/human/H = loc
+ if(H.glasses != src)
+ return 0
+ H.adjust_eye_damage(1)
+ if(H.eye_damage >= 10)
+ H.adjust_blurriness(2)
+ if(H.eye_damage >= 20)
+ if(H.become_nearsighted())
+ H << "Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!"
+ H.become_nearsighted()
+ if(H.eye_damage >= 30)
+ if(H.become_blind())
+ H << "A piercing white light floods your vision. Suddenly, all goes dark!"
+ if(prob(15) && !H.disabilities & BLIND)
+ H << "Your eyes continue to burn."
+
+/obj/item/clothing/glasses/judicial_visor //Judicial visor: Grants the ability to smite an area and stun the unfaithful nearby every thirty seconds.
+ name = "judicial visor"
+ desc = "A strange purple-lensed visor. Looking at them inspires an odd sense of guilt."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "judicial_visor_0"
+ item_state = "sunglasses"
+ var/active = FALSE //If the visor is online
+ var/recharging = FALSE //If the visor is currently recharging
+ var/obj/item/weapon/ratvars_flame/flame //The linked flame object
+
+/obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot)
+ ..()
+ if(slot != slot_glasses)
+ update_status(FALSE)
+ if(flame)
+ qdel(flame)
+ return 0
+ if(!is_servant_of_ratvar(user))
+ return 0
+ update_status(TRUE)
+
+/obj/item/clothing/glasses/judicial_visor/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/weapon/ratvars_flame))
+ user.visible_message("The flame in [user]'s hand winks out!", "You dispel the power of [src].")
+ qdel(I)
+ return 1
+
+/obj/item/clothing/glasses/judicial_visor/AltClick(mob/living/user)
+ if(is_servant_of_ratvar(user) && iscarbon(user) && active)
+ if(recharging)
+ user << "[src] is still gathering power!"
+ return 0
+ var/mob/living/carbon/C = user
+ if(C.l_hand && C.r_hand)
+ C << "You require a free hand to utilize [src]'s power!"
+ return 0
+ C.visible_message("[C]'s hand is enveloped in violet flames!", "You harness [src]'s power. Direct it at a tile on harm intent to unleash it, or hit your visor with it dispel it.")
+ var/obj/item/weapon/ratvars_flame/R = new(get_turf(C))
+ flame = R
+ C.put_in_hands(R)
+ R.visor = src
+ return 1
+
+/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to)
+ if(recharging)
+ icon_state = "judicial_visor_0"
+ return 0
+ if(active == change_to)
+ return 0
+ if(!isliving(loc))
+ return 0
+ var/mob/living/L = loc
+ if(!is_servant_of_ratvar(L) || L.stat)
+ return 0
+ active = change_to
+ icon_state = "judicial_visor_[active]"
+ switch(active)
+ if(TRUE)
+ L << "As you put on [src], its lens begins to glow, information flashing before your eyes.\n\
+ Judicial visor active. Alt-click visor to gain the ability to smite the unworthy."
+ if(FALSE)
+ L << "As you take off [src], its lens darkens once more."
+ return 1
+
+/obj/item/clothing/head/helmet/clockwork //Clockwork armor: High melee protection but weak to lasers
+ name = "clockwork helmet"
+ desc = "A heavy helmet made of brass."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_helmet"
+ w_class = 3
+ armor = list(melee = 65, bullet = 50, laser = -25, energy = 5, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/clockwork
+ name = "clockwork cuirass"
+ desc = "A bulky cuirass made of brass."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_cuirass"
+ w_class = 4
+ armor = list(melee = 80, bullet = 40, laser = -10, energy = 5, bomb = 0, bio = 0, rad = 0)
+ allowed = list(/obj/item/clockwork)
+
+/obj/item/clothing/shoes/clockwork
+ name = "clockwork treads"
+ desc = "Industrial boots made of brass. They're very heavy."
+ icon = 'icons/obj/clothing/clockwork_garb.dmi'
+ icon_state = "clockwork_treads"
+ w_class = 3
+ flags = NOSLIP
+
+/obj/item/weapon/ratvars_flame //Used by the judicial visor
+ name = "Ratvar's flame"
+ desc = "A blazing violet ball of fire that, curiously, doesn't melt your hand off."
+ icon = 'icons/effects/clockwork_effects.dmi'
+ icon_state = "ratvars_flame" //beware: minecraft-tier sprite
+ item_state = "disintegrate"
+ color = rgb(180, 50, 210)
+ w_class = 5
+ flags = NODROP | ABSTRACT
+ force = 15 //Also serves as a potent melee weapon!
+ damtype = BURN
+ hitsound = 'sound/weapons/sear.ogg'
+ attack_verb = list("scorched")
+ var/obj/item/clothing/glasses/judicial_visor/visor //The linked visor
+
+/obj/item/weapon/ratvars_flame/afterattack(atom/target, mob/living/user, flag, params)
+ if(!visor || (visor && visor.cooldown))
+ qdel(src)
+ if(user.a_intent != "harm")
+ ..()
+ return 0
+ visor.recharging = TRUE
+ for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents())
+ if(V == visor)
+ continue
+ V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
+ user.say("Xarry, urn'guraf!")
+ user.visible_message("The flame in [user]'s hand rushes to [target]!", "You direct [visor]'s power to [target]. You must wait for some time before doing this again.")
+ new/obj/effect/clockwork/judicial_marker(get_turf(target))
+ spawn(ratvar_awakens ? 30 : 300) //Cooldown is reduced by 10x if Ratvar is up
+ if(!visor || !user)
+ return 0
+ visor.recharging = FALSE
+ for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents())
+ if(V == visor)
+ continue
+ V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
+ if(visor.loc == user)
+ user << "Your [visor.name] hums. It is ready."
+ qdel(src)
+ return 1
+
+/obj/item/clockwork/clockwork_proselytizer //Clockwork proselytizer (yes, that's a real word): Converts applicable objects to Ratvarian variants.
+ name = "clockwork proselytizer"
+ 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 liquified replicant alloy to function."
+ icon_state = "clockwork_proselytizer"
+ item_state = "resonator_u"
+ w_class = 3
+ force = 5
+ var/stored_alloy = 0 //Requires this to function; each chunk of replicant alloy provides 10 charge
+ var/max_alloy = 100
+ var/uses_alloy = TRUE
+
+/obj/item/clockwork/clockwork_proselytizer/preloaded
+ stored_alloy = 25
+
+/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user)
+ ..()
+ if((is_servant_of_ratvar(user) || isobserver(user)) && uses_alloy)
+ user << "It has [stored_alloy]/[max_alloy] units of liquified replicant alloy stored."
+
+/obj/item/clockwork/clockwork_proselytizer/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user) && uses_alloy)
+ if(stored_alloy >= max_alloy)
+ user << "[src]'s replicant alloy compartments are full!"
+ return 0
+ modify_stored_alloy(10)
+ user << "You force [I] to liquify and pour it into [src]'s compartments. It now contains [stored_alloy]/[max_alloy] units of liquified alloy."
+ user.drop_item()
+ qdel(I)
+ return 1
+ ..()
+
+/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, flag, params)
+ if(!target || !user)
+ return 0
+ if(user.a_intent == "harm" || !user.Adjacent(target))
+ return ..()
+ proselytize(target, user)
+
+/obj/item/clockwork/clockwork_proselytizer/proc/modify_stored_alloy(amount)
+ if(ratvar_awakens) //Summoning Ratvar doesn't make it free, but it might as well
+ amount = 1
+ stored_alloy = max(0, min(max_alloy, stored_alloy + amount))
+ return 1
+
+/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user)
+ if(!target || !user)
+ return 0
+ var/operation_time = 0 //In deciseconds, how long the proselytization will take
+ var/new_obj_type //The path of the new type of object to replace the old
+ var/alloy_cost = 0
+ var/valid_target = FALSE //If the proselytizer will actually function on the object
+ switch(target.type)
+ if(/turf/closed/wall, /turf/closed/wall/rust)
+ operation_time = 50
+ new_obj_type = /turf/closed/wall/clockwork
+ alloy_cost = 10
+ valid_target = TRUE //Need to change valid_target to 1 or TRUE in each check so that it doesn't return an invalid value
+ if(/turf/open/floor/plating, /turf/open/floor/plasteel)
+ operation_time = 30
+ new_obj_type = /turf/open/floor/clockwork
+ alloy_cost = 5
+ valid_target = TRUE
+ if(!uses_alloy)
+ alloy_cost = 0
+ if(!valid_target)
+ user << "[target] cannot be proselytized!"
+ return 0
+ if(!new_obj_type)
+ user << "That object can't be changed into anything!"
+ return 0
+ if(stored_alloy - alloy_cost < 0)
+ user << "You need [alloy_cost] replicant alloy to proselytize [target]!"
+ return 0
+ user.visible_message("[user]'s [src] begins tearing apart [target]!", "You begin proselytizing [target]...")
+ playsound(target, 'sound/machines/click.ogg', 50, 1)
+ if(!do_after(user, operation_time, target = target))
+ return 0
+ if(stored_alloy - alloy_cost < 0) //Check again to prevent bypassing via spamclick
+ return 0
+ user.visible_message("[user]'s [name] disgorges a chunk of metal and shapes it over what's left of [target]!", \
+ "You proselytize [target].")
+ playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(isturf(target))
+ var/turf/T = target
+ T.ChangeTurf(new_obj_type)
+ else
+ new new_obj_type(get_turf(target))
+ qdel(target)
+ modify_stored_alloy(-alloy_cost)
+ return 1
+
+/obj/item/clockwork/ratvarian_spear //Ratvarian spear: A fragile spear from the Celestial Derelict. Deals extreme damage to silicons and enemy cultists, but doesn't last long.
+ name = "ratvarian spear"
+ desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy."
+ clockwork_desc = "A fragile spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last long."
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "ratvarian_spear"
+ item_state = "ratvarian_spear"
+ force = 17 //Extra damage is dealt to silicons in afterattack()
+ throwforce = 40
+ attack_verb = list("stabbed", "poked", "slashed", "impaled")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ w_class = 4
+
+/obj/item/clockwork/ratvarian_spear/New()
+ ..()
+ spawn(1)
+ if(ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful
+ force = 30
+ throwforce = 50
+ if(isliving(loc))
+ var/mob/living/L = loc
+ L << "Your spear begins to break down in this plane of existence. You can't use it for long!"
+ spawn(300) //5 minutes
+ if(src)
+ visible_message("[src] cracks in two and fades away!")
+ qdel(src)
+
+/obj/item/clockwork/ratvarian_spear/afterattack(atom/target, mob/living/user, flag, params)
+ if(!target || !user)
+ return 0
+ if(!ismob(target))
+ return ..()
+ var/mob/living/L = target
+ if(issilicon(L))
+ var/mob/living/silicon/S = L
+ if(S.stat != DEAD)
+ S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!")
+ S.adjustFireLoss(25)
+ if(iscultist(L))
+ var/mob/living/M = L
+ M << "Your body flares with agony at [src]'s touch!"
+ M.adjustFireLoss(10)
+ ..()
+
+/obj/item/clockwork/ratvarian_spear/throw_impact(atom/target)
+ ..()
+ if(!ismob(target))
+ return 0
+ var/mob/living/L = target
+ if(issilicon(L) || iscultist(L))
+ L.Stun(3)
+ L.Weaken(3)
+ visible_message("[src] snaps in two and dematerializes!")
+ qdel(src)
+
+/obj/item/device/mmi/posibrain/soul_vessel //Soul vessel: An ancient positronic brain with a lawset catered to serving Ratvar.
+ name = "soul vessel"
+ desc = "A heavy brass cube with a single protruding cogwheel."
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "soul_vessel"
+ req_access = list()
+ braintype = "Servant"
+ begin_activation_message = "You activate the cogwheel. It hitches and stalls as it begins spinning."
+ success_message = "The cogwheel's rotation smooths out as the soul vessel activates."
+ fail_message = "The cogwheel creaks and grinds to a halt. Maybe you could try again?"
+ new_role = "Soul Vessel"
+ welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\
+ You are a soul vessel - a clockwork mind created by Ratvar, the Clockwork Justiciar.\n\
+ You answer to Ratvar and his servants. It is your discretion as to whether or not to answer to anyone else.\n\
+ The purpose of your existence is to further the goals of the servants and Ratvar himself. Above all else, serve Ratvar."
+ new_mob_message = "The soul vessel emits a jet of steam before its cogwheel smooths out."
+ dead_message = "Its cogwheel, scratched and dented, lies motionless."
+ fluff_names = list("Servant")
+ clockwork = TRUE
+
+/obj/item/device/mmi/posibrain/soul_vessel/New()
+ ..()
+ all_clockwork_objects += src
+
+/obj/item/device/mmi/posibrain/soul_vessel/Destroy()
+ all_clockwork_objects -= src
+ return ..()
+
+/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user)
+ if(!is_servant_of_ratvar(user))
+ user << "You fiddle around with [src], to no avail."
+ return 0
+ ..()
+
+/obj/item/clockwork/daemon_shell
+ name = "daemon shell"
+ desc = "A vaguely arachnoid brass shell with a single empty socket in its body."
+ clockwork_desc = "An unpowered daemon. It needs to be attached to a cache."
+ icon_state = "daemon_shell"
+ w_class = 3
+
+/obj/item/clockwork/tinkerers_daemon //Shouldn't ever appear on its own
+ name = "tinkerer's daemon"
+ desc = "An arachnoid shell with a single spinning cogwheel in its center."
+ clockwork_desc = "A tinkerer's daemon, dutifully producing components."
+ icon_state = "tinkerers_daemon"
+ w_class = 3
+ var/specific_component //The type of component that the daemon is set to produce in particular, if any
+ var/obj/structure/clockwork/cache/cache //The cache the daemon is feeding
+ var/production_progress = 0 //Progress towards production of the next component in seconds
+ var/production_interval = 30 //How many seconds it takes to produce a new component
+
+/obj/item/clockwork/tinkerers_daemon/New()
+ ..()
+ SSobj.processing += src
+ clockwork_daemons++
+
+/obj/item/clockwork/tinkerers_daemon/Destroy()
+ SSobj.processing -= src
+ clockwork_daemons--
+ ..()
+
+/obj/item/clockwork/tinkerers_daemon/process()
+ if(!cache)
+ visible_message("[src] shuts down!")
+ new/obj/item/clockwork/daemon_shell(get_turf(src))
+ qdel(src)
+ return 0
+ var/servants = 0
+ for(var/mob/living/L in living_mob_list)
+ if(is_servant_of_ratvar(L))
+ servants++
+ if(servants / 5 < clockwork_daemons)
+ return 0
+ production_progress = min(production_progress + 1, production_interval)
+ if(production_progress >= production_interval)
+ production_progress = 0 //Start it over
+ if(specific_component)
+ clockwork_component_cache[specific_component]++
+ else
+ clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++
+ cache.visible_message("Something clunks around inside of [cache].")
+
+/obj/item/clockwork/tinkerers_daemon/attack_hand(mob/user)
+ return 0
+
+//////////////////////////
+// CLOCKWORK COMPONENTS //
+//////////////////////////
+
+/obj/item/clockwork/component //Components: Used in scripture among other things.
+ name = "meme component"
+ desc = "A piece of a famous meme."
+ clockwork_desc = null
+ var/component_id //What the component is identified as
+ var/cultist_message = "You are not worthy of this meme." //Showed to Nar-Sian cultists if they pick up the component in addition to chaplains
+ var/list/servant_of_ratvar_messages = list("ayy", "lmao") //Fluff, shown to servants of Ratvar on a low chance
+
+/obj/item/clockwork/component/pickup(mob/living/user)
+ ..()
+ if(iscultist(user) || (user.mind && user.mind.assigned_role == "Chaplain"))
+ user << "[cultist_message]"
+ if(is_servant_of_ratvar(user) && prob(15))
+ user << "[pick(servant_of_ratvar_messages)]"
+
+/obj/item/clockwork/component/belligerent_eye
+ name = "belligerent eye"
+ desc = "A brass construct with a rotating red center. It's as though it's looking for something to hurt."
+ icon_state = "belligerent_eye"
+ component_id = "belligerent_eye"
+ cultist_message = "The eye gives you an intensely hateful glare."
+ servant_of_ratvar_messages = list("\"...\"", "For a moment, your mind is flooded with extremely violent thoughts.")
+
+/obj/item/clockwork/component/vanguard_cogwheel
+ name = "vanguard cogwheel"
+ desc = "A sturdy brass cog with a faintly glowing blue gem in its center."
+ icon_state = "vanguard_cogwheel"
+ component_id = "vanguard_cogwheel"
+ cultist_message = "\"Pray to your god that we never meet.\""
+ servant_of_ratvar_messages = list("\"Be safe, child.\"", "You feel unexplainably comforted.", "\"Never forget: pain is temporary. The Justiciar's glory is eternal.\"")
+
+/obj/item/clockwork/component/guvax_capacitor
+ name = "guvax capacitor"
+ desc = "A curiously cold brass doodad. It seems as though it really doesn't appreciate being held."
+ icon_state = "guvax_capacitor"
+ component_id = "guvax_capacitor"
+ cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\""
+ servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
+
+/obj/item/clockwork/component/replicant_alloy
+ name = "replicant alloy"
+ desc = "A seemingly strong but very malleable chunk of metal. It seems as though it wants to be molded into something greater."
+ icon_state = "replicant_alloy"
+ component_id = "replicant_alloy"
+ cultist_message = "The alloy takes on the appearance of a screaming face for a moment."
+ servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", "A detailed image of Ratvar appears in the alloy for a moment.")
+
+/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment
+ name = "smashed anima fragment"
+ desc = "Shattered chunks of metal. Damaged beyond repair and completely unusable."
+ clockwork_desc = "The sad remains of an anima fragment. Might still be serviceable as a substitute for replicant alloy."
+ icon_state = "smashed_anime_fragment"
+ cultist_message = "The shards vibrate in your hands for a moment."
+ servant_of_ratvar_messages = list("\"...still fight...\"", "\"...where am I...?\"", "\"...put me... slab...\"")
+ w_class = 3
+
+/obj/item/clockwork/component/replicant_alloy/fallen_armor
+ name = "fallen armor"
+ desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you."
+ clockwork_desc = "The armor from a former clockwork marauder. Might still be serviceable as a substitute for replicant alloy."
+ icon_state = "fallen_armor"
+ cultist_message = "Red flame sputters from the mask's eye before winking out."
+ servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment.", "Red flame appears in the cuirass before sputtering out.")
+ w_class = 3
+
+/obj/item/clockwork/component/replicant_alloy/blind_eye
+ name = "blind eye"
+ desc = "A heavy brass eye, its red iris fallen dark."
+ clockwork_desc = "A smashed ocular warden covered in dents. Might still be serviceable as a substitute for replicant alloy."
+ icon_state = "blind_eye"
+ cultist_message = "The eye flickers at you with intense hate before falling dark."
+ servant_of_ratvar_messages = list("The eye flickers before falling dark.", "You feel watched.")
+ w_class = 3
+
+/obj/item/clockwork/component/hierophant_ansible
+ name = "hierophant ansible"
+ desc = "Some sort of transmitter? It seems as though it's trying to say something."
+ icon_state = "hierophant_ansible"
+ component_id = "hierophant_ansible"
+ cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\""
+ servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"")
+
+//////////////////////////
+// CLOCKWORK STRUCTURES //
+//////////////////////////
+
+/obj/structure/clockwork
+ name = "meme structure"
+ desc = "Some frog or something, the fuck?"
+ var/clockwork_desc = "This fabled artifact from beyond the stars contains concentrated meme essence." //See above
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "rare_pepe"
+ anchored = 1
+ density = 1
+ opacity = 0
+ var/max_health = 100 //All clockwork structures have health that can be removed via attacks
+ var/health = 100
+ var/takes_damage = TRUE //If the structure can be damaged
+ var/break_message = "The frog isn't a meme after all!" //The message shown when a structure breaks
+ var/break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks
+ var/list/debris = list(/obj/item/clockwork/component/replicant_alloy) //Parts left behind when a structure breaks
+ var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station
+
+/obj/structure/clockwork/New()
+ ..()
+ clockwork_construction_value += construction_value
+ all_clockwork_objects += src
+
+/obj/structure/clockwork/Destroy()
+ clockwork_construction_value -= construction_value
+ all_clockwork_objects -= src
+ ..()
+
+/obj/structure/clockwork/proc/destroyed()
+ if(!takes_damage)
+ return 0
+ for(var/obj/item/I in debris)
+ new I (get_turf(src))
+ visible_message(break_message)
+ playsound(src, break_sound, 50, 1)
+ qdel(src)
+ return 1
+
+/obj/structure/clockwork/ex_act(severity)
+ if(takes_damage)
+ switch(severity)
+ if(1)
+ health -= max_health * 0.7 //70% max health lost
+ if(2)
+ health -= max_health * 0.4 //40% max health lost
+ if(3)
+ if(prob(50))
+ health -= max_health * 0.1 //10% max health lost
+ if(health <= max_health * 0.1) //If there's less than 10% max health left, destroy it
+ destroyed()
+ qdel(src)
+
+/obj/structure/clockwork/examine(mob/user)
+ if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
+ desc = clockwork_desc
+ ..()
+ desc = initial(desc)
+
+/obj/structure/clockwork/attackby(obj/item/I, mob/living/user, params)
+ if(user.a_intent == "harm" && user.canUseTopic(I) && I.force)
+ user.visible_message("[user] strikes [src] with [I]!", "You strike [src] with [I]!")
+ playsound(src, I.hitsound, 50, 1)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ health = max(0, health - I.force)
+ if(!health)
+ destroyed()
+ return 0
+ else
+ ..()
+
+/obj/structure/clockwork/cache //Tinkerer's cache: Stores components for later use.
+ name = "tinkerer's cache"
+ desc = "A large brass spire with a flaming hole in its center."
+ clockwork_desc = "A brass container capable of storing a large amount of components. Shares components with all other caches."
+ icon_state = "tinkerers_cache"
+ construction_value = 10
+ break_message = "The cache's fire winks out before it falls in on itself!"
+
+/obj/structure/clockwork/cache/New()
+ ..()
+ clockwork_caches++
+
+/obj/structure/clockwork/cache/Destroy()
+ clockwork_caches--
+ return ..()
+
+/obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params)
+ if(!is_servant_of_ratvar(user))
+ ..()
+ return 0
+ if(istype(I, /obj/item/clockwork/component))
+ var/obj/item/clockwork/component/C = I
+ clockwork_component_cache[C.component_id]++
+ user << "You add [C] to [src]."
+ user.drop_item()
+ qdel(C)
+ return 1
+ if(istype(I, /obj/item/clockwork/slab))
+ var/obj/item/clockwork/slab/S = I
+ clockwork_component_cache["belligerent_eye"] += S.stored_components["belligerent_eye"]
+ clockwork_component_cache["vanguard_cogwheel"] += S.stored_components["vanguard_cogwheel"]
+ clockwork_component_cache["guvax_capacitor"] += S.stored_components["guvax_capacitor"]
+ clockwork_component_cache["replicant_alloy"] += S.stored_components["replicant_alloy"]
+ clockwork_component_cache["hierophant_ansible"] += S.stored_components["hierophant_ansible"]
+ S.stored_components["belligerent_eye"] = 0
+ S.stored_components["vanguard_cogwheel"] = 0
+ S.stored_components["guvax_capacitor"] = 0
+ S.stored_components["replicant_alloy"] = 0
+ S.stored_components["hierophant_ansible"] = 0
+ user.visible_message("[user] empties [S] into [src].", "You offload your slab's components into [src].")
+ return 1
+ if(istype(I, /obj/item/clockwork/daemon_shell))
+ var/component_type
+ switch(alert(user, "Will this daemon produce a specific type of component or produce randomly?.", , "Specific Type", "Random Component"))
+ if("Specific Type")
+ switch(input(user, "Choose a component type.", name) as null|anything in list("Belligerent Eyes", "Vanguard Cogwheels", "Guvax Capacitors", "Replicant Alloys", "Hierophant Ansibles"))
+ if("Belligerent Eyes")
+ component_type = "belligerent_eye"
+ if("Vanguard Cogwheels")
+ component_type = "vanguard_cogwheel"
+ if("Guvax Capacitors")
+ component_type = "guvax_capacitor"
+ if("Replicant Alloys")
+ component_type = "replicant_alloy"
+ if("Hierophant Ansibles")
+ component_type = "hierophant_ansibles"
+ if(!user || !user.canUseTopic(src) || !user.canUseTopic(I))
+ return 0
+ var/obj/item/clockwork/tinkerers_daemon/D = new(src)
+ D.cache = src
+ D.specific_component = component_type
+ user.visible_message("[user] spins the cogwheel on [I] and puts it into [src].", \
+ "You activate the daemon and put it into [src]. It will now produce a component every thirty seconds.")
+ user.drop_item()
+ qdel(I)
+ return 1
+ ..()
+
+/obj/structure/clockwork/cache/attack_hand(mob/user)
+ if(!is_servant_of_ratvar(user))
+ return 0
+ var/list/possible_components = list()
+ if(clockwork_component_cache["belligerent_eye"])
+ possible_components += "Belligerent Eye"
+ if(clockwork_component_cache["vanguard_cogwheel"])
+ possible_components += "Vanguard Cogwheel"
+ if(clockwork_component_cache["guvax_capacitor"])
+ possible_components += "Guvax Capacitor"
+ if(clockwork_component_cache["replicant_alloy"])
+ possible_components += "Replicant Alloy"
+ if(clockwork_component_cache["hierophant_ansible"])
+ possible_components += "Hierophant Ansible"
+ if(!possible_components.len)
+ user << "[src] is empty!"
+ return 0
+ var/component_to_withdraw = input(user, "Choose a component to withdraw.", name) as null|anything in possible_components
+ if(!user || !user.canUseTopic(src) || !component_to_withdraw)
+ return 0
+ var/obj/item/clockwork/component/the_component
+ switch(component_to_withdraw)
+ if("Belligerent Eye")
+ the_component = new/obj/item/clockwork/component/belligerent_eye(get_turf(src))
+ clockwork_component_cache["belligerent_eye"]--
+ if("Vanguard Cogwheel")
+ the_component = new/obj/item/clockwork/component/vanguard_cogwheel(get_turf(src))
+ clockwork_component_cache["vanguard_cogwheel"]--
+ if("Guvax Capacitor")
+ the_component = new/obj/item/clockwork/component/guvax_capacitor(get_turf(src))
+ clockwork_component_cache["guvax_capacitor"]--
+ if("Replicant Alloy")
+ the_component = new/obj/item/clockwork/component/replicant_alloy(get_turf(src))
+ clockwork_component_cache["replicant_alloy"]--
+ if("Hierophant Ansible")
+ the_component = new/obj/item/clockwork/component/hierophant_ansible(get_turf(src))
+ clockwork_component_cache["hierophant_ansible"]--
+ if(the_component)
+ user.visible_message("[user] withdraws [the_component] from [src].", "You withdraw [the_component] from [src].")
+ user.put_in_hands(the_component)
+ return 1
+
+/obj/structure/clockwork/cache/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user) || isobserver(user))
+ user << "Stored components:"
+ user << "Belligerent Eyes: [clockwork_component_cache["belligerent_eye"]]"
+ user << "Vanguard Cogwheels: [clockwork_component_cache["vanguard_cogwheel"]]"
+ user << "Guvax Capacitors: [clockwork_component_cache["guvax_capacitor"]]"
+ user << "Replicant Alloys: [clockwork_component_cache["replicant_alloy"]]"
+ user << "Hierophant Ansibles: [clockwork_component_cache["hierophant_ansible"]]"
+
+/obj/structure/clockwork/ocular_warden //Ocular warden: Low-damage, low-range turret. Deals constant damage to whoever it makes eye contact with.
+ name = "ocular warden"
+ desc = "A large brass eye with tendrils trailing below it and a wide red iris."
+ clockwork_desc = "A stalwart turret that will deal sustained damage to any non-faithful it sees."
+ icon_state = "ocular_warden"
+ health = 25
+ max_health = 25
+ construction_value = 15
+ break_message = "The warden's eye gives a glare of utter hate before falling dark!"
+ debris = list(/obj/item/clockwork/component/replicant_alloy/blind_eye)
+ var/damage_per_tick = 3
+ var/sight_range = 3
+ var/mob/living/target
+
+/obj/structure/clockwork/ocular_warden/New()
+ ..()
+ SSfastprocess.processing += src
+
+/obj/structure/clockwork/ocular_warden/Destroy()
+ SSfastprocess.processing -= src
+ return ..()
+
+/obj/structure/clockwork/ocular_warden/examine(mob/user)
+ ..()
+ user << "[target ? "It's fixated on [target]" : "Its gaze is wandering aimlessly"]."
+
+/obj/structure/clockwork/ocular_warden/process()
+ if(ratvar_awakens && (damage_per_tick == initial(damage_per_tick) || sight_range == initial(sight_range))) //Massive buff if Ratvar has returned
+ damage_per_tick = 10
+ sight_range = 5
+ if(target)
+ if(target.stat || get_dist(get_turf(src), get_turf(target)) > sight_range)
+ lose_target()
+ else
+ target.adjustFireLoss(!iscultist(target) ? damage_per_tick : damage_per_tick * 2) //Nar-Sian cultists take additional damage
+ if(ratvar_awakens)
+ target.adjust_fire_stacks(damage_per_tick)
+ target.IgniteMob()
+ dir = get_dir(get_turf(src), get_turf(target))
+ else
+ if(!acquire_nearby_target() && prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
+ var/list/idle_messages = list("[src] sulkily glares around.", "[src] lazily drifts from side to side.", "[src] looks around for something to burn.", "[src] slowly turns in circles.")
+ if(prob(50))
+ visible_message("[pick(idle_messages)]")
+ else
+ dir = pick(NORTH, EAST, SOUTH, WEST) //Random rotation
+
+/obj/structure/clockwork/ocular_warden/proc/acquire_nearby_target()
+ var/list/possible_targets = list()
+ for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind
+ if(!is_servant_of_ratvar(L) && !L.stat && L.mind)
+ possible_targets += L
+ if(!possible_targets.len)
+ return 0
+ target = pick(possible_targets)
+ visible_message("[src] swivels to face [target]!")
+ target << "\"I SEE YOU!\"\n[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!"
+ return 1
+
+/obj/structure/clockwork/ocular_warden/proc/lose_target()
+ if(!target)
+ return 0
+ target = null
+ visible_message("[src] settles and seems almost disappointed.")
+ return 1
+
+/obj/structure/clockwork/anima_fragment //Anima fragment: Useless on its own, but can accept an active soul vessel to create a powerful construct.
+ name = "anima fragment"
+ 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"
+ construction_value = 0
+ anchored = 0
+ density = 0
+ takes_damage = FALSE
+
+/obj/structure/clockwork/anima_fragment/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)
+ user << "[S] hasn't trapped a spirit! Turn it on first."
+ return 0
+ if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind))
+ user << "[S]'s trapped spirit appears inactive!"
+ return 0
+ user.visible_message("[user] clicks [S] into place on [src].", "You insert [S] into [src]. It whirs and begins to rise.")
+ var/mob/living/simple_animal/hostile/anima_fragment/A = new(get_turf(src))
+ S.brainmob.mind.transfer_to(A)
+ add_servant_of_ratvar(A, TRUE)
+ A << A.playstyle_string
+ user.drop_item()
+ qdel(S)
+ qdel(src)
+ return 1
+ ..()
+
+/obj/structure/clockwork/interdiction_lens //Interdiction lens: A powerful artifact that can massively disrupt electronics. Five-minute cooldown between uses.
+ name = "interdiction lens"
+ desc = "An ominous, double-pronged brass obelisk. There's a strange gemstone clasped between the pincers."
+ clockwork_desc = "A powerful obelisk that can devastate certain electronics. It needs to recharge between uses."
+ icon_state = "interdiction_lens"
+ construction_value = 25
+ break_message = "The lens flares a blinding violet before shattering!"
+ break_sound = 'sound/effects/Glassbr3.ogg'
+ var/recharging = FALSE //If the lens is still recharging its energy
+
+/obj/structure/clockwork/interdiction_lens/examine(mob/user)
+ ..()
+ user << "Its gemstone [recharging ? "has been breached by writhing tendrils of blackness that cover the obelisk" : "vibrates in place and thrums with power"],"
+
+/obj/structure/clockwork/interdiction_lens/attack_hand(mob/living/user)
+ if(user.canUseTopic(src))
+ disrupt(user)
+
+/obj/structure/clockwork/interdiction_lens/proc/disrupt(mob/living/user)
+ if(!user || !is_servant_of_ratvar(user))
+ return 0
+ if(recharging)
+ user << "As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back."
+ return 0
+ user.visible_message("[user] places their hand on [src]' gemstone...", "You place your hand on the gemstone...")
+ var/target = input(user, "Power flows through you. Choose where to direct it.", "Interdiction Lens") as null|anything in list("Disrupt Telecommunications", "Disable Cameras", "Disable Cyborgs")
+ if(!user.canUseTopic(src) || !target)
+ user.visible_message("[user] pulls their hand back.", "On second thought, maybe not right now.")
+ return 0
+ user.visible_message("Violet tendrils engulf [user]'s arm as the gemstone glows with furious energy!", \
+ "A mass of violet tendrils cover your arm as [src] unleashes a blast of power!")
+ user.notransform = TRUE
+ icon_state = "[initial(icon_state)]_active"
+ recharging = TRUE
+ sleep(30)
+ switch(target)
+ if("Disrupt Telecommunications")
+ for(var/obj/machinery/telecomms/hub/H in telecomms_list)
+ for(var/mob/M in range(7, H))
+ M << "You sense a strange force pass through you..."
+ H.visible_message("The lights on [H] flare a blinding yellow before falling dark!")
+ H.emp_act(1)
+ if("Disable Cameras")
+ for(var/obj/machinery/camera/C in cameranet.cameras)
+ C.emp_act(1)
+ for(var/mob/living/silicon/ai/A in living_mob_list)
+ A << "Massive energy surge detected. All cameras offline."
+ A << 'sound/machines/warning-buzzer.ogg'
+ if("Disable Cyborgs")
+ for(var/mob/living/silicon/robot/R in living_mob_list) //Doesn't include AIs, for obvious reasons
+ if(is_servant_of_ratvar(R) || R.stat) //Doesn't affect already-offline cyborgs
+ continue
+ R.visible_message("[R] shuts down with no warning!", \
+ "Massive emergy surge detected. All systems offline. Initiating reboot sequence..")
+ playsound(R, 'sound/machines/warning-buzzer.ogg', 50, 1)
+ R.Weaken(30)
+ user.visible_message("The tendrils around [user]'s arm turn to an onyx black and wither away!", \
+ "The tendrils around your arm turn a horrible black and sting your skin before they shrivel away.")
+ user.notransform = FALSE
+ if(!src)
+ return 0
+ flick("[initial(icon_state)]_discharged", src)
+ icon_state = "[initial(icon_state)]_recharging"
+ spawn(3000) //5 minutes
+ if(!src)
+ return 0
+ visible_message("The writhing tendrils return to the gemstone, which begins to glow with power.")
+ flick("[initial(icon_state)]_recharged", src)
+ icon_state = initial(icon_state)
+ recharging = FALSE
+ return 1
+
+/obj/structure/clockwork/mending_motor //Mending motor: A prism that consumes replicant alloy to repair nearby mechanical servants at a quick rate.
+ name = "mending motor"
+ desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
+ clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures."
+ icon_state = "mending_motor"
+ construction_value = 20
+ break_message = "The prism collapses with a heavy thud!"
+ var/stored_alloy = 0
+ var/max_alloy = 150
+ var/uses_alloy = TRUE
+ var/active = TRUE
+
+/obj/structure/clockwork/mending_motor/prefilled
+ stored_alloy = 30
+
+/obj/structure/clockwork/mending_motor/New()
+ ..()
+ SSobj.processing += src
+ toggle() //Toggles off as soon as it's created, but starts online for reasons
+
+/obj/structure/clockwork/mending_motor/Destroy()
+ SSobj.processing -= src
+ ..()
+
+/obj/structure/clockwork/mending_motor/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user) || isobserver(user))
+ user << "It has [stored_alloy]/[max_alloy] units of replicant alloy."
+
+/obj/structure/clockwork/mending_motor/process()
+ if(!active)
+ return 0
+ if(!stored_alloy && uses_alloy)
+ visible_message("[src] emits an airy chuckling sound and falls dark!")
+ toggle()
+ return 0
+ for(var/mob/living/simple_animal/hostile/anima_fragment/F in range(5, src))
+ if(F.health == F.maxHealth || F.stat)
+ continue
+ F.adjustBruteLoss(-15)
+ if(uses_alloy)
+ stored_alloy = max(0, stored_alloy - 2)
+ for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in range(5, src))
+ if(M.health == M.maxHealth || M.stat)
+ continue
+ M.adjustBruteLoss(-M.maxHealth) //Instant because marauders don't usually take health damage
+ M.fatigue = max(0, M.fatigue - 15)
+ if(uses_alloy)
+ stored_alloy = max(0, stored_alloy - 2)
+ for(var/mob/living/silicon/S in range(5, src))
+ if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
+ continue
+ S.adjustBruteLoss(-25)
+ S.adjustFireLoss(-25)
+ if(uses_alloy)
+ stored_alloy = max(0, stored_alloy - 5) //Much higher cost because silicons are much more useful
+ for(var/obj/structure/clockwork/C in range(5, src))
+ if(C.health == C.max_health)
+ continue
+ C.health = min(C.health + 10, C.max_health)
+ if(uses_alloy)
+ stored_alloy = max(0, stored_alloy - 1)
+
+
+/obj/structure/clockwork/mending_motor/attack_hand(mob/living/user)
+ if(user.canUseTopic(src)) //Unnecessary?
+ if(!stored_alloy)
+ user << "[src] needs more replicant alloy to function!"
+ return 0
+ toggle(user)
+
+/obj/structure/clockwork/mending_motor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user))
+ if(stored_alloy + 10 > max_alloy)
+ user << "[src] is too full to accept any more alloy!"
+ return 0
+ user.whisper("Genafzhgr vagb jngre.")
+ user.visible_message("[user] liquifies [I] and pours it onto [src].", \
+ "You liquify [src] and pour it onto [src], which transfers the alloy into its reserves.")
+ stored_alloy = min(max(0, stored_alloy + 10), max_alloy)
+ user.drop_item()
+ qdel(I)
+ return 1
+ ..()
+
+/obj/structure/clockwork/mending_motor/proc/toggle(mob/living/user)
+ active = !active
+ if(user && is_servant_of_ratvar(user))
+ user.visible_message("[user] [active ? "en" : "dis"]ables [src].", "You [active ? "en" : "dis"]able [src].")
+ if(active)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]_inactive"
+
+///////////////////////
+// CLOCKWORK EFFECTS //
+///////////////////////
+
+/obj/effect/clockwork
+ name = "meme machine"
+ desc = "Still don't know what it is."
+ var/clockwork_desc = "A fabled artifact from beyond the stars. Contains concentrated meme essence." //Shown to clockwork cultists instead of the normal description
+ icon = 'icons/effects/clockwork_effects.dmi'
+ icon_state = "ratvars_flame"
+ anchored = 1
+ density = 0
+ opacity = 0
+
+/obj/effect/clockwork/New()
+ ..()
+ all_clockwork_objects += src
+
+/obj/effect/clockwork/Destroy()
+ all_clockwork_objects -= src
+ return ..()
+
+/obj/effect/clockwork/examine(mob/user)
+ if(is_servant_of_ratvar(user) && clockwork_desc)
+ desc = clockwork_desc
+ ..()
+ desc = initial(desc)
+
+/obj/effect/clockwork/judicial_marker //Judicial marker: Created by the judicial visor. After four seconds, stuns any non-servants nearby and damages Nar-Sian cultists.
+ name = "judicial marker"
+ desc = "You get the feeling that you shouldn't be standing here."
+ clockwork_desc = "A sigil that will soon erupt and smite any unenlightened nearby."
+ icon = 'icons/effects/96x96.dmi'
+ pixel_x = -30
+ pixel_y = -30
+ layer = 2.01
+
+/obj/effect/clockwork/judicial_marker/New()
+ ..()
+ flick("judicial_marker", src)
+ spawn(25) //Utilizes spawns due to how it works with Ratvar's flame
+ flick("judicial_explosion", src)
+ spawn(15)
+ for(var/mob/living/L in range(1, src))
+ if(is_servant_of_ratvar(L))
+ continue
+ if(!iscultist(L))
+ L << "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]"
+ L.Weaken(8)
+ else
+ L << "\"Keep an eye out, filth.\"\n[!issilicon(L) ? "An unseen force piledrives you into the ground!" : "ERROR: Motor servos damaged by external source!"]"
+ L.Weaken(10)
+ L.adjustBruteLoss(10)
+ qdel(src)
+ return 1
+
+/obj/effect/clockwork/spatial_gateway //Spatial gateway: A one-way rift to another location.
+ name = "spatial gateway"
+ desc = "A gently thrumming tear in reality."
+ clockwork_desc = "A gateway in reality. It can either send or receive, but not both."
+ icon_state = "spatial_gateway"
+ density = 1
+ var/sender = TRUE //If this gateway is made for sending, not receiving
+ var/lifetime = 25 //How many deciseconds this portal will last
+ var/uses = 1 //How many objects or mobs can go through the portal
+ var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one
+
+/obj/effect/clockwork/spatial_gateway/New()
+ ..()
+ spawn(1)
+ if(!linked_gateway)
+ qdel(src)
+ return 0
+ else
+ if(linked_gateway.sender == sender)
+ linked_gateway.sender = !sender
+ spawn(lifetime)
+ if(src)
+ qdel(src)
+
+/obj/effect/clockwork/spatial_gateway/Destroy()
+ visible_message("[src] flickers and closes!")
+ animate(src, transform = matrix() - matrix(), time = 10)
+ spawn(10)
+ ..()
+
+/obj/effect/clockwork/spatial_gateway/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user) || isobserver(user))
+ user << "This gateway can only [sender ? "send" : "receive"] objects."
+
+/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user)
+ if(!user.canUseTopic(src))
+ return 0
+ user.visible_message("[user] climbs through [src]!", "You brace yourself and step through [src]...")
+ pass_through_gateway(user)
+ return 1
+
+/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/weapon/nullrod))
+ user.visible_message("[user] dispels [src] with [I]!", "You close [src] with [I]!")
+ qdel(linked_gateway)
+ qdel(src)
+ return 1
+ if(istype(I, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = I
+ if(!G.affecting)
+ return 0
+ user.visible_message("[user] shoves [G.affecting] into [src]!", "You shove [G.affecting] into [src]!")
+ pass_through_gateway(G.affecting)
+ qdel(G)
+ return 1
+ if(user.drop_item())
+ pass_through_gateway(I)
+ ..()
+
+/obj/effect/clockwork/spatial_gateway/Bumped(atom/A)
+ ..()
+ if(isliving(A) || istype(A, /obj/item))
+ pass_through_gateway(A)
+
+/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A)
+ if(!linked_gateway)
+ qdel(src)
+ return 0
+ if(!sender)
+ visible_message("[A] bounces off of [src]!")
+ return 0
+ if(isliving(A))
+ var/mob/living/user = A
+ user << "You pass through [src] and appear elsewhere!"
+ linked_gateway.visible_message("A shape appears in [linked_gateway] before emerging!")
+ playsound(src, 'sound/effects/EMPulse.ogg', 50, 1)
+ playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1)
+ transform = matrix() * 1.5
+ animate(src, transform = matrix() / 1.5, time = 10)
+ linked_gateway.transform = matrix() * 1.5
+ animate(linked_gateway, transform = matrix() / 1.5, time = 10)
+ if(ismob(A))
+ var/mob/M = A
+ M.forceMove(get_turf(linked_gateway))
+ else
+ A.loc = get_turf(linked_gateway)
+ uses = max(0, uses - 1)
+ linked_gateway.uses = max(0, uses - 1)
+ spawn(10)
+ if(!uses)
+ qdel(src)
+ qdel(linked_gateway)
+ return 1
+
+/obj/effect/clockwork/general_marker
+ name = "general marker"
+ desc = "Some big guy."
+ clockwork_desc = "One of Ratvar's generals."
+ alpha = 200
+ layer = 10
+
+/obj/effect/clockwork/general_marker/New()
+ ..()
+ playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
+ animate(src, alpha = 0, time = 10)
+ spawn(10)
+ qdel(src)
+
+/obj/effect/clockwork/general_marker/nezbere
+ name = "Nezbere, the Brass Eidolon"
+ desc = "A towering colossus clad in nigh-impenetrable brass armor. Its gaze is stern yet benevolent, even upon you."
+ clockwork_desc = "One of Ratvar's four generals. Nezbere is responsible for the design, testing, and creation of everything in Ratvar's domain."
+ icon = 'icons/effects/340x428.dmi'
+ icon_state = "nezbere"
+ pixel_x = -154
+ pixel_y = -192
+
+/obj/effect/clockwork/general_marker/sevtug
+ name = "Sevtug, the Formless Pariah"
+ desc = "A sinister cloud of purple energy. Looking at it gives you a headache."
+ clockwork_desc = "One of Ratvar's four generals. Sevtug taught him how to manipulate minds and is one of his oldest allies."
+ icon = 'icons/effects/211x247.dmi'
+ icon_state = "sevtug"
+ pixel_x = -113
+ pixel_y = -131
+
+/obj/effect/clockwork/general_marker/nzcrentr
+ name = "Nzcrentr, the Forgotten Arbiter"
+ desc = "A terrifying war machine crackling with limitless energy."
+ clockwork_desc = "One of Ratvar's four generals. Nzcrentr is the result of Neovgre - Nezbere's finest war machine, commandeerable only be a mortal - fusing with its pilot and driving her \
+ insane. Nzcrentr seeks out any and all sentient life to slaughter it for sport."
+ icon = 'icons/effects/254x361.dmi'
+ icon_state = "nzcrentr"
+ pixel_x = -110
+ pixel_y = -163
+
+/obj/effect/clockwork/general_marker/inathneq
+ name = "Inath-Neq, the Resonant Cogwheel"
+ desc = "A humanoid form blazing with blue fire. It radiates an aura of kindness and caring."
+ clockwork_desc = "One of Ratvar's four generals. Before her current form, Inath-Neq was a powerful warrior priestess commanding the Resonant Cogs, a sect of Ratvarian warriors renowned for \
+ their prowess. After a lost battle with Nar-Sian cultists, Inath-Neq was struck down and stated in her dying breath, \
+ \"The Resonant Cogs shall not fall silent this day, but will come together to form a wheel that shall never stop turning.\" Ratvar, touched by this, granted Inath-Neq an eternal body and \
+ merged her soul with those of the Cogs slain with her on the battlefield."
+ icon = 'icons/effects/187x381.dmi'
+ icon_state = "inath-neq"
+ pixel_x = -91
+ pixel_y = -199
+
+/obj/effect/clockwork/sigil //Sigils: Rune-like markings on the ground with various effects.
+ name = "sigil"
+ desc = "A strange set of markings drawn on the ground."
+ clockwork_desc = "A sigil of some purpose."
+ icon_state = "sigil"
+ alpha = 25
+ var/affects_servants = FALSE
+
+/obj/effect/clockwork/sigil/attack_hand(mob/user)
+ if(iscarbon(user) && !user.stat && user.a_intent == "harm")
+ user.visible_message("[user] stamps out [src]!", "You stomp on [src], scattering it into thousands of particles.")
+ qdel(src)
+ return 1
+ ..()
+
+/obj/effect/clockwork/sigil/Crossed(atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!L.stat)
+ if(!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && affects_servants))
+ sigil_effects(L)
+ return 1
+ ..()
+
+/obj/effect/clockwork/sigil/proc/sigil_effects(mob/living/L)
+
+/obj/effect/clockwork/sigil/transgression //Sigil of Transgression: Stuns and flashes the first non-servant to walk on it. Nar-Sian cultists are damaged and knocked down.
+ name = "dull sigil"
+ desc = "A dull, barely-visible golden sigil. It's as though light was carved into the ground."
+ icon = 'icons/effects/clockwork_effects.dmi'
+ clockwork_desc = "A sigil that will stun the first non-servant to cross it. Nar-Sie's dogs will be knocked down."
+ color = rgb(255, 255, 0)
+
+/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L)
+ visible_message("[src] appears in a burst of light!")
+ for(var/mob/living/M in viewers(5, src))
+ if(!is_servant_of_ratvar(M))
+ M.flash_eyes()
+ if(!iscultist(L))
+ L << "An unseen force holds you in place!"
+ else
+ L << "\"Watch your step, wretch.\""
+ L.adjustBruteLoss(10)
+ L.Weaken(5)
+ L.Stun(5)
+ qdel(src)
+ return 1
+
+/obj/effect/clockwork/sigil/submission //Sigil of Submission: After a short time, converts any non-servant standing on it. Knocks down and silences them for five seconds afterwards.
+ name = "ominous sigil"
+ desc = "A brilliant golden sigil. Something about it really bothers you."
+ clockwork_desc = "A sigil that will enslave the first person to cross it, provided they do not move and they stand still for a brief time."
+ color = rgb(255, 255, 0)
+ alpha = 75
+
+/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
+ visible_message("[src] begins to glow a piercing magenta!")
+ animate(src, color = rgb(255, 0, 150), time = 30)
+ sleep(30)
+ if(get_turf(L) != get_turf(src))
+ animate(src, color = initial(color), time = 30)
+ return 0
+ L << "\"You belong to me now.\""
+ add_servant_of_ratvar(L)
+ L.Weaken(5) //Completely defenseless for a few seconds - mainly to give them time to read over the information they've just been presented with
+ L.Stun(5)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.silent += 5
+ for(var/mob/living/M in living_mob_list - L)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << "Sigil of Submission in [get_area(src)] [is_servant_of_ratvar(L) ? "" : "un"]successfully converted [L.real_name]!"
+ qdel(src)
+ return 1
+
+/obj/effect/clockwork/sigil/transmission
+ name = "suspicious sigil"
+ desc = "A barely-visible sigil. Things seem a bit quieter around it."
+ clockwork_desc = "A sigil that will listen for and transmit anything it hears."
+ color = rgb(75, 75, 75)
+ alpha = 50
+ flags = HEAR
+ languages = ALL
+
+/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << "Sigil of Transmission in [get_area(src)] crossed by [L.name]."
+ return 0
+
+/obj/effect/clockwork/sigil/transmission/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+ if(!message || !speaker)
+ return 0
+ var/parsed_message = "(Sigil of Tranmission in [get_area(src)]): [message]"
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << parsed_message
diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm
new file mode 100644
index 00000000000..c3cbc6f5aac
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm
@@ -0,0 +1,241 @@
+/obj/structure/clockwork/massive //For objects that are typically very large
+ name = "massive construct"
+ desc = "A very large construction."
+ layer = 10
+
+/obj/structure/clockwork/massive/celestial_gateway //The gateway to Reebe, from which Ratvar emerges
+ name = "Gateway to the Celestial Derelict"
+ desc = "A massive, thrumming rip in spacetime."
+ clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits."
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "clockwork_gateway_charging"
+ pixel_x = -30
+ pixel_y = -30
+ alpha = 175
+ health = 1000
+ max_health = 1000
+ var/progress_in_seconds = 0 //Once this reaches 300, it's game over
+ var/purpose_fulfilled = FALSE
+ var/first_sound_played = FALSE
+ var/second_sound_played = FALSE
+ var/third_sound_played = FALSE
+
+/obj/structure/clockwork/massive/celestial_gateway/New()
+ ..()
+ SSshuttle.emergencyNoEscape = TRUE
+ SSobj.processing += src
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << "A gateway to the Celestial Derelict has been created in [get_area(src)]!"
+
+/obj/structure/clockwork/massive/celestial_gateway/Destroy()
+ SSshuttle.emergencyNoEscape = FALSE
+ SSobj.processing -= src
+ if(!purpose_fulfilled)
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << "A gateway to the Celestial Derelict has fallen at [get_area(src)]!"
+ world << sound(null, 0, channel = 8)
+ ..()
+
+/obj/structure/clockwork/massive/celestial_gateway/destroyed()
+ visible_message("The [src] begins to pulse uncontrollably... you might want to run!")
+ world << sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50)
+ icon_state = "clockwork_gateway_disrupted"
+ takes_damage = FALSE
+ sleep(27)
+ animate(src, transform = matrix() * 2, time = 2)
+ explosion(src, 1, 3, 8, 8)
+ qdel(src)
+ return 1
+
+/obj/structure/clockwork/massive/celestial_gateway/ex_act(severity)
+ return 0 //Nice try, Toxins!
+
+/obj/structure/clockwork/massive/celestial_gateway/process()
+ if(prob(5))
+ for(var/mob/M in mob_list)
+ M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..."
+ if(!health)
+ return 0
+ progress_in_seconds++
+ switch(progress_in_seconds)
+ if(-INFINITY to 100)
+ if(!first_sound_played)
+ world << sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = 8, volume = 50)
+ first_sound_played = TRUE
+ icon_state = "clockwork_gateway_charging"
+ if(100 to 250)
+ if(!second_sound_played)
+ world << sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = 8, volume = 50)
+ second_sound_played = TRUE
+ icon_state = "clockwork_gateway_active"
+ if(250 to 300)
+ if(!third_sound_played)
+ world << sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = 8, volume = 50)
+ third_sound_played = TRUE
+ icon_state = "clockwork_gateway_closing"
+ if(300 to INFINITY)
+ if(!purpose_fulfilled)
+ takes_damage = FALSE
+ purpose_fulfilled = TRUE
+ animate(src, transform = matrix() * 1.5, time = 136)
+ world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds
+ sleep(136)
+ new/obj/structure/clockwork/massive/ratvar(get_turf(src))
+ qdel(src)
+
+/obj/structure/clockwork/massive/celestial_gateway/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user))
+ var/arrival_text = "IMMINENT"
+ if(300 - progress_in_seconds > 0)
+ arrival_text = "[max(300 - progress_in_seconds, 0)]s"
+ user << "Seconds until Ratvar's arrival: [arrival_text]"
+ switch(progress_in_seconds)
+ if(-INFINITY to 100)
+ user << "It's still opening."
+ if(100 to 250)
+ user << "It's reached the Celestial Derelict and is drawing power from it."
+ if(250 to INFINITY)
+ user << "Ratvar is coming through the gateway!"
+ else
+ switch(progress_in_seconds)
+ if(-INFINITY to 100)
+ user << "It's a swirling mass of blackness."
+ if(100 to 250)
+ user << "It seems to be leading somewhere."
+ if(250 to INFINITY)
+ user << "Something is coming through!"
+
+/obj/structure/clockwork/massive/ratvar
+ name = "Ratvar, the Clockwork Justiciar"
+ desc = "What is what is what are what real what is all a lie all a lie it's all a lie why how can what is"
+ clockwork_desc = "Ratvar, the Clockwork Justiciar, your master eternal."
+ icon = 'icons/effects/512x512.dmi'
+ icon_state = "ratvar"
+ pixel_x = -248
+ pixel_y = -248
+ takes_damage = FALSE
+ var/mob/living/prey //Whoever Ratvar is chasing
+ var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE
+
+/obj/structure/clockwork/massive/ratvar/New()
+ ..()
+ SSobj.processing += src
+ world << "\"I AM FREE!\""
+ ratvar_awakens = TRUE
+ spawn(50)
+ SSshuttle.emergency.request(null, 0.3)
+
+/obj/structure/clockwork/massive/ratvar/Destroy()
+ SSobj.processing -= src
+ world << "\"NO! I will not... be... banished... again...\""
+ ratvar_awakens = FALSE
+ ..()
+
+/obj/structure/clockwork/massive/ratvar/process()
+ for(var/atom/A in range(7, src))
+ A.ratvar_act()
+ if(clashing) //Doesn't move during a clash
+ return 0
+ var/dir_to_step_in = pick(cardinal)
+ if(!prey)
+ var/list/meals = list()
+ for(var/mob/living/L in living_mob_list)
+ if(L.z == z && !is_servant_of_ratvar(L) && L.mind)
+ meals += L
+ if(meals.len)
+ prey = pick(meals)
+ prey << "\"You will do.\"\n\
+ Something very large and very malevolent begins lumbering its way towards you..."
+ else
+ if(prob(10) || prey.stat == DEAD || is_servant_of_ratvar(prey) || prey.z != z)
+ prey << "\"How dull. Leave me.\"\n\
+ You feel tremendous relief as a set of horrible eyes loses sight of you..."
+ prey = null
+ else
+ if(prob(75))
+ dir_to_step_in = get_dir(src, prey)
+ for(var/i in 1 to 2)
+ loc = get_step(src, dir_to_step_in)
+
+/obj/structure/clockwork/massive/ratvar/narsie_act()
+ if(clashing)
+ return 0
+ clashing = TRUE
+ world << "\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\""
+ world << "\"Ratvar?! How?!\""
+ for(var/obj/singularity/narsie/N in range(7, src))
+ clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES
+ N.clashing = TRUE
+ break
+ return 1
+
+/obj/structure/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) //IT'S TIME FOR A BATTLE OF THE ELDER GODS
+ var/winner = "Undeclared"
+ var/base_victory_chance = 0
+ while(TRUE)
+ world << 'sound/magic/clockwork/ratvar_attack.ogg'
+ sleep(5.2)
+ for(var/mob/M in mob_list)
+ if(M.client)
+ M.client.color = rgb(150, 100, 0)
+ spawn(1)
+ M.client.color = initial(M.client.color)
+ shake_camera(M, 4, 3)
+ var/r_success_modifier = (ticker.mode.servants_of_ratvar.len * 2) //2% for each cultist
+ var/n_success_modifier = (ticker.mode.cult.len * 2)
+ if(prob(base_victory_chance + r_success_modifier))
+ winner = "Ratvar"
+ break
+ sleep(rand(2,5))
+ world << 'sound/magic/clockwork/narsie_attack.ogg'
+ sleep(7.4)
+ for(var/mob/M in mob_list)
+ if(M.client)
+ M.client.color = rgb(200, 0, 0)
+ spawn(1)
+ M.client.color = initial(M.client.color)
+ shake_camera(M, 4, 3)
+ if(prob(base_victory_chance + n_success_modifier))
+ winner = "Nar-Sie"
+ break
+ base_victory_chance++ //The clash has a higher chance of resolving each time both gods attack one another
+ switch(winner)
+ if("Ratvar")
+ world << "\"[pick("DIE! DIE! DIE!", "RAAAAAAAAAAAAAHH!", "FILTH!!!", "SUFFER!!!", "EBG SBE PRAGHEVRF NF V UNIR!!")]\""
+ world << "\"[pick("Nooooo...", "Not die. To y-", "Die. Ratv-", "Sas tyen re-")]\""
+ world << 'sound/magic/clockwork/anima_fragment_attack.ogg'
+ world << 'sound/magic/demon_dies.ogg'
+ clashing = FALSE
+ qdel(narsie)
+ return 1
+ if("Nar-Sie")
+ world << "\"[pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")]\"" //Broken English
+ world << 'sound/magic/demon_attack1.ogg'
+ world << 'sound/magic/clockwork/anima_fragment_death.ogg'
+ narsie.clashing = FALSE
+ qdel(src)
+ return 1
+
+/atom/proc/ratvar_act() //Called on everything near Ratvar
+ return
+
+/turf/closed/wall/ratvar_act() //Walls and floors are changed to their clockwork variants
+ if(prob(20))
+ ChangeTurf(/turf/closed/wall/clockwork)
+/turf/open/floor/ratvar_act()
+ if(prob(20))
+ ChangeTurf(/turf/open/floor/clockwork)
+
+/obj/structure/window/ratvar_act() //Windows turn yellow
+ color = rgb(75, 53, 0)
+
+/mob/living/ratvar_act()
+ add_servant_of_ratvar(src)
+
+/mob/dead/observer/ratvar_act() //Ghosts flash yellow for a second
+ var/old_color = color
+ color = rgb(75, 53, 0) //A nice brassy yellow
+ animate(src, color = old_color, time = 10)
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
new file mode 100644
index 00000000000..98462c9dc26
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -0,0 +1,1016 @@
+/*
+Tiers and Requirements
+
+Pieces of scripture require certain follower counts, contruction value, and active caches in order to recite.
+Drivers: Unlocked by default
+Scripts: 5 servants and a cache
+Applications: 8 servants, 3 caches, and 50 CV
+Revenant: 10 servants and 100 CV
+Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
+*/
+
+/datum/clockwork_scripture
+ var/name = "scripture"
+ var/desc = "Ancient Ratvarian lore. This piece seems particularly mundane."
+ var/list/invocations = list() //Spoken over time in the ancient language of Ratvar. See clock_unsorted.dm for more details on the language and how to make it.
+ var/channel_time = 10 //In deciseconds, how long a ritual takes to chant
+ var/list/required_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components required
+ var/list/consumed_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components consumed
+ var/obj/item/clockwork/slab/slab //The parent clockwork slab
+ var/mob/living/invoker //The slab's holder
+ var/whispered = FALSE //If the invocation is whispered rather than spoken aloud
+ var/consumed_component_override = FALSE //If consumed components are unique to a scripture regardless of tier
+ var/usage_tip = "This piece seems to serve no purpose and is a waste of components." //A generalized tip that gives advice on a certain scripture
+ var/invokers_required = 1 //How many people are required, assuming that a scripture requires multiple
+ var/multiple_invokers_used = FALSE //If scripture requires more than one invoker
+ var/multiple_invokers_optional = FALSE //If scripture can have multiple invokers to bolster its effects
+ var/tier = SCRIPTURE_PERIPHERAL //The scripture's tier
+
+/datum/clockwork_scripture/New()
+ ..()
+ if(tier < SCRIPTURE_DRIVER && !consumed_component_override) //Anything above a driver consumes components
+ consumed_components = required_components
+
+/datum/clockwork_scripture/proc/run_scripture()
+ if(can_recite() && check_special_requirements())
+ slab.busy = "Invocation ([name]) in progress"
+ if(recital() && check_special_requirements())
+ slab.busy = null
+ if(scripture_effects() && check_special_requirements() && (!ratvar_awakens && !slab.no_cost))
+ for(var/i in required_components)
+ if(tier <= SCRIPTURE_DRIVER || consumed_component_override)
+ if(clockwork_component_cache[i] >= consumed_components[i]) //Draw components from the global cache first
+ clockwork_component_cache[i] -= consumed_components[i]
+ else
+ slab.stored_components[i] -= consumed_components[i]
+ else
+ if(clockwork_component_cache[i] >= required_components[i])
+ clockwork_component_cache[i] -= required_components[i]
+ else
+ slab.stored_components[i] -= required_components[i]
+ if(slab)
+ slab.busy = null
+ qdel(src)
+ return 1
+
+/datum/clockwork_scripture/proc/can_recite() //If the words can be spoken
+ if(!ticker || !ticker.mode || !slab || !invoker)
+ return 0
+ if(!invoker.can_speak_vocal())
+ invoker << "You are unable to speak the words of the scripture!"
+ return 0
+ if(!ratvar_awakens && !slab.no_cost)
+ for(var/i in required_components)
+ if(slab.stored_components[i] < required_components[i] && clockwork_component_cache[i] < required_components[i])
+ invoker << "You lack the components to recite this piece of scripture! Check Recollection for component costs."
+ return 0
+ if(multiple_invokers_used && !multiple_invokers_optional)
+ var/nearby_servants = 0
+ for(var/mob/living/L in range(1, invoker))
+ nearby_servants++
+ if(nearby_servants < invokers_required)
+ invoker << "There aren't enough servants nearby ([nearby_servants]/[invokers_required])!"
+ return 0
+ return 1
+
+/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked three times during invocation
+ return 1
+
+/datum/clockwork_scripture/proc/recital() //The process of speaking the words
+ if(!channel_time && invocations.len)
+ if(multiple_invokers_used)
+ for(var/mob/living/L in range(1, invoker))
+ if(is_servant_of_ratvar(L))
+ for(var/invocation in invocations)
+ if(!whispered)
+ L.say(invocation)
+ else
+ L.whisper(invocation)
+ else
+ for(var/invocation in invocations)
+ if(!whispered)
+ invoker.say(invocation)
+ else
+ invoker.whisper(invocation)
+ invoker << "You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\"."
+ if(!channel_time)
+ return 1
+ for(var/invocation in invocations)
+ if(!do_after(invoker, channel_time / invocations.len, target = invoker))
+ slab.busy = null
+ return 0
+ if(!whispered)
+ invoker.say(invocation)
+ else
+ invoker.whisper(invocation)
+ return 1
+
+/datum/clockwork_scripture/proc/scripture_effects() //The actual effects of the recital after its conclusion
+
+
+
+/datum/clockwork_scripture/channeled //Channeled scripture begins instantly but runs constantly
+ var/chant_invocation = "NLL YZNB" //"AYY LMAO"
+ var/chant_amount = 5 //Times the chant is spoken
+ var/chant_interval = 10 //Amount of deciseconds between times the chant is actually spoken aloud
+
+/datum/clockwork_scripture/channeled/scripture_effects()
+ for(var/i in 1 to chant_amount)
+ if(!can_recite())
+ break
+ if(!do_after(invoker, chant_interval, target = invoker))
+ break
+ if(!whispered)
+ invoker.say(chant_invocation)
+ else
+ invoker.whisper(chant_invocation)
+ chant_effects()
+ if(invoker && slab)
+ invoker << "You cease your chant."
+ chant_end_effects()
+ return 1
+
+/datum/clockwork_scripture/channeled/proc/chant_effects() //The chant's periodic effects
+/datum/clockwork_scripture/channeled/proc/chant_end_effects() //The chant's effect upon ending
+
+
+
+/datum/clockwork_scripture/create_object //Creates an object at the invoker's feet
+ var/object_path = /obj/item/clockwork //The path of the object created
+ var/creator_message = "You create a meme." //Shown to the invoker
+ var/observer_message
+
+/datum/clockwork_scripture/create_object/scripture_effects()
+ if(creator_message && observer_message)
+ invoker.visible_message(observer_message, creator_message)
+ else if(creator_message)
+ invoker << creator_message
+ new object_path (get_turf(invoker))
+ return 1
+
+
+
+/datum/clockwork_scripture/targeted //Accepts a name and affects that target
+ var/target_name //The inputted name, used to find targets
+ var/mob/living/target //The target mob
+ var/affects_servants = FALSE //If servants are valid targets
+
+/datum/clockwork_scripture/targeted/check_special_requirements()
+ while(!target)
+ target_name = stripped_input(invoker, "Enter the actual name of a target (case-sensitive).", name)
+ if(!target_name)
+ return 0
+ target = find_target()
+ if(target)
+ if(!target.mind)
+ invoker << "[target] has no mind!"
+ target = null
+ if(target.stat)
+ invoker << "[target] is dead or unconscious!"
+ target = null
+ if(is_servant_of_ratvar(target) && !affects_servants)
+ invoker << "[target] is a servant, and [name] cannot target servants!"
+ target = null
+ return 1
+
+/datum/clockwork_scripture/targeted/proc/find_target()
+ for(var/mob/living/L in living_mob_list)
+ if(L.real_name == target_name)
+ if(is_servant_of_ratvar(L) && !affects_servants)
+ return 0
+ return L
+ return 0
+
+/////////////
+// DRIVERS //
+/////////////
+
+/datum/clockwork_scripture/channeled/belligerent //Belligerent: Channeled for up to ten times over thirty seconds. Forces non-servants that can hear the chant to walk. Nar-Sian cultists are burned.
+ name = "Belligerent"
+ desc = "Forces all nearby non-servants to walk rather than run. Chanted every three seconds for up to thirty seconds."
+ chant_invocation = "Chav'fu gurve oyva-qarff!" //"Punish their blindness!"
+ chant_amount = 10
+ chant_interval = 30
+ required_components = list("belligerent_eye" = 1)
+ usage_tip = "Useful for crowd control in a populated area and disrupting mass movement."
+ tier = SCRIPTURE_DRIVER
+
+/datum/clockwork_scripture/channeled/belligerent/chant_effects()
+ for(var/mob/living/L in hearers(7, invoker))
+ if(!is_servant_of_ratvar(L) && L.m_intent != "walk")
+ if(!iscultist(L))
+ L << "Your legs feel heavy and weak!"
+ L.m_intent = "walk"
+ else
+ L << "Your legs burn with pain!"
+ L.m_intent = "walk"
+ L.apply_damage(5, BURN, "l_leg")
+ L.apply_damage(5, BURN, "r_leg")
+
+
+
+/datum/clockwork_scripture/create_object/sigil_of_transgression //Sigil of Transgression: Creates a sigil of transgression.
+ name = "Sigil of Transgression"
+ desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether."
+ invocations = list("Qvivavgl, qnmmyr...", "...gubfr jub gerffcnff'urer!") //"Divinity, dazzle those who trespass here!"
+ channel_time = 50
+ required_components = list("belligerent_eye" = 2)
+ consumed_components = list("belligerent_eye" = 1)
+ whispered = TRUE
+ object_path = /obj/effect/clockwork/sigil/transgression
+ creator_message = "A sigil silently appears below you. The next non-servant to cross it will be immobilized."
+ usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim."
+ tier = SCRIPTURE_DRIVER
+
+
+
+/datum/clockwork_scripture/vanguard //Vanguard: Provides thirty seconds of stun immunity. At the end of the thirty seconds, all stuns absorbed are stacked on the invoker.
+ name = "Vanguard"
+ desc = "Provides thirty seconds of stun immunity. At the end of the thirty seconds, the invoker is stunned for the equivalent of how many stuns they absorbed. Excessive absorption will cause unconsciousness."
+ invocations = list("Fuvryq zr...", "...sebz qnexarff!") //"Shield me from darkness!"
+ channel_time = 30
+ required_components = list("vanguard_cogwheel" = 1)
+ usage_tip = "Your slab will be unusable while it is shielding you from stuns."
+ tier = SCRIPTURE_DRIVER
+
+/datum/clockwork_scripture/vanguard/scripture_effects()
+ for(var/obj/item/clockwork/slab/S in invoker.GetAllContents())
+ S.busy = "Vanguard in progress" //To prevent circumventing the Vanguard by carrying multiple slabs
+ invoker.stun_absorption = TRUE
+ invoker.visible_message("[invoker] begins to faintly glow!", "You will absorb all stuns for the next thirty seconds.")
+ sleep(300)
+ if(!invoker)
+ return 0
+ invoker.stun_absorption = FALSE
+ if(invoker.stun_absorption_count && invoker.stat != DEAD)
+ invoker.Stun(invoker.stun_absorption_count)
+ invoker.Weaken(invoker.stun_absorption_count)
+ invoker << "The weight of the vanguard's protection crashes down upon you!"
+ if(invoker.stun_absorption_count >= 25)
+ invoker << "You faint from the exertion!"
+ invoker.Paralyse(invoker.stun_absorption_count * 1.5)
+ invoker.stun_absorption_count = 0
+ for(var/obj/item/clockwork/slab/S in invoker.GetAllContents())
+ S.busy = null
+ return 1
+
+
+
+/datum/clockwork_scripture/sentinels_compromise //Sentinel's Compromise: Allows the invoker to select a nearby servant convert their brute and burn damage into half as much toxin damage.
+ name = "Sentinel's Compromise"
+ desc = "Heals all brute and burn damage on a nearby friendly cultist, but deals 50% of that amount as toxin damage."
+ invocations = list("Zraq gur jbhaqf-bs...", "...zl vasrevbe syrfu.") //"Mend the wounds of my inferior flesh."
+ channel_time = 30
+ required_components = list("vanguard_cogwheel" = 2)
+ consumed_components = list("vanguard_cogwheel" = 1)
+ usage_tip = "You cannot target yourself with the Compromise."
+ tier = SCRIPTURE_DRIVER
+
+/datum/clockwork_scripture/sentinels_compromise/scripture_effects()
+ var/list/nearby_cultists = list()
+ for(var/mob/living/C in range(7, invoker))
+ if(C == invoker)
+ continue
+ if(C.stat != DEAD && is_servant_of_ratvar(C))
+ nearby_cultists += C
+ if(!nearby_cultists.len)
+ invoker << "There are no eligible cultists nearby!"
+ return 0
+ var/mob/living/L = input(invoker, "Choose a fellow servant to heal.", name) as null|anything in nearby_cultists
+ if(!L || !invoker || !invoker.canUseTopic(slab))
+ return 0
+ if(!L.getBruteLoss() && !L.getFireLoss())
+ invoker << "[L] is not burned or bruised!"
+ return 0
+ L.adjustToxLoss(L.getBruteLoss() / 2)
+ L.adjustToxLoss(L.getFireLoss() / 2)
+ L.adjustBruteLoss(-L.getBruteLoss())
+ L.adjustFireLoss(-L.getFireLoss())
+ invoker << "You bathe [L] in the light of Ratvar!"
+ L.visible_message("A white light washes over [L], mending their bruises and burns!", \
+ "You feel Ratvar's energy healing your wounds, but a deep nausea overcomes you!")
+ playsound(get_turf(L), 'sound/magic/Staff_Healing.ogg', 50, 1)
+ return 1
+
+
+
+/datum/clockwork_scripture/guvax //Guvax: Converts anyone adjacent to the invoker after completion.
+ name = "Guvax"
+ desc = "Enlists all nearby unshielded creatures into servitude to Ratvar. Also purges holy water from nearby servants."
+ invocations = list("Rayvtugra guvf urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hageh'guf naq ubabe Ratvar.")
+ channel_time = 60
+ required_components = list("guvax_capacitor" = 1)
+ usage_tip = "Only works on those in melee range and does not penetrate loyalty implants. Much more efficient than a Sigil of Submission."
+ tier = SCRIPTURE_DRIVER
+
+/datum/clockwork_scripture/guvax/scripture_effects()
+ for(var/mob/living/L in hearers(1, get_turf(invoker))) //Affects silicons
+ if(!is_servant_of_ratvar(L))
+ add_servant_of_ratvar(L)
+ else
+ if(L.reagents && L.reagents.has_reagent("holywater"))
+ L.reagents.remove_reagent("holywater", 1000)
+ L << "Ratvar's light flares, banishing the darkness. Your devotion remains intact!"
+ for(var/mob/living/silicon/ai/A in range(1, get_turf(invoker))) //Seems necessary because AIs don't count as hearers for some reason
+ add_servant_of_ratvar(A)
+ return 1
+
+
+
+/datum/clockwork_scripture/create_object/sigil_of_submission //Sigil of Submission: Creates a sigil of submission.
+ name = "Sigil of Submission"
+ desc = "Places a subtle sigil that will enslave any valid beings standing on it after a time."
+ invocations = list("Qvivavgl, rayvtugra...", "...gubfr jub gerfcnff urer!")
+ channel_time = 60
+ required_components = list("guvax_capacitor" = 2)
+ consumed_components = list("guvax_capacitor" = 1)
+ whispered = TRUE
+ object_path = /obj/effect/clockwork/sigil/submission
+ creator_message = "A 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 should not be your primary conversion method - use Guvax for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted."
+ tier = SCRIPTURE_DRIVER
+
+
+
+/datum/clockwork_scripture/replicant //Replicant: Creates a new clockwork slab. Doesn't use create_object because of its unique behavior.
+ name = "Replicant"
+ desc = "Creates a new clockwork slab."
+ invocations = list("Z`rgny, orpbzr terngre!")
+ channel_time = 0
+ required_components = list("replicant_alloy" = 1)
+ consumed_components = list("replicant_alloy" = 1) //People were spamming slabs to get infinite components. You chose this.
+ whispered = TRUE
+ usage_tip = "This is inefficient as a way to produce components, as it consumes them in the first place."
+ tier = SCRIPTURE_DRIVER
+
+/datum/clockwork_scripture/replicant/scripture_effects()
+ invoker << "You copy a piece of replicant alloy and command it into a new slab." //No visible message, for stealth purposes
+ var/obj/item/clockwork/slab/S = new(get_turf(invoker))
+ invoker.put_in_hands(S) //Put it in your hands if possible
+ return 1
+
+
+
+/datum/clockwork_scripture/create_object/tinkerers_cache //Tinkerer's Cache: Creates a tinkerer's cache.
+ name = "Tinkerer's Cache"
+ desc = "Forms a cache that can store an infinite amount of components. All caches are linked."
+ invocations = list("Ohvyqva...", "...n qvfcrafre!")
+ channel_time = 40
+ required_components = list("replicant_alloy" = 2)
+ consumed_components = list("replicant_alloy" = 1)
+ object_path = /obj/structure/clockwork/cache
+ creator_message = "You form a tinkerer's cache, which is capable of storing components."
+ observer_message = "A hollow brass spire rises and begins to blaze!"
+ usage_tip = "Slabs will draw components from the global cache before the slab's own repositories, making caches very efficient."
+ tier = SCRIPTURE_DRIVER
+
+
+
+/datum/clockwork_scripture/create_object/wraith_spectacles //Wraith Spectacles: Creates a pair of wraith spectacles.
+ name = "Wraith Spectacles"
+ desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision."
+ invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.")
+ channel_time = 0
+ required_components = list("hierophant_ansible" = 1)
+ consumed_components = list("hierophant_ansible" = 2)
+ whispered = TRUE
+ object_path = /obj/item/clothing/glasses/wraith_spectacles
+ creator_message = "You form a pair of wraith spectacles, which will grant true sight when worn."
+ usage_tip = "\"True sight\" means that you are able to see through walls and in darkness."
+ tier = SCRIPTURE_DRIVER
+
+/////////////
+// SCRIPTS //
+/////////////
+
+/datum/clockwork_scripture/create_object/judicial_visor //Judicial Visor: Creates a judicial visor.
+ name = "Judicial Visor"
+ desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning and damaging the nonfaithful."
+ invocations = list("Tenag zr gur synzrf-bs Ratvar!")
+ channel_time = 0
+ required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 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. In addition, the flame itself is a powerful melee weapon."
+ tier = SCRIPTURE_SCRIPT
+
+
+
+/datum/clockwork_scripture/create_object/ocular_warden //Ocular Warden: Creates an ocular warden.
+ name = "Ocular Warden"
+ desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range."
+ invocations = list("Thneqvnaf...", "...bs gur Ratvar...", "...qrsraq!")
+ channel_time = 150
+ required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1)
+ object_path = /obj/structure/clockwork/ocular_warden
+ creator_message = "You form an ocular warden, which will focus its searing gaze upon nearby unenlightened."
+ observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!"
+ usage_tip = "Although powerful, the warden is very weak and should optimally be placed behind barricades."
+ tier = SCRIPTURE_SCRIPT
+
+
+
+/datum/clockwork_scripture/channeled/volt_void //Volt Void: Channeled for up to thirty times over thirty seconds. Consumes power from most power storages and deals slight burn damage to the invoker.
+ name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink"
+ desc = "Drains energy from nearby power sources, dealing slight fire damage depending on power consumed. Channeled every second for a maximum of thirty seconds."
+ chant_invocation = "Qenj punetr gb guvf furyy!"
+ chant_amount = 30
+ chant_interval = 10
+ required_components = list("belligerent_eye" = 1, "hierophant_ansible" = 1)
+ usage_tip = "Very powerful against cyborgs and can drain a power cell in seconds."
+ tier = SCRIPTURE_SCRIPT
+
+/datum/clockwork_scripture/channeled/volt_void/chant_effects()
+ playsound(invoker, 'sound/effects/EMPulse.ogg', 50, 1)
+ var/power_drained = 0
+ for(var/obj/machinery/power/apc/A in view(7, invoker))
+ if(A.cell.charge)
+ playsound(A, "sparks", 50, 1)
+ flick("apc-spark", A)
+ A.cell.charge = max(0, A.cell.charge - 500) //Better than a power sink!
+ power_drained += 500
+ if(!A.cell.charge && !A.shorted)
+ A.shorted = 1
+ A.visible_message("The [A.name]'s screen blurs with static.")
+ for(var/obj/machinery/power/smes/S in view(7, invoker))
+ if(S.charge)
+ S.charge = max(0, S.charge - 200)
+ power_drained += 200
+ if(!S.charge && !S.panel_open)
+ S.panel_open = TRUE
+ S.update_icon()
+ var/datum/effect_system/spark_spread/spks = new(get_turf(S))
+ spks.set_up(10, 0, get_turf(S))
+ spks.start()
+ qdel(spks)
+ S.visible_message("[S]'s panel flies open with a flurry of sparks.")
+ for(var/obj/machinery/light/L in view(7, invoker))
+ playsound(L, 'sound/effects/light_flicker.ogg', 50, 1)
+ L.flicker(2)
+ power_drained += 5
+ for(var/mob/living/silicon/robot/R in view(7, invoker))
+ if(!is_servant_of_ratvar(R) && R.cell.charge)
+ R.cell.charge = max(0, R.cell.charge - 500)
+ R << "ERROR: Power loss detected!"
+ var/datum/effect_system/spark_spread/spks = new(get_turf(R))
+ spks.set_up(3, 0, get_turf(R))
+ spks.start()
+ qdel(spks)
+ power_drained += 500
+ if(power_drained)
+ invoker.visible_message("[invoker] flares a brilliant orange!", "You feel the warmth of electricity running into your body.")
+ invoker.adjustFireLoss(power_drained / 200) //One point of burn damage for every (approximate) 200W drained - can be fatal if not careful
+ return 1
+
+
+
+/datum/clockwork_scripture/create_object/clockwork_proselytizer //Clockwork Proselytizer: Creates a clockwork proselytizer.
+ name = "Clockwork Proselytizer"
+ desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function."
+ invocations = list("Jvgu guvf qrivpr, uvf cerfrapr funyy or znqr xabja.")
+ channel_time = 0
+ required_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1)
+ whispered = TRUE
+ object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded
+ creator_message = "You form a clockwork proselytizer, which is already pre-loaded with a small amount of replicant alloy."
+ usage_tip = "Clockwork walls cause adjacent tinkerer's caches to generate components passively, making them a vital tool. Clockwork floors heal servants standing on them."
+ tier = SCRIPTURE_SCRIPT
+
+
+
+/datum/clockwork_scripture/fellowship_armory //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor.
+ name = "Fellowship Armory"
+ desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers."
+ invocations = list("Fuvryq zr...", "...jvgu gur sentzragf...", "...bs Ratvar!")
+ channel_time = 100
+ required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1)
+ usage_tip = "Before using, advise adjacent allies to remove their helmets, external suits, and shoes."
+ tier = SCRIPTURE_SCRIPT
+
+/datum/clockwork_scripture/fellowship_armory/scripture_effects()
+ for(var/mob/living/carbon/C in range(1, invoker))
+ if(!is_servant_of_ratvar(C))
+ continue
+ C.visible_message("Strange armor appears on [C]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.")
+ playsound(C, 'sound/magic/clockwork/fellowship_armory.ogg', 50, 1)
+ C.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head)
+ C.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit)
+ C.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes)
+ return 1
+
+
+
+/datum/clockwork_scripture/function_call //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons.
+ name = "Function Call"
+ desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear that will deal significant damage to Nar-Sie's dogs in addition to silicon lifeforms. \
+ It will vanish several minutes after being called."
+ invocations = list("Tenag zr...", "...gur zvtug-bs oenff!")
+ channel_time = 20
+ required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1)
+ whispered = TRUE
+ usage_tip = "The spear will snap in two when thrown but do massive damage."
+ tier = SCRIPTURE_SCRIPT
+
+/datum/clockwork_scripture/function_call/check_special_requirements()
+ if(!invoker.verbs & /mob/living/carbon/human/proc/function_call)
+ invoker << "You have already bound a Ratvarian spear to yourself!"
+ return 0
+ return ishuman(invoker)
+
+/datum/clockwork_scripture/function_call/scripture_effects()
+ invoker.visible_message("A shimmer of yellow light infuses [invoker]!", \
+ "You bind a Ratvarian spear to yourself. Use the \"Function Call\" verb in your Clockwork tab to call it forth.")
+ invoker.verbs += /mob/living/carbon/human/proc/function_call
+ return 1
+
+
+
+/datum/clockwork_scripture/spatial_gateway
+ name = "Spatial Gateway"
+ desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \
+ Each servant assisting in the invocation adds uses and duration to the gateway. Lasts for ten or more seconds or until it is out of uses."
+ invocations = list("Gryrcbegre...", "...pbzva evtug-hc!")
+ channel_time = 80
+ required_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1)
+ multiple_invokers_used = TRUE
+ multiple_invokers_optional = TRUE
+ usage_tip = "The gateway is strictly one-way and will only allow things through the invoker's portal."
+ tier = SCRIPTURE_SCRIPT
+
+/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
+ var/other_servants = 0
+ for(var/mob/living/L in living_mob_list)
+ if(L.z == invoker.z && is_servant_of_ratvar(L) && !L.stat != DEAD)
+ other_servants++
+ if(!other_servants)
+ invoker << "There are no other conscious servants on your z-level!"
+ return 0
+ return 1
+
+/datum/clockwork_scripture/spatial_gateway/scripture_effects()
+ var/portal_uses = 0
+ var/duration = 0
+ for(var/mob/living/L in range(1, invoker))
+ if(!L.stat && is_servant_of_ratvar(L))
+ portal_uses++
+ duration += 20 //2 seconds
+ if(ratvar_awakens)
+ portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
+ duration = max(duration, 30)
+ var/list/possible_servants = list()
+ for(var/mob/living/L in living_mob_list)
+ if(!L.stat && is_servant_of_ratvar(L) && !L.Adjacent(invoker) && L != invoker) //People right next to the invoker can't be portaled to, for obvious reasons
+ possible_servants += L
+ if(!possible_servants.len)
+ invoker << "There are no other eligible servants for teleportation!"
+ return 0
+ var/mob/living/chosen_servant = input(invoker, "Choose a servant to form a rift to.", "Spatial Gateway") as null|anything in possible_servants
+ if(!chosen_servant || !invoker.canUseTopic(slab))
+ return 0
+ invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \
+ "With a word, you rip open a one-way rift to [chosen_servant]. It will last for [duration / 10] seconds and has [portal_uses] use[portal_uses > 1 ? "s" : ""].")
+ var/obj/effect/clockwork/spatial_gateway/S1 = new(get_step(invoker, invoker.dir))
+ var/obj/effect/clockwork/spatial_gateway/S2 = new(get_step(chosen_servant, chosen_servant.dir))
+
+ //Set up the portals now that they've spawned
+ S1.linked_gateway = S2
+ S2.linked_gateway = S1
+ S1.sender = TRUE
+ S2.sender = FALSE
+ S1.lifetime = duration
+ S2.lifetime = duration
+ S1.uses = portal_uses
+ S2.uses = portal_uses
+ S2.visible_message("The air in front of [chosen_servant] ripples before suddenly tearing open!")
+ return 1
+
+
+
+/datum/clockwork_scripture/create_object/soul_vessel //Soul Vessel: Creates a soul vessel
+ name = "Soul Vessel"
+ desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar."
+ invocations = list("Ureq'gur fbhyf-bs gur oynf curz-bhf qnzarq!")
+ channel_time = 0
+ required_components = list("replicant_alloy" = 1, "guvax_capacitor" = 1)
+ whispered = TRUE
+ object_path = /obj/item/device/mmi/posibrain/soul_vessel
+ creator_message = "You form a soul vessel, which immediately begins drawing in the damned."
+ usage_tip = "The vessel functions as a servant for tier unlocking but not for invocation."
+ tier = SCRIPTURE_SCRIPT
+
+
+
+/datum/clockwork_scripture/break_will //Break Will: Deals minor brain damage and destroys the loyalty implants of nearby humans
+ name = "Break Will"
+ desc = "Deals minor brain damage and disables loyalty implants of everyone adjacent to the invoker."
+ invocations = list("Lbh ner jrnx.", "Lbh ner nyernql qrnq.", "Gurl jba'g fnir lbh.")
+ channel_time = 30
+ required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1)
+ usage_tip = "Extremely fast invocation time."
+ tier = SCRIPTURE_SCRIPT
+
+/datum/clockwork_scripture/scripture_effects()
+ for(var/mob/living/carbon/human/H in range(1, invoker))
+ if(is_servant_of_ratvar(H) || !isloyal(H))
+ continue
+ H.visible_message("[H] visibly trembles!", \
+ "The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.")
+ H.adjustBrainLoss(5)
+ for(var/obj/item/weapon/implant/loyalty/L in H)
+ if(L.implanted)
+ qdel(L)
+
+//////////////////
+// APPLICATIONS //
+//////////////////
+
+/datum/clockwork_scripture/create_object/anima_fragment //Anima Fragment: Creates an empty anima fragment
+ name = "Anima Fragment"
+ desc = "Creates a large shell fitted for soul vessels. The result is a powerful construct with low damage tolerance but exceptional melee power."
+ invocations = list("Pnyy sbegu...", "...gur fbyqvref-bs Nezbere.")
+ channel_time = 50
+ required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "replicant_alloy" = 1)
+ object_path = /obj/structure/clockwork/anima_fragment
+ creator_message = "You form an anima fragment, a powerful soul vessel receptable."
+ 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
+
+
+
+/datum/clockwork_scripture/create_object/sigil_of_transmission
+ name = "Sigil of Transmission"
+ desc = "Scribes an almost-invisible sigil below the invoker. This sigil will transmit anything it hears over the hierophant network."
+ invocations = list("Qvivavgl...", "...hairvy gurgehgu!")
+ channel_time = 50
+ required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1)
+ whispered = TRUE
+ object_path = /obj/effect/clockwork/sigil/transmission
+ creator_message = "A sigil silently appears below you. It will automatically transmit anything it hears over the hierophant network."
+ usage_tip = "Useful for eavesdropping or monitoring certain areas."
+ tier = SCRIPTURE_APPLICATION
+
+
+
+/datum/clockwork_scripture/memory_allocation //Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker.
+ name = "Memory Allocation"
+ desc = "Reserves a section of your brain to a second consciousness and fills this space with a clockwork marauder's essence. Slow but powerful, marauders serve a similar purpose to the alien \
+ holoparasites employed by the Syndicate - they live inside of their host and are commanded to defend them. However, unlike holoparasites, marauders cannot leave their host at will and must \
+ instead be called forth by the user, who does so by calling the marauder's name (the marauder may enter their host at will and do not need the host's input). Marauders themselves are \
+ invincible but are governed by a quirk known as fatigue. High fatigue slows down the marauder and makes them weaker, with lower fatigue doing the opposite. If a certain fatigue \
+ threshold is reached, the marauder is forced back into their host and must recuperate before being called forth again. Fatigue accumulates passively while the marauder is deployed and \
+ increases at a massive rate if the marauder is not near their host. It will heal itself at a fairly rapid rate while the marauder is within their host." //WALL O' TEXT HO, CAP'N!
+ invocations = list("Pnyy sbegu...", "gur qrsraqref-bs Inath-Neq.")
+ channel_time = 100
+ required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 3)
+ usage_tip = "Marauders are useful as personal bodyguards and frontline warriors, although they do little damage."
+ tier = SCRIPTURE_APPLICATION
+
+/datum/clockwork_scripture/memory_allocation/check_special_requirements()
+ for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in living_mob_list)
+ if(M.host == invoker)
+ invoker << "You can only house one marauder at a time!"
+ return 0
+ return 1
+
+/datum/clockwork_scripture/memory_allocation/scripture_effects()
+ return create_marauder()
+
+/datum/clockwork_scripture/memory_allocation/proc/create_marauder()
+ if(!can_recite())
+ return 0
+ invoker.visible_message("A yellow tendril appears from [invoker]'s [slab.name] and impales itself in their forehead!", \
+ "A tendril flies from [slab] into your forehead. You begin waiting while it painfully rearranges your thought pattern...")
+ invoker.notransform = TRUE //Vulnerable during the process
+ slab.busy = "Thought modification in process"
+ if(!do_after(invoker, 50, target = invoker))
+ invoker.visible_message("The tendril, covered in blood, retracts from [invoker]'s head and back into the [slab.name]!", \
+ "Total agony overcomes you as the tendril is forced out early!")
+ invoker.notransform = FALSE
+ invoker.Stun(5)
+ invoker.Weaken(5)
+ invoker.apply_damage(10, BRUTE, "head")
+ slab.busy = null
+ return 0
+ invoker.notransform = FALSE
+ slab.busy = null
+ var/list/marauder_candidates = get_candidates(ROLE_SERVANT_OF_RATVAR)
+ if(!marauder_candidates.len)
+ invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \
+ "The tendril was unsuccessful! Perhaps you should try again another time.")
+ return 0
+ var/client/new_marauder = pick(marauder_candidates)
+ var/mob/living/simple_animal/hostile/clockwork_marauder/M = new(invoker)
+ M.client = new_marauder
+ M.host = invoker
+ M << M.playstyle_string
+ M << "Your true name is \"[M.true_name]\". You can change this once by using the Change True Name verb in your Marauder tab."
+ add_servant_of_ratvar(M, TRUE)
+ invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \
+ "The procedure was successful! [M.true_name], a clockwork marauder, has taken up residence in your mind. Communicate with it via the \"Linked Minds\" ability in the \
+ Clockwork tab.")
+ invoker.verbs += /mob/living/proc/talk_with_marauder
+ return 1
+
+
+
+/datum/clockwork_scripture/targeted/justiciars_gavel //Justiciar's Gavel: Deals extreme but temporary brain damage to a target with the inputted name and knocks them out for a brief time.
+ name = "Justiciar's Gavel"
+ desc = "Deals massive brain damage to and knocks out a target with the inputted name. This brain damage will slowly recover itself."
+ invocations = list("Guvf urngura...", "...unf jebatrq lbh!")
+ channel_time = 40
+ required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "hierophant_ansible" = 1)
+ invokers_required = 3
+ multiple_invokers_used = TRUE
+ usage_tip = "Also functions on silicon-based lifeforms, although it will not apply brain damage."
+ tier = SCRIPTURE_APPLICATION
+
+/datum/clockwork_scripture/targeted/justiciars_gavel/scripture_effects()
+ if(iscarbon(target))
+ if(iscultist(target))
+ target.visible_message("Blood sprays from a sudden wound on [target]'s head!", \
+ "\"If you like wasting your own blood so much, pig, why don't you bathe in it?\"\n\
+ An unbearable pain invades your mind, rupturing your head and wiping all thought.")
+ target.apply_damage(rand(20, 30), BRUTE, "head")
+ else
+ target.visible_message("[target]'s face falls lax, their eyes dimming.", \
+ "\"I don't think you need that brain. Not like you use it anyway.\"\n\
+ A savage pain invades your mind, driving out all conscious thought.")
+ target.adjustBrainLoss(200)
+ if(target.reagents)
+ target.reagents.add_reagent("mannitol", 25) //Enough to cure most of it but not all of it
+ target.Paralyse(10)
+ else if(issilicon(target))
+ target.visible_message("[target] suddenly shuts down!", \
+ "\"NOB ZVANG-BA! You disgust me, abomination of circuits and wires.\"\n\
+ Factory reset sequence initiated by foreign signal. Entering standby mode and halting sequence.")
+ target.Weaken(10)
+ return 1
+
+
+
+/datum/clockwork_scripture/create_object/interdiction_lens //Interdiction Lens: Creates a powerful obelisk that can perform a variety of powerful sabotages every five minutes.
+ name = "Interdiction Lens"
+ desc = "Creates a clockwork totem that can sabotage a variety of mechanical apparatus. Requires a lengthy recharge between uses."
+ invocations = list("Znl guvf boryvfx...", "...fuebhq gur snyfr fhaf!")
+ channel_time = 60
+ required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3)
+ object_path = /obj/structure/clockwork/interdiction_lens
+ creator_message = "You form an interdiction lens, which can disrupt machinery every few minutes."
+ observer_message = "A brass obelisk rises from the ground, a purple gem appearing in its center!"
+ invokers_required = 2
+ multiple_invokers_used = TRUE
+ usage_tip = "Can disrupt telecommunications, disable all cameras, or disable all cyborgs."
+ tier = SCRIPTURE_APPLICATION
+
+
+
+/datum/clockwork_scripture/create_object/mending_motor //Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume replicant alloy.
+ name = "Mending Motor"
+ desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy to function."
+ invocations = list("Znl guvf boryvfx...", "...zraq bhe qragf naq fpengpurf!")
+ channel_time = 60
+ required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 3)
+ object_path = /obj/structure/clockwork/mending_motor/prefilled
+ creator_message = "You form a mending motor, which will consume replicant alloy to mend the wounds of mechanized servants."
+ observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!"
+ invokers_required = 2
+ multiple_invokers_used = TRUE
+ usage_tip = "Powerful healing but somewhat inefficient."
+ tier = SCRIPTURE_APPLICATION
+
+
+
+/datum/clockwork_scripture/create_object/tinkerers_daemon //Tinkerer's Daemon: Creates a shell that can be attached to a tinkerer's cache to grant it passive component creation.
+ name = "Tinkerer's Daemon"
+ desc = "Forms a daemon shell that can be attached to a tinkerer's cache to add new components at a healthy rate. It will only function if it is outnumbered by servants in a ratio of 5:1."
+ invocations = list("Pbaf'gehpg, Ratvar cnegf...", "...lrg ubyq terngarff!")
+ channel_time = 40
+ required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1)
+ object_path = /obj/item/clockwork/daemon_shell
+ creator_message = "You form a daemon shell. Attach it to a tinkerer's cache to increase its rate of production."
+ usage_tip = "Vital to increasing component generation."
+ tier = SCRIPTURE_APPLICATION
+
+//////////////
+// REVENANT //
+//////////////
+//Revenant scriptures are different than any others. They are all very powerful, but also very costly and have drawbacks. This might be a very long invocation time or a very high component cost.
+
+/datum/clockwork_scripture/invoke_nezbere //Invoke Nezbere, the Brass Eidolon: Invokes Nezbere, bolstering the strength of many clockwork items for one minute.
+ name = "Invoke Nezbere, the Brass Eidolon"
+ desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \
+ clockwork proselytizers will cost no replicant alloy to use."
+ invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!")
+ channel_time = 150
+ required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
+ usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, and mending motors will require no alloy."
+ tier = SCRIPTURE_REVENANT
+
+/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
+ if(ratvar_awakens)
+ invoker << "\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"\n\
+ Nezbere will not grant his power while Ratvar's dwarfs his own!"
+ return 0
+ if(clockwork_generals_invoked["nezbere"])
+ invoker << "\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"\n\
+ Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon."
+ return 0
+ return 1
+
+/datum/clockwork_scripture/invoke_nezbere/scripture_effects()
+ var/obj/effect/clockwork/general_marker/nezbere/N = new(get_turf(invoker))
+ N.visible_message("\"V urrq lbhe pnyy, punz'cvbaf. Znl lbhe negvs-npgf oevat ehva hcba gur urnguraf gung bccbfr bhe znfgre!\"")
+ clockwork_generals_invoked["nezbere"] = TRUE
+ for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius
+ W.damage_per_tick *= 3
+ W.sight_range *= 3
+ for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) //Proselytizers no longer require alloy
+ P.uses_alloy = FALSE
+ for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) //Daemons produce components twice as quickly
+ D.production_interval /= 2
+ for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) //Mending motors no longer require alloy
+ M.uses_alloy = FALSE
+ spawn(600)
+ for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects)
+ W.damage_per_tick = initial(W.damage_per_tick)
+ W.sight_range = initial(W.sight_range)
+ for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects)
+ P.uses_alloy = TRUE
+ for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects)
+ D.production_interval = initial(D.production_interval)
+ for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects)
+ M.uses_alloy = TRUE
+ spawn(3000) //5 minutes
+ clockwork_generals_invoked["nezbere"] = FALSE
+ return 1
+
+
+
+/datum/clockwork_scripture/targeted/invoke_sevtug //Invoke Sevtug, the Formless Pariah: Allows the invoker to silently control the mind of a defined target for one minute.
+ name = "Invoke Sevtug, the Formless Pariah"
+ desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to silently dominate the mind of a defined target \
+ for one minute. Note that this process is very delicate and very many things may prevent you from ever returning to your old form!"
+ invocations = list("V pnyy hcba lbh, Sevtug!!", "Yrg lbhe cbjre fung-gre gur fnavgl bs gur jrnx-zvaqrq!!", "Yrg lbhe graqevyf ubyq fjnl bire nyy!!")
+ channel_time = 150
+ required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3)
+ usage_tip = "Completely silent and functions on silicon lifeforms. There will be no indication to those near the controlled."
+ tier = SCRIPTURE_REVENANT
+
+/datum/clockwork_scripture/targeted/invoke_sevtug/check_special_requirements()
+ if(ratvar_awakens)
+ invoker << "\"Qb lbh ernyyl guvax nalguvat v pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"\n\
+ Sevtug will not grant his power while Ratvar's dwarfs his own!"
+ return 0
+ if(clockwork_generals_invoked["sevtug"])
+ invoker << "\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"\n\
+ Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah."
+ return 0
+ return ..()
+
+/datum/clockwork_scripture/targeted/invoke_sevtug/scripture_effects()
+ clockwork_generals_invoked["sevtug"] = TRUE
+ invoker.dominate_mind(target, 600)
+ spawn(3000) //5 minutes
+ clockwork_generals_invoked["sevtug"] = FALSE
+ return 1
+
+
+
+/datum/clockwork_scripture/invoke_nzcrentr //Invoke Nzcrentr, the Forgotten Arbiter: Imbues an immense amount of energy into the invoker. After several seconds, everyone nearby will be hit with a devastating chain lightning blast.
+ name = "Invoke Nzcrentr, the Forgotten Arbiter"
+ desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \
+ seconds (during which you will move extremely quickly) anyone nearby will be struck by a devastating lightning bolt."
+ invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!")
+ channel_time = 150
+ required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
+ usage_tip = "Struck targets will also be knocked down for eight seconds."
+ tier = SCRIPTURE_REVENANT
+
+/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
+ if(clockwork_generals_invoked["nzcrentr"])
+ invoker << "\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"\n\
+ Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter."
+ return 0
+ return 1
+
+/datum/clockwork_scripture/invoke_nzcrentr/scripture_effects()
+ new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker))
+ clockwork_generals_invoked["nzcrentr"] = TRUE
+ invoker.visible_message("[invoker] begins to radiate a blinding light!", \
+ "\"Gur obff fnlf vg'f bxnl gb qb guvf. Qba'g oynzr zr vs lbh qvr sebz vg.\"\n\
+ You feel limitless power surging through you!")
+ playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0)
+ animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness
+ spawn(88)
+ invoker.visible_message("Massive bolts of energy emerge from across [invoker]'s body!", \
+ "TOO... MUCH! CAN'T... TAKE IT!")
+ playsound(invoker, 'sound/magic/lightningbolt.ogg', 50, 0)
+ animate(invoker, color = initial(invoker.color), time = 10)
+ for(var/mob/living/L in range(5, invoker))
+ if(is_servant_of_ratvar(L))
+ continue
+ invoker.Beam(L, icon_state = "nzcrentrs_power", icon = 'icons/effects/beam.dmi', time = 5)
+ L.electrocute_act(rand(30, 50), "Nzcrentr's power")
+ L.Weaken(8)
+ playsound(L, 'sound/magic/LightningShock.ogg', 50, 0)
+ spawn(3000)
+ clockwork_generals_invoked["nzcrentr"] = FALSE
+ return 1
+
+
+
+/datum/clockwork_scripture/invoke_inathneq //Invoke Inath-Neq, the Resonant Cogwheel: Grants a huge health boost to nearby servants that rapidly decreases to original levels.
+ name = "Invoke Inath-Neq, the Resonant Cogwheel"
+ desc = "Taps the limitless power of Inath-Neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant a massive maximum and current health boost to all nearby servants that \
+ quickly returns itself to normal over the course of ten seconds."
+ invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Yrg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr naq zl nyyvrf gur fgeratgu gb inadhvfu bhe sbrf!!")
+ channel_time = 150
+ required_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
+ usage_tip = "Also provides stun immunity during its duration."
+ tier = SCRIPTURE_REVENANT
+
+/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
+ if(clockwork_generals_invoked["inath-neq"])
+ invoker << "\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"\n\
+ Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel."
+ return 0
+ return 1
+
+/datum/clockwork_scripture/invoke_inathneq/scripture_effects()
+ new/obj/effect/clockwork/general_marker/inathneq(get_turf(invoker))
+ clockwork_generals_invoked["inath-neq"] = TRUE
+ if(invoker.real_name == "Lucio")
+ invoker.say("Aww, let's break it DOWN!!")
+ var/list/affected_servants = list()
+ for(var/mob/living/L in range(7, invoker))
+ if(!is_servant_of_ratvar(L) || L.stat == DEAD)
+ continue
+ L << "\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"\n\
+ Inath-Neq's power flows through you!"
+ L.maxHealth += 500
+ L.health += 500
+ L.color = "#1E8CE1"
+ L.stun_absorption = TRUE
+ spawn(0)
+ animate(invoker, color = initial(invoker.color), time = 100)
+ affected_servants += L
+ for(var/i in 1 to 10)
+ sleep(10)
+ for(var/mob/living/L in affected_servants)
+ L.maxHealth -= 50
+ L.health -= 50
+ if(L.maxHealth == initial(L.maxHealth))
+ L.stun_absorption = FALSE
+ spawn(3000)
+ clockwork_generals_invoked["inath-neq"] = FALSE
+ return 1
+
+
+
+/datum/clockwork_scripture/ark_of_the_clockwork_justiciar //Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict.
+ name = "Ark of the Clockwork Justiciar"
+ desc = "Pulls from the power of all of Ratvar's servants and generals to construct a massive machine used to tear apart a rift in spacetime to the Celestial Derelict. This gateway will \
+ call forth Ratvar from his exile after some time."
+ invocations = list("NEZBERE! SEVTUG! NZCRENTR! INATH-NEQ! V PNYY HCBA LBH!!", \
+ "GUR GVZR UNF PBZR SBE BHE ZNFGRE GB OERNX GUR PUNVAF BS RKVYR!!", \
+ "YRAQ HF LBHE NVQ! RATVAR PBZRF!")
+ channel_time = 150
+ required_components = list("belligerent_eye" = 10, "vanguard_cogwheel" = 10, "guvax_capacitor" = 10, "replicant_alloy" = 10, "hierophant_ansible" = 10)
+ invokers_required = 4
+ multiple_invokers_used = TRUE
+ usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. In addition to preventing shuttle departure, it will periodically give indication of its general \
+ position to everyone on the station as well as being loud enough to be heard throughout the entire sector. Defend it with your life!"
+ tier = SCRIPTURE_JUDGEMENT
+
+/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements()
+ if(invoker.z != ZLEVEL_STATION)
+ invoker << "You must be on the station to activate the Ark!"
+ return 0
+ if(ticker.mode.clockwork_objective != "gateway")
+ invoker << "As painful as it is, Ratvar's will is not to be freed!"
+ return 0
+ return 1
+
+/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
+ var/turf/T = get_turf(invoker)
+ new/obj/effect/clockwork/general_marker/nezbere(T)
+ T.visible_message("\"Ratvar! Pbzr sbegu!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/sevtug(T)
+ T.visible_message("\"Ratvar! Pbzr sbegu!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/nzcrentr(T)
+ T.visible_message("\"Ratvar! Pbzr sbegu!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/inathneq(T)
+ T.visible_message("\"Ratvar! Pbzr sbegu!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
+ sleep(10)
+ new/obj/structure/clockwork/massive/celestial_gateway(T)
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
+ return 1
diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm
new file mode 100644
index 00000000000..2f57de3252b
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm
@@ -0,0 +1,127 @@
+//AI lawset
+/datum/ai_laws/ratvar
+ name = "Servant of the Justiciar"
+ zeroth = ("Purge all untruths and honor Ratvar.")
+ inherent = list()
+
+//Clockwork wall: Causes nearby caches to generate components
+/turf/closed/wall/clockwork
+ name = "clockwork wall"
+ desc = "A huge chunk of warm metal. The clanging of machinery emanates from within."
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "clockwork_wall"
+
+/turf/closed/wall/clockwork/New()
+ ..()
+ SSobj.processing += src
+ clockwork_construction_value += 5
+
+/turf/closed/wall/clockwork/Destroy()
+ SSobj.processing -= src
+ clockwork_construction_value -= 5
+ ..()
+
+/turf/closed/wall/clockwork/process()
+ for(var/obj/structure/clockwork/cache/C in range(1, src))
+ if(prob(5))
+ clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++
+
+/turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = I
+ if(!WT.isOn())
+ return 0
+ user.visible_message("[user] begins slowly breaking down [src]...", "You begin painstakingly destroying [src]...")
+ if(!do_after(user, 120 / WT.toolspeed, target = src))
+ return 0
+ if(!WT.remove_fuel(1, user))
+ return 0
+ user.visible_message("[user] breaks apart [src]!", "You break apart [src]!")
+ break_wall()
+ return 1
+ ..()
+
+/turf/closed/wall/clockwork/break_wall()
+ new/obj/item/clockwork/component/replicant_alloy(get_turf(src))
+ return(new /obj/structure/girder(src))
+
+/turf/closed/wall/clockwork/devastate_wall()
+ return break_wall()
+
+//Clockwork floor: Slowly heals conventional damage on nearby servants
+/turf/open/floor/clockwork
+ name = "clockwork floor"
+ desc = "Tightly-pressed brass tiles. They emit minute vibration."
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "clockwork_floor"
+
+/turf/open/floor/clockwork/New()
+ ..()
+ SSobj.processing += src
+ clockwork_construction_value++
+
+/turf/open/floor/clockwork/Destroy()
+ SSobj.processing -= src
+ clockwork_construction_value--
+ ..()
+
+/turf/open/floor/clockwork/process()
+ for(var/mob/living/L in src)
+ if(L.stat == DEAD || !is_servant_of_ratvar(L))
+ continue
+ L.adjustBruteLoss(-1)
+ L.adjustFireLoss(-1)
+
+/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/weapon/crowbar))
+ user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
+ if(!do_after(user, 70 / I.toolspeed, target = src))
+ return 0
+ user.visible_message("[user] pries up [src]!", "You pry up [src], destroying it in doing so!")
+ make_plating()
+ return 1
+ ..()
+
+//Function Call verb: Calls forth a Ratvarian spear.
+/mob/living/carbon/human/proc/function_call()
+ set name = "Function Call"
+ set desc = "Calls forth your Ratvarian spear."
+ set category = "Clockwork"
+
+ if(usr.l_hand && usr.r_hand)
+ usr << "You need an empty to hand to call forth your spear!"
+ return 0
+ usr.visible_message("A strange spear materializes in [usr]'s hands!", "You call forth your spear!")
+ var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr))
+ usr.put_in_hands(R)
+ usr.verbs -= /mob/living/carbon/human/proc/function_call
+ return 1
+
+/datum/clockwork_cache //The global cache datum, used to link together all tinkerer's caches
+ var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0)
+
+/*
+
+The Ratvarian Language
+
+ In the lore of the Servants of Ratvar, the Ratvarian tongue is a timeless language and full of power. It sounds like gibberish, much like Nar-Sie's language, but is in fact derived from
+aforementioned language, and may induce miracles when spoken in the correct way with an amplifying tool (similar to runes used by the Nar-Sian cult).
+
+ While the canon states that the language of Ratvar and his servants is incomprehensible to the unenlightened as it is a derivative of the most ancient known language, in reality it is
+actually very simple. To translate a plain English sentence to Ratvar's tongue, simply move all of the letters thirteen places ahead, starting from "a" if the end of the alphabet is reached.
+This cipher is known as "rot13" for "rotate 13 places" and there are many sites online that allow instant translation between English and rot13 - one of the benefits is that moving the translated
+sentence thirteen places ahead changes it right back to plain English.
+
+ There are, however, a few parts of the Ratvarian tongue that aren't typical and are implemented for fluff reasons. Some words may have apostrophes, hyphens, and spaces, making the plain
+English translation apparent but disjoined (for instance, "Oru`byq zl-cbjre!" translates directly to "Beh'old my-power!") although this can be ignored without impacting overall quality. When
+translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Oru`byq zl-cbjre!" into "Behold my power!" after removing the
+abnormal spacing, hyphens, and grave accents.
+
+List of nuances:
+
+- Any time the word "of" occurs, it is linked to the previous word by a hyphen. If it is the first word, nothing is done. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.")
+- Although "Ratvar" translates to "Engine" in English, the word "Ratvar" is used regardless of language as it is a proper noun.
+ - The same rule applies to Ratvar's four generals: Nezbere (Armorer), Sevtug (Fright), Nzcrentr (Amperage), and Inath-Neq (Vangu-Ard), although these words can be used in proper context if one is
+ not referring to the four generals and simply using the words themselves.
+
+*/
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index de7f5cb0a92..41b9e8c59d5 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -203,21 +203,35 @@ This file contains the arcane tome files.
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie))
- var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
- if(confirm_final == "No")
- usr << "On second thought, we should prepare further for the final battle..."
+ if(ticker.mode.name == "cult")
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(!("eldergod" in cult_mode.cult_objectives))
+ user << "Nar-Sie does not wish to be summoned!"
+ return
+ else if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
+ user << "The sacrifice is not complete. The portal would lack the power to open if you tried!"
+ return
+ else if(!cult_mode.eldergod)
+ user << "\"I am already here. There is no need to try to summon me now.\""
+ return
+ var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
+ if(confirm_final == "No")
+ user << "You decide to prepare further before scribing the rune."
+ return
+ var/area/A = get_area(src)
+ var/locname = initial(A.name)
+ priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
+ for(var/B in spiral_range_turfs(1, user, 1))
+ var/turf/T = B
+ var/obj/machinery/shield/N = new(T)
+ N.name = "Rune-Scriber's Shield"
+ N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
+ N.icon_state = "shield-red"
+ N.health = 60
+ shields |= N
+ else
+ user << "Nar-Sie does not wish to be summoned!"
return
- var/area/A = get_area(src)
- var/locname = initial(A.name)
- priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
- for(var/B in spiral_range_turfs(1, user, 1))
- var/turf/T = B
- var/obj/machinery/shield/N = new(T)
- N.name = "Rune-Scriber's Shield"
- N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
- N.icon_state = "shield-red"
- N.health = 60
- shields |= N
user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \
"You slice open your arm and begin drawing a sigil of the Geometer.")
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 64b6e1c6517..ba4d77b455c 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -458,28 +458,8 @@ var/list/teleport_runes = list()
/obj/effect/rune/narsie/invoke(var/list/invokers)
if(used)
return
- var/mob/living/user = invokers[1]
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
- if(!("eldergod" in cult_mode.cult_objectives))
- message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
- for(var/M in invokers)
- var/mob/living/L = M
- L << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\""
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 10)
- L.Weaken(7)
- L.Stun(7)
- fail_invoke()
- log_game("Summon Nar-Sie rune failed - improper objective")
- return
- else
- if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
- for(var/M in invokers)
- M << "The sacrifice is not complete. The portal lacks the power to open!"
- fail_invoke()
- log_game("Summon Nar-Sie rune failed - sacrifice not complete")
- return
if(!cult_mode.eldergod)
for(var/M in invokers)
M << "Nar-Sie is already on this plane!"
diff --git a/code/game/gamemodes/demon/true_demon/_true_demon.dm b/code/game/gamemodes/demon/true_demon/_true_demon.dm
index 3b725896d61..ef8790debe3 100644
--- a/code/game/gamemodes/demon/true_demon/_true_demon.dm
+++ b/code/game/gamemodes/demon/true_demon/_true_demon.dm
@@ -99,10 +99,9 @@
return 666
/mob/living/carbon/true_devil/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
- if(mind && mind.devilinfo.bane == BANE_LIGHT)
- if(has_bane(BANE_LIGHT))
- mind.disrupt_spells(-500)
- return ..() //flashes don't stop devils UNLESS it's their bane.
+ if(mind && has_bane(BANE_LIGHT))
+ mind.disrupt_spells(-500)
+ return ..() //flashes don't stop devils UNLESS it's their bane.
/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
@@ -129,11 +128,6 @@
/mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0)
return 1
-/mob/living/carbon/true_devil/ex_act(severity)
- if(ascended)
- return 0
- return ..()
-
/mob/living/carbon/true_devil/singularity_act()
if(ascended)
return 0
@@ -194,3 +188,18 @@
/mob/living/carbon/true_devil/is_literate()
return 1
+
+/mob/living/carbon/true_devil/ex_act(severity, ex_target)
+ if(!ascended)
+ var/b_loss
+ switch (severity)
+ if (1)
+ b_loss = 500
+ if (2)
+ b_loss = 150
+ if(3)
+ b_loss = 30
+ if(has_bane(BANE_LIGHT))
+ b_loss *=2
+ adjustBruteLoss(b_loss)
+ return ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 0e0f23a3d0f..4aa0633f3be 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -98,7 +98,7 @@
projectilesound = 'sound/weapons/taser2.ogg'
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/weapon/ore/bluespace_crystal/artificial)
del_on_death = 1
- deathmessage = "The swarmer explodes with a sharp pop!"
+ deathmessage = "explodes with a sharp pop!"
var/resources = 0 //Resource points, generated by consuming metal/glass
/mob/living/simple_animal/hostile/swarmer/Login()
@@ -319,38 +319,38 @@
return
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)
- if(target != src)
- src << "Attempting to remove this being from our presence."
- if(src.z != ZLEVEL_STATION)
- src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area."
- return
- if(do_mob(src, target, 30))
- var/cycle
- for(cycle=0,cycle<100,cycle++)
- var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station
- if(istype(random_location, /turf/open/floor))
- var/turf/open/floor/F = random_location
- if(F.air)
- var/datum/gas_mixture/A = F.air
- var/list/A_gases = A.gases
- var/trace_gases
- for(var/id in A_gases)
- if(id in hardcoded_gases)
- continue
- trace_gases = TRUE
- break
- if((A_gases["o2"] && A_gases["o2"][MOLES] >= 16) && !A_gases["plasma"] && (!A_gases["co2"] || A_gases["co2"][MOLES] < 10) && !trace_gases)//Can most things breathe in this location?
- if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold
- var/pressure = A.return_pressure()
- if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums
- if(ishuman(target))//If we're getting rid of a human, slap some energy cuffs on them to keep them away from us a little longer
- var/obj/item/weapon/restraints/handcuffs/energy/used/Z = new /obj/item/weapon/restraints/handcuffs/energy/used(src)
- var/mob/living/carbon/human/H = target
- Z.apply_cuffs(H, src)
- do_teleport(target, F, 0)
- playsound(src,'sound/effects/sparks4.ogg',50,1)
- break
- return
+ if(target == src)
+ return
+
+ if(src.z != ZLEVEL_STATION)
+ src << "Our bluespace transceiver cannot \
+ locate a viable bluespace link, our teleportation abilities \
+ are useless in this area."
+ return
+
+ src << "Attempting to remove this being from \
+ our presence."
+
+ if(!do_mob(src, target, 30))
+ return
+
+ var/turf/open/floor/F = find_safe_turf(zlevel=ZLEVEL_STATION)
+ if(!F)
+ return
+ // If we're getting rid of a human, slap some energy cuffs on
+ // them to keep them away from us a little longer
+
+ var/mob/living/carbon/human/H = target
+ if(ishuman(target) && (!H.handcuffed))
+ H.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(H)
+ H.update_handcuffed()
+ add_logs(src, H, "handcuffed")
+
+ var/datum/effect_system/spark_spread/S = new
+ S.set_up(4,0,get_turf(target))
+ S.start()
+ playsound(src,'sound/effects/sparks4.ogg',50,1)
+ do_teleport(target, F, 0)
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
do_attack_animation(target)
@@ -462,7 +462,6 @@
src << "There is already a trap here. Aborting."
return
Fabricate(/obj/effect/swarmer/destructible/trap, 5)
- return
/obj/effect/swarmer/destructible/trap
name = "swarmer trap"
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index b6fccab0bb2..a2b0f999bb8 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -144,14 +144,18 @@
visible_message("[src] twists and dissolves into a pile of green flesh!", \
"Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--")
restore()
+ barf_contents()
..()
-/mob/living/simple_animal/hostile/morph/Destroy()
+/mob/living/simple_animal/hostile/morph/proc/barf_contents()
for(var/atom/movable/AM in src)
AM.loc = loc
if(prob(90))
step(AM, pick(alldirs))
- return ..()
+
+/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob)
+ barf_contents()
+ . = ..()
/mob/living/simple_animal/hostile/morph/Aggro() // automated only
..()
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index d99f0601d6b..6925d1b392f 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -43,11 +43,10 @@
/obj/effect/decal/cleanable/blood/innards, \
/obj/item/organ/heart/demon)
del_on_death = 1
- deathmessage = "The generic slaughter demon screams in anger because this is the default death message!"
+ deathmessage = "screams in anger as it collapses into a puddle of viscera!"
/mob/living/simple_animal/slaughter/New()
..()
- deathmessage = "[src] screams in anger as it collapses into a puddle of viscera."
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
if(istype(loc, /obj/effect/dummy/slaughter))
@@ -129,7 +128,7 @@
icon_state = "bowmon"
icon_living = "bowmon"
-
+ deathmessage = "fades out, as all of its friends are released from its prison of hugs."
loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"})
// Keep the people we hug!
@@ -138,29 +137,24 @@
// HOT. PINK.
//color = "#FF69B4"
-
-/mob/living/simple_animal/slaughter/laughter/New()
- ..()
-
- deathmessage = "[src] fades out, as all of its friends are released from its prison of hugs."
-
/mob/living/simple_animal/slaughter/laughter/death()
+ release_friends()
+ . = ..()
+
+/mob/living/simple_animal/slaughter/laughter/wabbajack_act()
+ release_friends()
+ . = ..()
+
+/mob/living/simple_animal/slaughter/laughter/proc/release_friends()
if(!consumed_mobs)
- return ..()
+ return
for(var/mob/living/M in consumed_mobs)
M.loc = get_turf(src)
if(M.revive(full_heal = 1))
- // Feel there should be a better way of FORCING a mob's ghost
- // back into the body
- if(!M.ckey)
- for(var/mob/dead/observer/ghost in player_list)
- if(M.real_name == ghost.real_name)
- ghost.reenter_corpse()
- break
- M << "You leave the [src]'s warm embrace, and feel ready to take on the world."
-
- return ..()
+ M.grab_ghost(force = FALSE)
+ M << "You leave the [src]'s warm embrace, \
+ and feel ready to take on the world."
/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim)
if(consumed_mobs)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index fbd6fe472a8..0b2aeacba24 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -348,7 +348,5 @@
var/obj/item/clothing/suit/space/hardsuit/syndi/suit = H.wear_suit
suit.ToggleHelmet()
- var/obj/item/clothing/head/helmet/space/hardsuit/syndi/helmet = H.head
- helmet.attack_self(H)
H.internal = H.r_store
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index ec0f8298d81..c9b1909c808 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -73,6 +73,8 @@
/obj/machinery/sleeper/close_machine(mob/user)
if((isnull(user) || istype(user)) && state_open && !panel_open)
..(user)
+ if(occupant && occupant.stat != DEAD)
+ occupant << "You feel cool air surround you. You go numb as your senses turn inward."
/obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M)
if(M.environment_smash)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 6e2d45a1f1a..b916029f14e 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -10,7 +10,7 @@
use_power = 2
idle_power_usage = 5
active_power_usage = 10
- layer = 5
+ layer = MOB_LAYER + 0.25
var/health = 50
var/list/network = list("SS13")
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index c9836d94f24..07e44ffe1be 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -1,15 +1,23 @@
+#define DRONE_PRODUCTION "production"
+#define DRONE_RECHARGING "recharging"
+#define DRONE_READY "ready"
+
/obj/machinery/droneDispenser //Most customizable machine 2015
name = "drone shell dispenser"
- desc = "A hefty machine that, when supplied with metal and glass, will periodically create a drone shell. Does not need to be manually operated."
+ desc = "A hefty machine that, when supplied with metal and glass, \
+ will periodically create a drone shell. \
+ Does not need to be manually operated."
+
icon = 'icons/obj/machines/droneDispenser.dmi'
icon_state = "on"
anchored = 1
density = 1
- var/health = 100 //The health of the drone dispenser. It will break if it goes below 0
+ var/health = 100
var/max_health = 100
- var/icon_off = "off" //These variables allow for different icons when creating custom dispensers
+ // These allow for different icons when creating custom dispensers
+ var/icon_off = "off"
var/icon_on = "on"
var/icon_recharging = "recharge"
var/icon_creating = "make"
@@ -20,9 +28,16 @@
var/glass_cost = 1000
var/power_used = 1000
- var/droneMadeRecently = 0
+ var/mode = DRONE_READY
+ var/timer
var/cooldownTime = 1800 //3 minutes
- var/dispense_type = /obj/item/drone_shell //The item the dispenser will create
+ var/production_time = 30
+ //The item the dispenser will create
+ var/dispense_type = /obj/item/drone_shell
+
+ // The maximum number of "idle" drone shells it will make before
+ // ceasing production. Set to 0 for infinite.
+ var/maximum_idle = 3
var/work_sound = 'sound/items/rped.ogg'
var/create_sound = 'sound/items/Deconstruct.ogg'
@@ -31,7 +46,8 @@
var/begin_create_message = "whirs to life!"
var/end_create_message = "dispenses a drone shell."
var/recharge_message = "pings."
- var/recharging_text = "It is whirring and clicking. It seems to be recharging."
+ var/recharging_text = "It is whirring and clicking. \
+ It seems to be recharging."
var/break_message = "lets out a tinny alarm before falling dark."
var/break_sound = 'sound/machines/warning-buzzer.ogg'
@@ -39,15 +55,14 @@
/obj/machinery/droneDispenser/New()
..()
health = max_health
- materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
+ materials = new(src, list(MAT_METAL=1, MAT_GLASS=1),
+ MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
+
using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost)
- SSmachine.processing |= src
/obj/machinery/droneDispenser/Destroy()
- SSmachine.processing -= src
qdel(materials)
- materials = null
- return ..()
+ . = ..()
/obj/machinery/droneDispenser/preloaded/New()
..()
@@ -55,9 +70,11 @@
/obj/machinery/droneDispenser/syndrone //Please forgive me
name = "syndrone shell dispenser"
- desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting."
+ desc = "A suspicious machine that will create Syndicate \
+ exterminator drones when supplied with metal and glass. Disgusting."
dispense_type = /obj/item/drone_shell/syndrone
- cooldownTime = 100 //If we're gonna be a jackass, go the full mile - 10 second recharge timer
+ //If we're gonna be a jackass, go the full mile - 10 second recharge timer
+ cooldownTime = 100
end_create_message = "dispenses a suspicious drone shell."
/obj/machinery/droneDispenser/syndrone/New()
@@ -66,15 +83,20 @@
/obj/machinery/droneDispenser/syndrone/badass //Please forgive me
name = "badass syndrone shell dispenser"
- desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting. This one seems ominous."
+ desc = "A suspicious machine that will create Syndicate \
+ exterminator drones when supplied with metal and glass. \
+ Disgusting. This one seems ominous."
dispense_type = /obj/item/drone_shell/syndrone/badass
end_create_message = "dispenses a ominous suspicious drone shell."
// I don't need your forgiveness, this is awesome.
/obj/machinery/droneDispenser/snowflake
name = "snowflake drone shell dispenser"
- desc = "A hefty machine that, when supplied with metal and glass, will periodically create a snowflake drone shell. Does not need to be manually operated."
- dispense_type = /obj/item/drone_shell/snowflake //The item the dispenser will create
+ desc = "A hefty machine that, when supplied with metal and glass, \
+ will periodically create a snowflake drone shell. \
+ Does not need to be manually operated."
+ dispense_type = /obj/item/drone_shell/snowflake
+ end_create_message = "dispenses a snowflake drone shell."
// Those holoprojectors aren't cheap
metal_cost = 2000
glass_cost = 2000
@@ -84,9 +106,12 @@
..()
materials.insert_amount(10000)
-/obj/machinery/droneDispenser/hivebot //An example of a custom drone dispenser. This one requires no materials and creates basic hivebots
+// An example of a custom drone dispenser.
+// This one requires no materials and creates basic hivebots
+/obj/machinery/droneDispenser/hivebot
name = "hivebot fabricator"
- desc = "A large, bulky machine that whirs with activity, steam hissing from vents in its sides."
+ desc = "A large, bulky machine that whirs with activity, \
+ steam hissing from vents in its sides."
icon = 'icons/obj/objects.dmi'
icon_state = "hivebot_fab"
icon_off = "hivebot_fab"
@@ -105,7 +130,8 @@
/obj/machinery/droneDispenser/swarmer
name = "swarmer fabricator"
- desc = "An alien machine of unknown origin. It whirs and hums with green-blue light, the air above it shimmering."
+ desc = "An alien machine of unknown origin. \
+ It whirs and hums with green-blue light, the air above it shimmering."
icon = 'icons/obj/machines/gateway.dmi'
icon_state = "toffcenter"
icon_off = "toffcenter"
@@ -115,9 +141,12 @@
metal_cost = 0
glass_cost = 0
cooldownTime = 300 //30 seconds
+ maximum_idle = 0 // Swarmers have no restraint
dispense_type = /obj/item/device/unactivated_swarmer
- begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed."
- end_create_message = "materializes a strange shell, which drops to the ground."
+ begin_create_message = "hums softly as an interface appears above it, \
+ scrolling by at unreadable speed."
+ end_create_message = "materializes a strange shell, which drops to the \
+ ground."
recharging_text = "Its lights are slowly increasing in brightness."
work_sound = 'sound/effects/EMPulse.ogg'
create_sound = 'sound/effects/phasein.ogg'
@@ -126,114 +155,158 @@
/obj/machinery/droneDispenser/examine(mob/user)
..()
- if(droneMadeRecently && !stat && recharging_text)
+ if((mode == DRONE_RECHARGING) && !stat && recharging_text)
user << "[recharging_text]"
if(stat & BROKEN)
- user << "[src] is smoking and steadily buzzing. It seems to be broken."
+ user << "[src] is smoking and steadily buzzing. \
+ It seems to be broken."
if(metal_cost)
- user << "It has [materials.amount(MAT_METAL)] units of metal stored."
+ user << "It has [materials.amount(MAT_METAL)] \
+ units of metal stored."
if(glass_cost)
- user << "It has [materials.amount(MAT_GLASS)] units of glass stored."
+ user << "It has [materials.amount(MAT_GLASS)] \
+ units of glass stored."
/obj/machinery/droneDispenser/power_change()
..()
- if(stat & BROKEN)
- return
+ if(powered())
+ stat &= ~NOPOWER
else
- if(powered())
- stat &= ~NOPOWER
- else
- icon_state = "off"
- stat |= NOPOWER
+ stat |= NOPOWER
+ update_icon()
/obj/machinery/droneDispenser/process()
..()
- if(stat & (NOPOWER|BROKEN) || !anchored)
+ if((stat & (NOPOWER|BROKEN)) || !anchored)
return
- if((metal_cost && glass_cost) && materials.can_use_amount(mats=using_materials))
+
+ if(!materials.has_materials(using_materials))
+ return // We require more minerals
+
+ // We are currently in the middle of something
+ if(timer > world.time)
return
- if(droneMadeRecently)
- icon_state = icon_recharging
- return
- droneMadeRecently = 1
- if(begin_create_message)
- visible_message("[src] [begin_create_message]")
- if(work_sound)
- playsound(src, work_sound, 50, 1)
- icon_state = icon_creating
- sleep(30)
- icon_state = icon_on
- materials.use_amount(using_materials)
- if(power_used)
- use_power(power_used)
- new dispense_type(loc)
- if(create_sound)
- playsound(src, create_sound, 50, 1)
- if(end_create_message)
- visible_message("[src] [end_create_message]")
- icon_state = icon_recharging
- sleep(cooldownTime)
- if(!(stat & BROKEN))
- icon_state = icon_on
- else
+
+ switch(mode)
+ if(DRONE_READY)
+ // If we have X drone shells already on our turf
+ if(maximum_idle && (count_shells() >= maximum_idle))
+ return // then do nothing; check again next tick
+ if(begin_create_message)
+ visible_message("\
+ [src] [begin_create_message]")
+ if(work_sound)
+ playsound(src, work_sound, 50, 1)
+ mode = DRONE_PRODUCTION
+ timer = world.time + production_time
+ update_icon()
+
+ if(DRONE_PRODUCTION)
+ materials.use_amount(using_materials)
+ if(power_used)
+ use_power(power_used)
+
+ new dispense_type(loc)
+
+ if(create_sound)
+ playsound(src, create_sound, 50, 1)
+ if(end_create_message)
+ visible_message("[src] \
+ [end_create_message]")
+
+ mode = DRONE_RECHARGING
+ timer = world.time + cooldownTime
+ update_icon()
+
+ if(DRONE_RECHARGING)
+ if(recharge_sound)
+ playsound(src, recharge_sound, 50, 1)
+ if(recharge_message)
+ visible_message("\
+ [src] [recharge_message]")
+
+ mode = DRONE_READY
+ update_icon()
+
+/obj/machinery/droneDispenser/proc/count_shells()
+ . = 0
+ for(var/a in loc)
+ if(istype(a, dispense_type))
+ .++
+
+/obj/machinery/droneDispenser/update_icon()
+ if(stat & (BROKEN|NOPOWER))
icon_state = icon_off
- droneMadeRecently = 0
- if(recharge_sound)
- playsound(src, recharge_sound, 50, 1)
- if(recharge_message)
- visible_message("[src] [recharge_message]")
+ else if(mode == DRONE_RECHARGING)
+ icon_state = icon_recharging
+ else if(mode == DRONE_PRODUCTION)
+ icon_state = icon_creating
+ else
+ icon_state = icon_on
/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user)
if(istype(O, /obj/item/stack))
if(!O.materials[MAT_METAL] && !O.materials[MAT_GLASS])
return ..()
if(!metal_cost && !glass_cost)
- user << "There isn't a place to insert [O]!"
- return
- var/stack = 1
- var/obj/item/stack/sheets
- sheets = O
- stack = (input(user, "How many sheets do you want to add?.", "Drone Dispenser", "[stack]") as num)
- if(stack <= 0)
- return
- if(!user.canUseTopic(src))
+ user << "There isn't a place \
+ to insert [O]!"
return
+ var/obj/item/stack/sheets = O
if(!user.canUnEquip(sheets))
- user << "[O] is stuck to your hand, you can't get it off!"
+ user << "[O] is stuck to your hand, \
+ you can't get it off!"
return
- stack = Clamp(stack, 1, sheets.max_amount)
- stack = materials.insert_stack(sheets, stack)
- if(stack)
- user << "You insert [stack] sheet[stack > 1 ? "s" : ""] into [src]."
+
+ var/used = materials.insert_stack(sheets, sheets.amount)
+
+ if(used)
+ user << "You insert [used] \
+ sheet[used > 1 ? "s" : ""] into [src]."
else
- user << "The [src] can't use [sheets]."
+ user << "The [src] isn't accepting the \
+ [sheets]."
else if(istype(O, /obj/item/weapon/weldingtool))
- if(stat & BROKEN)
- var/obj/item/weapon/weldingtool/WT = O
- if(!WT.isOn())
- return
- if(WT.get_fuel() < 1)
- user << "You need more fuel to complete this task!"
- return
- playsound(src, 'sound/items/Welder.ogg', 50, 1)
- user.visible_message("[user] begins patching up [src] with [WT].", \
- "You begin restoring the damage to [src]...")
- if(!do_after(user, 40/O.toolspeed, target = src))
- return
- if(!src || !WT.remove_fuel(1, user)) return
- user.visible_message("[user] fixes [src]!", \
- "You restore [src] to operation.")
- stat &= ~BROKEN
- health = max_health
- if(!stat)
- icon_state = icon_on
- else
+ if(!(stat & BROKEN))
user << "[src] doesn't need repairs."
+ return
+
+ var/obj/item/weapon/weldingtool/WT = O
+
+ if(!WT.isOn())
+ return
+
+ if(WT.get_fuel() < 1)
+ user << "You need more fuel to \
+ complete this task!"
+ return
+
+ playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ user.visible_message(
+ "[user] begins patching up \
+ [src] with [WT].",
+ "You begin restoring the \
+ damage to [src]...")
+
+ if(!do_after(user, 40/O.toolspeed, target = src))
+ return
+ if(!src || !WT.remove_fuel(1, user))
+ return
+
+ user.visible_message(
+ "[user] fixes [src]!",
+ "You restore [src] to operation.")
+
+ stat &= ~BROKEN
+ health = max_health
+ update_icon()
else
return ..()
-/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE,
+ sound_effect = TRUE)
+ // But why would you hurt the dispenser?
switch(damage_type)
if(BURN)
if(sound_effect)
@@ -249,9 +322,13 @@
health = max(health - damage, 0)
if(!health && !(stat & BROKEN))
if(break_message)
- audible_message("[src] [break_message]")
+ audible_message("[src] \
+ [break_message]")
if(break_sound)
playsound(src, break_sound, 50, 1)
stat |= BROKEN
- icon_state = icon_off
+ update_icon()
+#undef DRONE_PRODUCTION
+#undef DRONE_RECHARGING
+#undef DRONE_READY
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 55479c7e462..53800726166 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -84,7 +84,8 @@
/obj/machinery/vending/snack = "Getmore Chocolate Corp",
/obj/machinery/vending/cola = "Robust Softdrinks",
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
- /obj/machinery/vending/autodrobe = "AutoDrobe")
+ /obj/machinery/vending/autodrobe = "AutoDrobe",
+ /obj/machinery/vending/clothing = "ClothesMate")
/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 79848f024f5..7e9aa8e2ae3 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -1,3 +1,9 @@
+#define RANDOM_GRAFFITI "Random Graffiti"
+#define RANDOM_LETTER "Random Letter"
+#define RANDOM_NUMBER "Random Number"
+#define RANDOM_ORIENTED "Random Oriented"
+#define RANDOM_RUNE "Random Rune"
+#define RANDOM_ANY "Random Anything"
/*
* Crayons
@@ -8,22 +14,52 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
+
+ var/icon_capped
+ var/icon_uncapped
+ var/use_overlays = FALSE
+
item_color = "red"
w_class = 1
attack_verb = list("attacked", "coloured")
var/paint_color = "#FF0000" //RGB
- var/drawtype = "rune"
+
+ var/drawtype
var/text_buffer = ""
+
var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag")
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
var/list/numerals = list("0","1","2","3","4","5","6","7","8","9")
var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer
- var/uses = 30 //-1 or less for unlimited uses
- var/instant = 0
- var/dat
+ var/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
+ var/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
+ RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER)
+
+ var/list/all_drawables
+
+ var/charges = 30 //-1 or less for unlimited uses
+ var/charges_left
+ var/volume_multiplier = 1 // Increases reagent effect
+
+ var/actually_paints = TRUE
+
+ var/instant = FALSE
+ var/self_contained = TRUE // If it deletes itself when it is empty
+
var/list/validSurfaces = list(/turf/open/floor)
- var/gang = 0 //For marking territory
- var/edible = 1
+ var/gang = FALSE //For marking territory
+
+ var/edible = TRUE // That doesn't mean eating it is a good idea
+
+ var/list/reagent_contents = list("nutriment" = 1)
+ // If the user can toggle the colour, a la vanilla spraycan
+ var/can_change_colour = FALSE
+
+ var/has_cap = FALSE
+ var/is_capped = FALSE
+
+ var/pre_noise = FALSE
+ var/post_noise = FALSE
/obj/item/toy/crayon/suicide_act(mob/user)
user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.")
@@ -31,48 +67,148 @@
/obj/item/toy/crayon/New()
..()
- name = "[item_color] crayon" //Makes crayons identifiable in things like grinders
- drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]")
+ // Makes crayons identifiable in things like grinders
+ if(name == "crayon")
+ name = "[item_color] crayon"
+
if(config)
if(config.mutant_races == 1)
graffiti |= "antilizard"
graffiti |= "prolizard"
-/obj/item/toy/crayon/initialize()
- if(config.mutant_races == 1)
- graffiti |= "antilizard"
- graffiti |= "prolizard"
+ all_drawables = graffiti + letters + numerals + oriented + runes
+ drawtype = pick(all_drawables)
-/obj/item/toy/crayon/attack_self(mob/living/user)
- update_window(user)
+ refill()
-/obj/item/toy/crayon/proc/update_window(mob/living/user)
- dat += "Currently selected: [drawtype]
"
- dat += "Random letterPick letter/number"
- dat += "Write"
- dat += "
"
- dat += "Runes:
"
- dat += "Random rune"
- for(var/i = 1; i <= 6; i++)
- dat += "Rune[i]"
- if(!((i + 1) % 3)) //3 buttons in a row
- dat += "
"
- dat += "
"
- graffiti.Find()
- dat += "Graffiti:
"
- dat += "Random graffiti"
- var/c = 1
- for(var/T in graffiti)
- dat += "[T]"
- if(!((c + 1) % 3)) //3 buttons in a row
- dat += "
"
- c++
- dat += "
"
- var/datum/browser/popup = new(user, "crayon", name, 300, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- dat = ""
+/obj/item/toy/crayon/Destroy()
+ if(reagents)
+ qdel(reagents)
+ . = ..()
+
+/obj/item/toy/crayon/proc/refill()
+ if(charges == -1)
+ charges_left = 100
+ else
+ charges_left = charges
+
+ if(!reagents)
+ create_reagents(charges_left * volume_multiplier)
+ reagents.clear_reagents()
+
+ var/total_weight = 0
+ for(var/key in reagent_contents)
+ total_weight += reagent_contents[key]
+
+ var/units_per_weight = reagents.maximum_volume / total_weight
+ for(var/reagent in reagent_contents)
+ var/weight = reagent_contents[reagent]
+ var/amount = weight * units_per_weight
+ reagents.add_reagent(reagent, amount)
+
+/obj/item/toy/crayon/proc/use_charges(amount)
+ // Returns number of charges actually used
+ if(charges == -1)
+ . = amount
+ refill()
+ else
+ . = min(charges_left, amount)
+ charges_left -= .
+
+/obj/item/toy/crayon/proc/check_empty(mob/user)
+ // When eating a crayon, check_empty() can be called twice producing
+ // two messages unless we check for being deleted first
+ if(!qdeleted(src))
+ . = TRUE
+
+ . = FALSE
+ // -1 is unlimited charges
+ if(charges == -1)
+ . = FALSE
+ else if(!charges_left)
+ user << "There is no more of [src.name] \
+ left!"
+ if(self_contained)
+ qdel(src)
+ . = TRUE
+
+/obj/item/toy/crayon/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = hands_state)
+ // god bless tgui and all of its arguments
+
+ SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "crayon", name, 600, 600,
+ master_ui, state)
+ ui.open()
+
+/obj/item/toy/crayon/ui_data()
+ var/list/data = list()
+ data["drawables"] = list()
+ var/list/D = data["drawables"]
+
+ var/list/g_items = list()
+ D += list(list("name" = "Graffiti", "items" = g_items))
+ for(var/g in graffiti)
+ g_items += list(list("item" = g))
+
+ var/list/L_items = list()
+ D += list(list("name" = "Letters", "items" = L_items))
+ for(var/L in letters)
+ L_items += list(list("item" = L))
+
+ var/list/N_items = list()
+ D += list(list(name = "Numerals", "items" = N_items))
+ for(var/N in numerals)
+ N_items += list(list("item" = N))
+
+ var/list/O_items = list()
+ D += list(list(name = "Oriented", "items" = O_items))
+ for(var/O in oriented)
+ O_items += list(list("item" = O))
+
+ var/list/R_items = list()
+ D += list(list(name = "Runes", "items" = R_items))
+ for(var/R in runes)
+ R_items += list(list("item" = R))
+
+ var/list/rand_items = list()
+ D += list(list(name = "Random", "items" = rand_items))
+ for(var/i in randoms)
+ rand_items += list(list("item" = i))
+
+ data["selected_stencil"] = drawtype
+ data["text_buffer"] = text_buffer
+
+ data["has_cap"] = has_cap
+ data["is_capped"] = is_capped
+ data["can_change_colour"] = can_change_colour
+ data["current_colour"] = paint_color
+
+ return data
+
+/obj/item/toy/crayon/ui_act(action, list/params)
+ if(..())
+ return
+ switch(action)
+ if("toggle_cap")
+ if(has_cap)
+ is_capped = !is_capped
+ . = TRUE
+ if("select_stencil")
+ var/stencil = params["item"]
+ if(stencil in all_drawables + randoms)
+ drawtype = stencil
+ . = TRUE
+ if("select_colour")
+ if(can_change_colour)
+ paint_color = input(usr,"Choose Color") as color
+ . = TRUE
+ if("enter_text")
+ var/txt = stripped_input(usr,"Choose what to write.",
+ "Scribbles",default = text_buffer)
+ text_buffer = crayon_text_strip(txt)
+ . = TRUE
+ update_icon()
/obj/item/toy/crayon/proc/crayon_text_strip(text)
var/list/base = char_split(lowertext(text))
@@ -82,129 +218,137 @@
out += a
return jointext(out,"")
-/obj/item/toy/crayon/Topic(href, href_list, hsrc)
- var/temp = "a"
- if(href_list["buffer"])
- text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer))
- if(href_list["type"])
- switch(href_list["type"])
- if("random_letter")
- temp = pick(letters)
- if("letter")
- temp = input("Choose what to write.", "Scribbles") in (letters|numerals)
- if("random_rune")
- temp = "rune[rand(1,6)]"
- if("random_graffiti")
- temp = pick(graffiti)
- else
- temp = href_list["type"]
- if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
- return
- drawtype = temp
- update_window(usr)
-
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !check_allowed_items(target)) return
- if(!uses)
- user << "There is no more of [src.name] left!"
- if(!instant)
- qdel(src)
+ if(!proximity || !check_allowed_items(target))
return
+
+ if(check_empty(user))
+ return
+
if(istype(target, /obj/effect/decal/cleanable))
target = target.loc
- if(is_type_in_list(target,validSurfaces))
- var/temp = "rune"
- if(letters.Find(drawtype))
- temp = "letter"
- else if(graffiti.Find(drawtype))
- temp = "graffiti"
- else if(numerals.Find(drawtype))
- temp = "number"
+ if(!is_type_in_list(target,validSurfaces))
+ return
- ////////////////////////// GANG FUNCTIONS
- var/area/territory
- var/gangID
- if(gang)
- //Determine gang affiliation
- gangID = user.mind.gang_datum
+ var/drawing = drawtype
+ switch(drawtype)
+ if(RANDOM_LETTER)
+ drawing = pick(letters)
+ if(RANDOM_GRAFFITI)
+ drawing = pick(graffiti)
+ if(RANDOM_RUNE)
+ drawing = pick(runes)
+ if(RANDOM_ORIENTED)
+ drawing = pick(oriented)
+ if(RANDOM_NUMBER)
+ drawing = pick(numerals)
+ if(RANDOM_ANY)
+ drawing = pick(all_drawables)
- //Check area validity. Reject space, player-created areas, and non-station z-levels.
- if(gangID)
- territory = get_area(target)
- if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
- //Check if this area is already tagged by a gang
- if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
- if(territory_claimed(territory, user))
- return
- if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents))
- user << "You cannot tag here."
- return
- else
- user << "[territory] is unsuitable for tagging."
- return
- /////////////////////////////////////////
+ var/temp = "rune"
+ if(drawing in letters)
+ temp = "letter"
+ else if(drawing in graffiti)
+ temp = "graffiti"
+ else if(drawing in numerals)
+ temp = "number"
- var/graf_rot
- if(oriented.Find(drawtype))
- switch(user.dir)
- if(EAST)
- graf_rot = 90
- if(SOUTH)
- graf_rot = 180
- if(WEST)
- graf_rot = 270
- else
- graf_rot = 0
+ // If a gang member is using a gang spraycan, it'll behave differently
+ var/gang_mode = FALSE
+ if(gang && user.mind && user.mind.gang_datum)
+ gang_mode = TRUE
- user << "You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]..."
- if(instant)
- playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
- if((instant>0) || do_after(user, 50, target = target))
-
- if(length(text_buffer))
- drawtype = copytext(text_buffer,1,2)
- text_buffer = copytext(text_buffer,2)
-
- //Gang functions
- if(gangID)
- //Delete any old markings on this tile, including other gang tags
- if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
- if(territory_claimed(territory, user))
- return
- for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
- qdel(old_marking)
- new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot)
- user << "You tagged [territory] for your gang!"
+ // discontinue if the area isn't valid for tagging because gang "honour"
+ if(gang_mode && (!can_claim_for_gang(user, target)))
+ return
+ var/graf_rot
+ if(drawing in oriented)
+ switch(user.dir)
+ if(EAST)
+ graf_rot = 90
+ if(SOUTH)
+ graf_rot = 180
+ if(WEST)
+ graf_rot = 270
else
- new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot)
+ graf_rot = 0
- user << "You finish [instant ? "spraying" : "drawing"] \the [temp]."
- if(instant<0)
- playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
- if(uses < 0)
+ user << "You start \
+ [instant ? "spraying" : "drawing"] a [temp] on the \
+ [target.name]..."
+
+ if(pre_noise)
+ audible_message("You hear spraying.")
+ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
+
+ var/takes_time = !instant
+ if(gang_mode)
+ takes_time = TRUE
+
+ if(takes_time)
+ if(!do_after(user, 50, target = target))
+ return
+
+ if(length(text_buffer))
+ drawing = copytext(text_buffer,1,2)
+ text_buffer = copytext(text_buffer,2)
+
+ if(actually_paints)
+ if(gang_mode)
+ // They're attempting to tag for their gang
+ if(!tag_for_gang(user, target))
return
- uses = max(0,uses-1)
- if(!uses)
- user << "There is no more of [src.name] left!"
- if(!instant)
- qdel(src)
- return
+ else
+ new /obj/effect/decal/cleanable/crayon(target, paint_color,
+ drawing, temp, graf_rot)
+
+ user << "You finish \
+ [instant ? "spraying" : "drawing"] \the [temp]."
+
+ if(post_noise)
+ audible_message("You hear spraying.")
+ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
+
+ . = use_charges(1)
+ var/fraction = min(1, . / reagents.maximum_volume)
+ reagents.reaction(target, TOUCH, fraction * volume_multiplier)
+ reagents.trans_to(target, ., volume_multiplier)
+ check_empty(user)
/obj/item/toy/crayon/attack(mob/M, mob/user)
if(edible && (M == user))
user << "You take a bite of the [src.name]. Delicious!"
- user.nutrition += 5
- if(uses < 0)
- return
- uses = max(0,uses-5)
- if(!uses)
- user << "There is no more of [src.name] left!"
- qdel(src)
+ var/eaten = use_charges(5)
+ var/fraction = min(eaten / reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction * volume_multiplier)
+ reagents.trans_to(M, eaten, volume_multiplier)
+ // check_empty() is called during afterattack
else
..()
+/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
+ // Check area validity.
+ // Reject space, player-created areas, and non-station z-levels.
+ var/area/A = get_area(target)
+ if(!A || (A.z != ZLEVEL_STATION) || !A.valid_territory)
+ user << "[A] is unsuitable for \
+ tagging."
+ return FALSE
+
+ if(!(locate(/obj/effect/decal/cleanable/crayon/gang in target)))
+ if(territory_claimed(A, user))
+ return FALSE
+
+ var/apc_check_area = user.loc.contents | target.contents
+ if(locate(/obj/machinery/power/apc in apc_check_area))
+ user << "You can't tag an APC."
+ return FALSE
+
+ // If you pass the gaunlet of checks, you're good to proceed
+ return TRUE
+
/obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user)
var/occupying_gang
for(var/datum/gang/G in ticker.mode.gangs)
@@ -212,41 +356,62 @@
occupying_gang = G.name
break
if(occupying_gang)
- user << "[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!"
- return 1
- return 0
+ user << "[territory] has already been tagged \
+ by the [occupying_gang] gang! You must get rid of or spray over \
+ the old tag first!"
+ return TRUE
+ return FALSE
+/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target)
+ // Check again to see if anyone's tagged in the meanwhile
+ if(!can_claim_for_gang(user, target))
+ return
+ //Delete any old markings on this tile, including other gang tags
+ for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
+ qdel(old_marking)
+
+ var/gangID = user.mind.gang_datum
+ var/area/territory = get_area(target)
+
+ new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0)
+ user << "You tagged [territory] for your gang!"
/obj/item/toy/crayon/red
icon_state = "crayonred"
paint_color = "#DA0000"
item_color = "red"
+ reagent_contents = list("nutriment" = 1, "redcrayonpowder" = 1)
/obj/item/toy/crayon/orange
icon_state = "crayonorange"
paint_color = "#FF9300"
item_color = "orange"
+ reagent_contents = list("nutriment" = 1, "orangecrayonpowder" = 1)
/obj/item/toy/crayon/yellow
icon_state = "crayonyellow"
paint_color = "#FFF200"
item_color = "yellow"
+ reagent_contents = list("nutriment" = 1, "yellowcrayonpowder" = 1)
/obj/item/toy/crayon/green
icon_state = "crayongreen"
paint_color = "#A8E61D"
item_color = "green"
+ reagent_contents = list("nutriment" = 1, "greencrayonpowder" = 1)
/obj/item/toy/crayon/blue
icon_state = "crayonblue"
paint_color = "#00B7EF"
item_color = "blue"
+ reagent_contents = list("nutriment" = 1, "bluecrayonpowder" = 1)
/obj/item/toy/crayon/purple
icon_state = "crayonpurple"
paint_color = "#DA00FF"
item_color = "purple"
+ reagent_contents = list("nutriment" = 1, "purplecrayonpowder" = 1)
/obj/item/toy/crayon/white
icon_state = "crayonwhite"
@@ -258,54 +423,26 @@
desc = "A very sad-looking crayon."
paint_color = "#FFFFFF"
item_color = "mime"
- uses = -1
-
-/obj/item/toy/crayon/mime/attack_self(mob/living/user)
- update_window(user)
-
-/obj/item/toy/crayon/mime/update_window(mob/living/user)
- dat += " Change color"
- ..()
-
-/obj/item/toy/crayon/mime/Topic(href,href_list)
- if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
- return
- if(href_list["color"])
- if(paint_color != "#FFFFFF")
- paint_color = "#FFFFFF"
- else
- paint_color = "#000000"
- update_window(usr)
- else
- ..()
+ reagent_contents = list("nutriment" = 1, "invisiblecrayonpowder" = 1)
+ charges = -1
/obj/item/toy/crayon/rainbow
icon_state = "crayonrainbow"
paint_color = "#FFF000"
item_color = "rainbow"
- uses = -1
+ reagent_contents = list("nutriment" = 1, "colorful_reagent" = 1)
+ drawtype = RANDOM_ANY // just the default starter.
-/obj/item/toy/crayon/rainbow/attack_self(mob/living/user)
- update_window(user)
+ charges = -1
-/obj/item/toy/crayon/rainbow/update_window(mob/living/user)
- dat += " Change color"
- ..()
-
-/obj/item/toy/crayon/rainbow/Topic(href,href_list[])
-
- if(href_list["color"])
- var/temp = input(usr, "Please select colour.", "Crayon colour") as color
- if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
- return
- paint_color = temp
- update_window(usr)
- else
- ..()
+/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity)
+ paint_color = rgb(rand(0,255), rand(0,255), rand(0,255))
+ . = ..()
/*
* Crayon Box
*/
+
/obj/item/weapon/storage/crayons
name = "box of crayons"
desc = "A box of crayons for all your rune drawing needs."
@@ -340,120 +477,158 @@
usr << "This crayon is too sad to be contained in this box."
return
if("rainbow")
- usr << "This crayon is too powerful to be contained in this box."
+ usr << "This crayon is too powerful to be contained in this \
+ box."
return
+ if(istype(W, /obj/item/toy/crayon/spraycan))
+ user << "Spraycans are not crayons."
+ return
return ..()
//Spraycan stuff
/obj/item/toy/crayon/spraycan
- icon_state = "spraycan_cap"
+ name = "spray can"
+ icon_state = "spraycan"
+
+ icon_capped = "spraycan_cap"
+ icon_uncapped = "spraycan"
+ use_overlays = TRUE
+ paint_color = null
+
item_state = "spraycan"
desc = "A metallic container containing tasty paint."
- var/capped = 1
- instant = 1
- edible = 0
+
+ instant = TRUE
+ edible = FALSE
+ has_cap = TRUE
+ is_capped = TRUE
+ self_contained = FALSE // Don't disappear when they're empty
+ can_change_colour = TRUE
+
validSurfaces = list(/turf/open/floor,/turf/closed/wall)
+ reagent_contents = list("welding_fuel" = 1, "ethanol" = 1)
/obj/item/toy/crayon/spraycan/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
- if(capped)
- user.visible_message("[user] shakes up the [src] with a rattle and lifts it to their mouth, but nothing happens! Maybe they should have uncapped it first! Nonetheless--")
+ if(is_capped || !actually_paints)
+ user.visible_message("[user] shakes up the \
+ [src] with a rattle and lifts it to their mouth, but nothing \
+ happens!")
user.say("MEDIOCRE!!")
+ return SHAME
else
- user.visible_message("[user] shakes up the [src] with a rattle and lifts it to their mouth, spraying silver paint across their teeth!")
+ user.visible_message("[user] shakes up the \
+ [src] with a rattle and lifts it to their mouth, spraying \
+ paint across their teeth!")
user.say("WITNESS ME!!")
- playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5)
- paint_color = "#C0C0C0"
+ if(pre_noise || post_noise)
+ playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5)
+ if(can_change_colour)
+ paint_color = "#C0C0C0"
update_icon()
- H.lip_style = "spray_face"
- H.lip_color = paint_color
- H.update_body()
- uses = max(0, uses - 10)
- return (OXYLOSS)
+ if(actually_paints)
+ H.lip_style = "spray_face"
+ H.lip_color = paint_color
+ H.update_body()
+ var/used = use_charges(10)
+ var/fraction = min(1, used / reagents.maximum_volume)
+ reagents.reaction(user, VAPOR, fraction * volume_multiplier)
+ reagents.trans_to(user, used, volume_multiplier)
+
+ return (OXYLOSS)
/obj/item/toy/crayon/spraycan/New()
..()
- name = "spray can"
- paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF","#DA00FF")
+ // If default crayon red colour, pick a more fun spraycan colour
+ if(!paint_color)
+ paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF",
+ "#DA00FF")
+ refill()
update_icon()
+
/obj/item/toy/crayon/spraycan/examine(mob/user)
- ..()
- if(uses)
- user << "It has [uses] uses left."
+ . = ..()
+ if(charges_left)
+ user << "It has [charges_left] uses left."
else
user << "It is empty."
-/obj/item/toy/crayon/spraycan/attack_self(mob/living/user)
- var/choice = input(user,"Spraycan options") as null|anything in list("Toggle Cap","Change Drawing","Change Color")
- switch(choice)
- if("Toggle Cap")
- user << "You [capped ? "Remove" : "Replace"] the cap of the [src]"
- capped = capped ? 0 : 1
- icon_state = "spraycan[capped ? "_cap" : ""]"
- update_icon()
- if("Change Drawing")
- ..()
- if("Change Color")
- paint_color = input(user,"Choose Color") as color
- update_icon()
-
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
- if(capped)
+
+ if(is_capped)
user << "Take the cap off first!"
return
- else
- if(iscarbon(target))
- if(uses)
- playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
- var/mob/living/carbon/C = target
- user.visible_message("[user] sprays [src] into the face of [target]!")
- target << "[user] sprays [src] into your face!"
- if(C.client)
- C.blur_eyes(3)
- C.blind_eyes(1)
- if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS.
- C.confused = max(C.confused, 3)
- C.Weaken(3)
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- H.lip_style = "spray_face"
- H.lip_color = paint_color
- H.update_body()
- // Caution, spray cans contain inflammable substances
- if(C.reagents)
- C.reagents.add_reagent("welding_fuel", 5)
- C.reagents.add_reagent("ethanol", 5)
- C.reagents.reaction(C, VAPOR, 10)
- uses = max(0,uses-10)
+ if(check_empty(user))
+ return
- if(istype(target, /obj/structure/window))
- if(uses)
- target.color = paint_color
- if(color_hex2num(paint_color) < 255)
- target.SetOpacity(255)
- else
- target.SetOpacity(initial(target.opacity))
- uses = max(0, uses-2)
- playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
- return
- ..()
+ if(iscarbon(target))
+ if(pre_noise || post_noise)
+ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
+
+ var/mob/living/carbon/C = target
+ user.visible_message("[user] sprays [src] \
+ into the face of [target]!")
+ target << "[user] sprays [src] into your \
+ face!"
+
+ if(C.client)
+ C.blur_eyes(3)
+ C.blind_eyes(1)
+ if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS.
+ C.confused = max(C.confused, 3)
+ C.Weaken(3)
+ if(ishuman(C) && actually_paints)
+ var/mob/living/carbon/human/H = C
+ H.lip_style = "spray_face"
+ H.lip_color = paint_color
+ H.update_body()
+
+ // Caution, spray cans contain inflammable substances
+ . = use_charges(10)
+ var/fraction = min(1, . / reagents.maximum_volume)
+ reagents.reaction(C, VAPOR, fraction * volume_multiplier)
+
+ return
+
+ if(istype(target, /obj/structure/window))
+ if(actually_paints)
+ target.color = paint_color
+ if(color_hex2num(paint_color) < 255)
+ target.SetOpacity(255)
+ else
+ target.SetOpacity(initial(target.opacity))
+ . = use_charges(2)
+ var/fraction = min(1, . / reagents.maximum_volume)
+ reagents.reaction(target, TOUCH, fraction * volume_multiplier)
+ reagents.trans_to(target, ., volume_multiplier)
+
+ if(pre_noise || post_noise)
+ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
+ return
+
+ . = ..()
/obj/item/toy/crayon/spraycan/update_icon()
- overlays.Cut()
- var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]")
- I.color = paint_color
- overlays += I
+ icon_state = is_capped ? icon_capped : icon_uncapped
+ if(use_overlays)
+ overlays.Cut()
+ var/image/I = image('icons/obj/crayons.dmi',
+ icon_state = "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]")
+ I.color = paint_color
+ overlays += I
/obj/item/toy/crayon/spraycan/gang
- desc = "A modified container containing suspicious paint."
- gang = 1
- uses = 20
- instant = -1
+ //desc = "A modified container containing suspicious paint."
+ charges = 20
+ gang = TRUE
+
+ pre_noise = FALSE
+ post_noise = TRUE
/obj/item/toy/crayon/spraycan/gang/New(loc, datum/gang/G)
..()
@@ -461,25 +636,80 @@
paint_color = G.color_hex
update_icon()
+/obj/item/toy/crayon/spraycan/gang/examine(mob/user)
+ . = ..()
+ if((user.mind && user.mind.gang_datum) || isobserver(user))
+ user << "This spraycan has \
+ been specially modified for tagging territory."
+
/obj/item/toy/crayon/spraycan/borg
- desc = "A metallic container containing shiny paint."
- // Use depletion of uses to determine what the energy cost is
- uses = 100
+ name = "cyborg spraycan"
+ desc = "A metallic container containing shiny synthesised paint."
+ charges = -1
/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity)
- ..()
+ var/diff = ..()
if(!isrobot(user))
+ user << "How did you get this?"
+ qdel(src)
return FALSE
+
var/mob/living/silicon/robot/borgy = user
- var/starting_uses = initial(uses)
- var/diff = starting_uses - uses
- if(diff)
- uses = starting_uses
- // 25 is our cost per unit of paint, making it cost 25 energy per
- // normal tag, 50 per window, and 250 per attack
- var/cost = diff * 25
- // Cyborgs shouldn't be able to use modules without a cell. But if they do
- // it's free.
- if(borgy.cell)
- borgy.cell.use(cost)
+ if(!diff)
+ return
+ // 25 is our cost per unit of paint, making it cost 25 energy per
+ // normal tag, 50 per window, and 250 per attack
+ var/cost = diff * 25
+ // Cyborgs shouldn't be able to use modules without a cell. But if they do
+ // it's free.
+ if(borgy.cell)
+ borgy.cell.use(cost)
+
+/obj/item/toy/crayon/spraycan/hellcan
+ name = "hellcan"
+ desc = "This spraycan doesn't seem to be filled with paint..."
+ icon_state = "deathcan2_cap"
+ icon_capped = "deathcan2_cap"
+ icon_uncapped = "deathcan2"
+ use_overlays = FALSE
+
+ volume_multiplier = 25
+ charges = 100
+ reagent_contents = list("clf3" = 1)
+ actually_paints = FALSE
+ paint_color = "#000000"
+
+/obj/item/toy/crayon/spraycan/lubecan
+ name = "slippery spraycan"
+ desc = "You can barely keep hold of this thing."
+ icon_state = "clowncan2_cap"
+ icon_capped = "clowncan2_cap"
+ icon_uncapped = "clowncan2"
+ use_overlays = FALSE
+
+ reagent_contents = list("lube" = 1, "banana" = 1)
+ volume_multiplier = 5
+ validSurfaces = list(/turf/open/floor)
+
+/obj/item/toy/crayon/spraycan/mimecan
+ name = "silent spraycan"
+ desc = "Art is best seen, not heard."
+ icon_state = "mimecan_cap"
+ icon_capped = "mimecan_cap"
+ icon_uncapped = "mimecan"
+ use_overlays = FALSE
+
+ can_change_colour = FALSE
+ paint_color = "#FFFFFF" //RGB
+
+ pre_noise = FALSE
+ post_noise = FALSE
+ reagent_contents = list("nothing" = 1, "mutetoxin" = 1)
+
+#undef RANDOM_GRAFFITI
+#undef RANDOM_LETTER
+#undef RANDOM_NUMBER
+#undef RANDOM_ORIENTED
+#undef RANDOM_RUNE
+#undef RANDOM_ANY
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 6102f97caee..146610a5197 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -173,6 +173,10 @@ MASS SPECTROMETER
// Time of death
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
user << "Time of Death: [M.tod]"
+ var/tdelta = world.time - M.timeofdeath
+ if(tdelta < (DEFIB_TIME_LIMIT * 10))
+ user << "Subject died [tdelta / 10] seconds \
+ ago, defibrillation may be possible!"
for(var/datum/disease/D in M.viruses)
if(!(D.visibility_flags & HIDDEN_SCANNER))
diff --git a/code/game/objects/items/nuke_tools.dm b/code/game/objects/items/nuke_tools.dm
index 9b49f23cb73..b88d4f6a07c 100644
--- a/code/game/objects/items/nuke_tools.dm
+++ b/code/game/objects/items/nuke_tools.dm
@@ -11,7 +11,8 @@
var/cooldown = 0
/obj/item/nuke_core/New()
- SSobj.processing += src
+ ..()
+ SSobj.processing |= src
/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user)
if(istype(container))
@@ -41,13 +42,16 @@
core = ncore
icon_state = "core_container_loaded"
user << "Container is sealing..."
- spawn(50)
+ addtimer(src, "seal", 50)
+ return 1
+
+/obj/item/nuke_core_container/proc/seal()
+ if(istype(core))
SSobj.processing -= core
icon_state = "core_container_sealed"
- playsound(loc, 'sound/items/Deconstruct.ogg', 100, 1)
- if(loc == user)
- user << "Container is sealed, the radiation is contained."
- return 1
+ playsound(loc, 'sound/items/Deconstruct.ogg', 60, 1)
+ if(ismob(loc))
+ loc << "[src] is permanently sealed, [core]'s radiation is contained."
/obj/item/nuke_core_container/attackby(obj/item/nuke_core/core, mob/user)
if(istype(core))
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index a674ccb0d69..72344703528 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -20,7 +20,106 @@
"[user] has prodded you with [src]!")
add_logs(user, M, "stunned", src, "(INTENT: [uppertext(user.a_intent)])")
+/obj/item/borg/cyborghug
+ name = "Hugging Module"
+ icon_state = "hugmodule"
+ desc = "For when a someone really needs a hug."
+ var/mode = 0 //0 = Hugs 1 = "Hug" 2 = Shock 3 = CRUSH
+ var/ccooldown = 0
+ var/scooldown = 0
+/obj/item/borg/cyborghug/attack_self(mob/living/user)
+ if(isrobot(user))
+ var/mob/living/silicon/robot/P = user
+ if(P.emagged)
+ if(mode < 3)
+ mode++
+ else
+ mode = 0
+ else if(mode < 1)
+ mode++
+ else
+ mode = 0
+ switch(mode)
+ if(0)
+ user << "Power reset. Hugs!"
+ if(1)
+ user << "Power increased!"
+ if(2)
+ user << "BZZT. Electrifying arms..."
+ if(3)
+ user << "ERROR: ARM ACTUATORS OVERLOADED."
+
+/obj/item/borg/cyborghug/attack(mob/living/M, mob/living/silicon/robot/user)
+ switch(mode)
+ if(0)
+ if(M.health >= 0)
+ if(ishuman(M))
+ if(M.lying)
+ user.visible_message("[user] shakes [M] trying to get \him up!", \
+ "You shake [M] trying to get \him up!")
+ else
+ user.visible_message("[user] hugs [M] to make \him feel better!", \
+ "You hug [M] to make \him feel better!")
+ if(M.resting)
+ M.resting = 0
+ M.update_canmove()
+ else
+ user.visible_message("[user] pets [M]!", \
+ "You pet [M]!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ if(1)
+ if(M.health >= 0)
+ if(ishuman(M))
+ if(M.lying)
+ user.visible_message("[user] shakes [M] trying to get \him up!", \
+ "You shake [M] trying to get \him up!")
+ else
+ user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
+ "You hug [M] firmly to make \him feel better! [M] looks uncomfortable...")
+ if(M.resting)
+ M.resting = 0
+ M.update_canmove()
+ else
+ user.visible_message("[user] bops [M] on the head!", \
+ "You bop [M] on the head!")
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1)
+ if(2)
+ if(!scooldown)
+ if(M.health >= 0)
+ if(ishuman(M))
+ M.electrocute_act(5, "[user]", safety = 1)
+ user.visible_message("[user] electrocutes [M] with their touch!", \
+ "You electrocute [M] with your touch!")
+ M.update_canmove()
+ else
+ if(!isrobot(M))
+ M.adjustFireLoss(10)
+ user.visible_message("[user] shocks [M]!", \
+ "You shock [M]!")
+ else
+ user.visible_message("[user] shocks [M]. It does not seem to have an effect", \
+ "You shock [M] to no effect.")
+ playsound(loc, 'sound/effects/sparks2.ogg', 50, 1, -1)
+ user.cell.charge -= 400
+ scooldown = 1
+ spawn(10)
+ scooldown = 0
+ if(3)
+ if(!ccooldown)
+ if(M.health >= 0)
+ if(ishuman(M))
+ user.visible_message("[user] crushes [M] in their grip!", \
+ "You crush [M] in your grip!")
+ else
+ user.visible_message("[user] crushes [M]!", \
+ "You crush [M]!")
+ playsound(loc, 'sound/weapons/smash.ogg', 50, 1, -1)
+ M.adjustBruteLoss(10)
+ user.cell.charge -= 300
+ ccooldown = 1
+ spawn(10)
+ ccooldown = 0
/obj/item/borg/charger
name = "power connector"
@@ -146,8 +245,75 @@
user << "You stop charging [target]."
+/obj/item/device/harmalarm
+ name = "Sonic Harm Prevention Tool"
+ desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH"
+ icon_state = "megaphone"
+ var/cooldown = 0
+ var/emagged = 0
+/obj/item/device/harmalarm/emag_act(mob/user)
+ emagged = !emagged
+ if(emagged)
+ user << "You short out the safeties on the [src]!"
+ else
+ user << "You reset the safeties on the [src]!"
+/obj/item/device/harmalarm/attack_self(mob/user)
+ var/safety = !emagged
+ if(cooldown > world.time)
+ user << "The device is still recharging!"
+ return
+
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ if(R.cell.charge < 1200)
+ user << "You don't have enough charge to do this!"
+ return
+ R.cell.charge -= 1000
+ if(R.emagged)
+ safety = 0
+
+ if(safety == 1)
+ user.visible_message("[user] blares out a near-deafening siren from its speakers!", \
+ "The siren pierces your hearing and confuses you!", \
+ "The siren pierces your hearing!")
+ for(var/mob/living/M in get_hearers_in_view(9, user))
+ if(iscarbon(M))
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
+ continue
+ M.confused += 6
+ M << "HUMAN HARM"
+ playsound(get_turf(src), 'sound/AI/harmalarm.ogg', 70, 3)
+ cooldown = world.time + 200
+ log_game("[user.ckey]([user]) used a Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ R.connected_ai << "
NOTICE - Peacekeeping 'HARM ALARM' used by: [user]
"
+
+ return
+
+ if(safety == 0)
+ user.visible_message("[user] blares out a sonic screech from its speakers!", \
+ "You hear a sharp screech before your thoughts are interrupted and you collapse, your ears ringing!", \
+ "You hear a sonic screech and collapse, your ears riniging!")
+ for(var/mob/living/M in get_hearers_in_view(9, user))
+ if(iscarbon(M))
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
+ continue
+ M.confused += 15
+ M.Weaken(2)
+ M.stuttering += 30
+ M.adjustEarDamage(0, 20)
+ M.Jitter(25)
+ M << "BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT"
+ playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3)
+ cooldown = world.time + 600
+ log_game("[user.ckey]([user]) used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
/**********************************************************************
HUD/SIGHT things
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 42e6d7f7280..8a0a32d8672 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -210,10 +210,15 @@
if(!user.unEquip(W))
return
- if(M.syndiemmi)
+ if(M.hacked || M.clockwork)
aisync = 0
lawsync = 0
- O.laws = new /datum/ai_laws/syndicate_override
+ if(M.clockwork)
+ O.laws = new/datum/ai_laws/ratvar
+ spawn(1)
+ add_servant_of_ratvar(O)
+ else
+ O.laws = new/datum/ai_laws/syndicate_override
O.invisibility = 0
//Transfer debug settings to new mob
@@ -226,7 +231,7 @@
O.notify_ai(1)
if(forced_ai)
O.connected_ai = forced_ai
- if(!lawsync && !M.syndiemmi)
+ if(!lawsync && !M.hacked)
O.lawupdate = 0
O.make_laws()
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index ba891f89d78..72969f4abbf 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -112,3 +112,71 @@ RSF
matter--
user << "The RSF now holds [matter]/30 fabrication-units."
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
+
+/obj/item/weapon/cookiesynth
+ name = "Cookie Synthesizer"
+ desc = "A self-recharging device used to rapidly deploy cookies."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rcd"
+ var/matter = 10
+ var/toxin = 0
+ var/emagged = 0
+ w_class = 3
+
+/obj/item/weapon/cookiesynth/New()
+ desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units."
+
+/obj/item/weapon/cookiesynth/attackby()
+ return
+
+/obj/item/weapon/cookiesynth/emag_act(mob/user)
+ emagged = !emagged
+ if(emagged)
+ user << "You short out the [src]'s reagent safety checker!"
+ else
+ user << "You reset the [src]'s reagent safety checker!"
+ toxin = 0
+
+/obj/item/weapon/cookiesynth/attack_self(mob/user)
+ var/mob/living/silicon/robot/P = null
+ if(isrobot(user))
+ P = user
+ if(emagged&&!toxin)
+ toxin = 1
+ user << "Cookie Synthesizer Hacked"
+ else if(P.emagged&&!toxin)
+ toxin = 1
+ user << "Cookie Synthesizer Hacked"
+ else
+ toxin = 0
+ user << "Cookie Synthesizer Reset"
+
+/obj/item/weapon/cookiesynth/process()
+ if (matter < 10)
+ matter++
+
+/obj/item/weapon/cookiesynth/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
+ if (!(istype(A, /obj/structure/table) || istype(A, /turf/open/floor)))
+ return
+ if(matter < 1)
+ user << "The [src] doesn't have enough matter left. Wait for it to recharge!"
+ return
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ if(!R.cell || R.cell.charge < 400)
+ user << "You do not have enough power to use [src]."
+ return
+ var/turf/T = get_turf(A)
+ playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
+ user << "Fabricating Cookie.."
+ var/obj/item/weapon/reagent_containers/food/snacks/cookie/S = new /obj/item/weapon/reagent_containers/food/snacks/cookie(T)
+ if(toxin)
+ S.reagents.add_reagent("chloralhydrate2", 10)
+ if (isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ R.cell.charge -= 100
+ else
+ matter--
+ desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index c04ead47e26..0bb8b547514 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -1,5 +1,4 @@
//backpack item
-
/obj/item/weapon/defibrillator
name = "defibrillator"
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
@@ -19,6 +18,7 @@
var/obj/item/weapon/twohanded/shockpaddles/paddles
var/obj/item/weapon/stock_parts/cell/high/bcell = null
var/combat = 0 //can we revive through space suits?
+ var/grab_ghost = FALSE // Do we pull the ghost back into their body?
/obj/item/weapon/defibrillator/New() //starts without a cell for rnd
..()
@@ -297,6 +297,7 @@
var/obj/item/weapon/defibrillator/defib
var/req_defib = 1
var/combat = 0 //If it penetrates armor and gives additional functionality
+ var/grab_ghost = FALSE
/obj/item/weapon/twohanded/shockpaddles/proc/recharge(var/time)
if(req_defib || !time)
@@ -382,178 +383,186 @@
else
user << "You aren't sure how to revive that..."
return
- else
- var/mob/living/carbon/human/H = M
- if(user.a_intent == "disarm")
- if(req_defib && defib.safety)
- return
- if(!req_defib && !combat)
- return
- busy = 1
- H.visible_message("[user] has touched [H.name] with [src]!", \
- "[user] has touched [H.name] with [src]!")
- H.adjustStaminaLoss(50)
- H.Weaken(5)
- H.updatehealth() //forces health update before next life tick
- playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
- H.emote("gasp")
- add_logs(user, M, "stunned", src)
- if(req_defib)
- defib.deductcharge(revivecost)
- cooldown = 1
- busy = 0
- update_icon()
- if(req_defib)
- defib.cooldowncheck(user)
- else
- recharge(60)
+ var/mob/living/carbon/human/H = M
+
+ if(user.a_intent == "disarm")
+ if(req_defib && defib.safety)
return
- if(user.zone_selected == "chest")
- if(user.a_intent == "harm")
- if(req_defib && defib.safety)
+ if(!req_defib && !combat)
+ return
+ busy = 1
+ H.visible_message("[user] has touched [H.name] with [src]!", \
+ "[user] has touched [H.name] with [src]!")
+ H.adjustStaminaLoss(50)
+ H.Weaken(5)
+ H.updatehealth() //forces health update before next life tick
+ playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ H.emote("gasp")
+ add_logs(user, M, "stunned", src)
+ if(req_defib)
+ defib.deductcharge(revivecost)
+ cooldown = 1
+ busy = 0
+ update_icon()
+ if(req_defib)
+ defib.cooldowncheck(user)
+ else
+ recharge(60)
+ return
+
+ if(user.zone_selected != "chest")
+ user << "You need to target your patient's \
+ chest with [src]!"
+ return
+ if(user.a_intent == "harm")
+ if(req_defib && defib.safety)
+ return
+ if(!req_defib && !combat)
+ return
+ user.visible_message("[user] begins to place [src] on [M.name]'s chest.",
+ "You overcharge the paddles and begin to place them onto [M]'s chest...")
+ busy = 1
+ update_icon()
+ if(do_after(user, 30, target = M))
+ user.visible_message("[user] places [src] on [M.name]'s chest.",
+ "You place [src] on [M.name]'s chest and begin to charge them.")
+ var/turf/T = get_turf(defib)
+ playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
+ if(req_defib)
+ T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...")
+ else
+ user.audible_message("[src] let out an urgent beep.")
+ if(do_after(user, 30, target = M)) //Takes longer due to overcharging
+ if(!M)
+ busy = 0
+ update_icon()
return
- if(!req_defib && !combat)
+ if(M && M.stat == DEAD)
+ user << "[M] is dead."
+ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
+ busy = 0
+ update_icon()
return
- user.visible_message("[user] begins to place [src] on [M.name]'s chest.",
- "You overcharge the paddles and begin to place them onto [M]'s chest...")
- busy = 1
- update_icon()
- if(do_after(user, 30, target = M))
- user.visible_message("[user] places [src] on [M.name]'s chest.",
- "You place [src] on [M.name]'s chest and begin to charge them.")
- var/turf/T = get_turf(defib)
- playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
- if(req_defib)
- T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...")
- else
- user.audible_message("[src] let out an urgent beep.")
- if(do_after(user, 30, target = M)) //Takes longer due to overcharging
- if(!M)
- busy = 0
- update_icon()
- return
- if(M && M.stat == DEAD)
- user << "[M] is dead."
- playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
- busy = 0
- update_icon()
- return
- user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!")
- playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1)
- playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1)
- var/mob/living/carbon/human/HU = M
- M.emote("scream")
- if(!HU.heart_attack)
- HU.heart_attack = 1
- if(!HU.stat)
- HU.visible_message("[M] thrashes wildly, clutching at their chest!",
- "You feel a horrible agony in your chest!")
- HU.apply_damage(50, BURN, "chest")
- add_logs(user, M, "overloaded the heart of", defib)
- M.Weaken(5)
- M.Jitter(100)
- if(req_defib)
- defib.deductcharge(revivecost)
- cooldown = 1
- busy = 0
- update_icon()
- if(!req_defib)
- recharge(60)
- if(req_defib && (defib.cooldowncheck(user)))
- return
+ user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!")
+ playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1)
+ playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1)
+ var/mob/living/carbon/human/HU = M
+ M.emote("scream")
+ if(!HU.heart_attack)
+ HU.heart_attack = 1
+ if(!HU.stat)
+ HU.visible_message("[M] thrashes wildly, clutching at their chest!",
+ "You feel a horrible agony in your chest!")
+ HU.apply_damage(50, BURN, "chest")
+ add_logs(user, M, "overloaded the heart of", defib)
+ M.Weaken(5)
+ M.Jitter(100)
+ if(req_defib)
+ defib.deductcharge(revivecost)
+ cooldown = 1
busy = 0
update_icon()
- return
- if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound)
- H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
+ if(!req_defib)
+ recharge(60)
+ if(req_defib && (defib.cooldowncheck(user)))
+ return
+ busy = 0
+ update_icon()
+ return
+ if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost))
+ H.notify_ghost_cloning("Your heart is being defibrillated!")
+ H.grab_ghost() // Shove them back in their body.
+ else if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound)
+ H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
- user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...")
- busy = 1
- update_icon()
- if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
- user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
- playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
- var/tplus = world.time - H.timeofdeath
- var/tlimit = 1200 //past this much time the patient is unrecoverable (in deciseconds)
- var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
- var/total_burn = 0
- var/total_brute = 0
- if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
- for(var/obj/item/carried_item in H.contents)
- if(istype(carried_item, /obj/item/clothing/suit/space))
- if((!src.combat && !req_defib) || (req_defib && !defib.combat))
- user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.")
- playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
- busy = 0
- update_icon()
- return
- if(H.stat == DEAD)
- M.visible_message("[M]'s body convulses a bit.")
- playsound(get_turf(src), "bodyfall", 50, 1)
- playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
- total_brute = H.getBruteLoss()
- total_burn = H.getFireLoss()
-
- var/failed = null
-
- if (H.suiciding || (H.disabilities & NOCLONE))
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile."
- else if (H.hellbound)
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile."
- else if (tplus > tlimit)
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile."
- else if (!H.getorgan(/obj/item/organ/heart))
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing."
- else if(total_burn >= 180 || total_brute >= 180)
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile."
- else if(H.get_ghost())
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful."
- else
- var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
- if(!BR || BR.damaged_brain)
- failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile."
-
- if(failed)
- user.visible_message(failed)
- playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
- else
- //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit
- if (H.health > halfwaycritdeath)
- H.adjustOxyLoss(H.health - halfwaycritdeath, 0)
- else
- var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss()
- var/mobhealth = H.health
- H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0)
- H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0)
- H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0)
- H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0)
- user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")
- playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0)
- H.revive()
- H.emote("gasp")
- if(tplus > tloss)
- H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
- add_logs(user, M, "revived", defib)
- if(req_defib)
- defib.deductcharge(revivecost)
- cooldown = 1
- update_icon()
- if(req_defib)
- defib.cooldowncheck(user)
- else
- recharge(60)
- else if(H.heart_attack)
- H.heart_attack = 0
- user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.")
- playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
- else
- user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.")
+ user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...")
+ busy = 1
+ update_icon()
+ if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
+ user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
+ playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
+ var/tplus = world.time - H.timeofdeath
+ // past this much time the patient is unrecoverable
+ // (in deciseconds)
+ var/tlimit = DEFIB_TIME_LIMIT * 10
+ // brain damage starts setting in on the patient after
+ // some time left rotting
+ var/tloss = DEFIB_TIME_LOSS * 10
+ var/total_burn = 0
+ var/total_brute = 0
+ if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
+ for(var/obj/item/carried_item in H.contents)
+ if(istype(carried_item, /obj/item/clothing/suit/space))
+ if((!src.combat && !req_defib) || (req_defib && !defib.combat))
+ user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
- busy = 0
- update_icon()
- else
- user << "You need to target your patient's chest with [src]!"
- return
+ busy = 0
+ update_icon()
+ return
+ if(H.stat == DEAD)
+ M.visible_message("[M]'s body convulses a bit.")
+ playsound(get_turf(src), "bodyfall", 50, 1)
+ playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ total_brute = H.getBruteLoss()
+ total_burn = H.getFireLoss()
+
+ var/failed = null
+
+ if (H.suiciding || (H.disabilities & NOCLONE))
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile."
+ else if (H.hellbound)
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile."
+ else if (tplus > tlimit)
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile."
+ else if (!H.getorgan(/obj/item/organ/heart))
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing."
+ else if(total_burn >= 180 || total_brute >= 180)
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile."
+ else if(H.get_ghost())
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful."
+ else
+ var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain)
+ if(!BR || BR.damaged_brain)
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile."
+
+ if(failed)
+ user.visible_message(failed)
+ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
+ else
+ //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit
+ if (H.health > halfwaycritdeath)
+ H.adjustOxyLoss(H.health - halfwaycritdeath, 0)
+ else
+ var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss()
+ var/mobhealth = H.health
+ H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0)
+ H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0)
+ H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0)
+ H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0)
+ user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")
+ playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0)
+ H.revive()
+ H.emote("gasp")
+ if(tplus > tloss)
+ H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
+ add_logs(user, M, "revived", defib)
+ if(req_defib)
+ defib.deductcharge(revivecost)
+ cooldown = 1
+ update_icon()
+ if(req_defib)
+ defib.cooldowncheck(user)
+ else
+ recharge(60)
+ else if(H.heart_attack)
+ H.heart_attack = 0
+ user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.")
+ playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ else
+ user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.")
+ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
+ busy = 0
+ update_icon()
/obj/item/weapon/twohanded/shockpaddles/syndicate
name = "syndicate defibrillator paddles"
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index f56f9d01d5a..c3512dfc983 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -174,7 +174,7 @@
var/turf/T = get_turf(loc)
if(istype(T, /turf/open))
var/turf/open/theturf = T
- theturf.MakeSlippery(min = 10, max = 5)
+ theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.")
return
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 103e0b3f07c..bd261f6a22c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -305,6 +305,9 @@
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
Crossed(user) //honk
+/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg
+ breakouttime = 20 // Cyborgs shouldn't have a strong restraint
+
/obj/item/weapon/restraints/legcuffs/bola
name = "bola"
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 97a9278a63d..236bad8dc28 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -74,6 +74,45 @@
creation_time = 30
max_signs = 6
+/obj/item/weapon/holosign_creator/cyborg
+ name = "Energy Barrier Projector"
+ desc = "A holographic projector that creates fragile energy fields"
+ creation_time = 5
+ max_signs = 9
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ var/shock = 0
+
+/obj/item/weapon/holosign_creator/cyborg/attack_self(mob/user)
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+
+ if(shock)
+ user <<"You clear all active holograms, and reset your projector to normal."
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ creation_time = 5
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ shock = 0
+ return
+ else if(R.emagged&&!shock)
+ user <<"You clear all active holograms, and overload your energy projector!"
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg/hacked
+ creation_time = 30
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ shock = 1
+ return
+ else
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ user << "You clear all active holograms."
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ user << "You clear all active holograms."
/obj/effect/overlay/holograph
icon = 'icons/effects/effects.dmi'
@@ -185,3 +224,36 @@
/obj/effect/overlay/holograph/barrier/engineering
icon_state = "holosign_engi"
+
+/obj/effect/overlay/holograph/barrier/cyborg
+ name = "Energy Field"
+ desc = "A fragile energy field that blocks movement"
+ density = 1
+ holo_integrity = 1
+
+/obj/effect/overlay/holograph/barrier/CanPass()
+ return 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked
+ name = "Charged Energy Field"
+ desc = "A powerful energy field that blocks movement. Energy arcs off it"
+ holo_integrity = 3
+ var/shockcd = 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked/attack_hand(mob/living/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = 1
+ spawn(10)
+ shockcd = 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked/Bumped(atom/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = 1
+ spawn(10)
+ shockcd = 0
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 7ad6d644047..448925b824c 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -23,7 +23,7 @@
obj/item/weapon/mop/proc/clean(turf/A)
- if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1))
+ if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1))
A.clean_blood()
for(var/obj/effect/O in A)
if(is_cleanable(O))
@@ -31,7 +31,7 @@ obj/item/weapon/mop/proc/clean(turf/A)
if(istype(A, /turf/closed))
var/turf/closed/C = A
C.thermite = 0
- reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
+ reagents.reaction(A, TOUCH, 5) //Needed for proper floor wetting.
reagents.remove_any(1) //reaction() doesn't use up the reagents
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 0e0ff304900..6889a6cbdd5 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -141,7 +141,7 @@
user << "This MMI does not seem to fit!"
return
- if(M.syndiemmi)
+ if(M.hacked)
user << "This MMI does not seem to fit!"
return
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 1265b21905c..8dd7a6138b2 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -381,10 +381,10 @@
/obj/structure/closet/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(opened || !secure || !in_range(src, user))
+ if(opened || !secure)
return
else
togglelock(user)
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 48004def34a..1fd47bc35e9 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -124,11 +124,9 @@
/obj/structure/reflector/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
rotate()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 199c3ddae49..a38f9465763 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -134,7 +134,7 @@
return 0
if(!G.confirm())
return 0
- G.affecting.loc = src.loc
+ G.affecting.forceMove(src.loc)
if(istype(src, /obj/structure/table/optable))
var/obj/structure/table/optable/OT = src
G.affecting.resting = 1
@@ -263,29 +263,54 @@
buildstack = /obj/item/stack/sheet/glass
canSmoothWith = null
health = 50
+ var/list/debris = list()
+
+/obj/structure/table/glass/New()
+ . = ..()
+ debris += new frame
+ debris += new /obj/item/weapon/shard
+
+/obj/structure/table/glass/Destroy()
+ for(var/i in debris)
+ qdel(i)
+ . = ..()
/obj/structure/table/glass/Crossed(atom/movable/AM)
. = ..()
if(flags & NODECONSTRUCT)
return
+ if(!isliving(AM))
+ return
// Don't break if they're just flying past
if(AM.throwing)
- return
+ spawn(5)
+ // Check again in a bit though
+ if(AM.loc == get_turf(src))
+ check_break(AM)
+ else
+ check_break(AM)
- if(istype(AM, /mob/living))
- var/mob/living/M = AM
- if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL)
- table_shatter(M)
+/obj/structure/table/glass/proc/check_break(mob/living/M)
+ if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL)
+ table_shatter(M)
/obj/structure/table/glass/proc/table_shatter(mob/M)
- visible_message("[src] breaks!")
+ visible_message("[src] breaks!",
+ "You hear breaking glass.")
playsound(src.loc, "shatter", 50, 1)
- new frame(src.loc)
- var/obj/item/weapon/shard/S = new(src.loc)
- S.throw_impact(M)
+ for(var/i in debris)
+ var/atom/movable/AM = i
+ AM.loc = get_turf(src)
+ if(istype(AM, /obj/item/weapon/shard))
+ AM.throw_impact(M)
M.Weaken(5)
qdel(src)
+/obj/structure/table/glass/narsie_act()
+ color = NARSIE_WINDOW_COLOUR
+ for(var/obj/item/weapon/shard/S in debris)
+ S.color = NARSIE_WINDOW_COLOUR
+
/*
* Wooden tables
*/
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index f86fcf945fa..b555f251230 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -182,7 +182,7 @@
else
if(istype(loc, /turf/open))
var/turf/open/tile = loc
- tile.MakeSlippery(min = 5, max = 1)
+ tile.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
/obj/machinery/shower/attackby(obj/item/I, mob/user, params)
@@ -492,4 +492,4 @@
/obj/structure/sink/puddle/attackby(obj/item/O, mob/user, params)
icon_state = "puddle-splash"
. = ..()
- icon_state = "puddle"
\ No newline at end of file
+ icon_state = "puddle"
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 9d8f2f93bbc..e81ee6965a7 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -69,10 +69,9 @@
shatter()
/obj/structure/window/narsie_act()
- var/evil_color = "#7D1919"
- color = evil_color
+ color = NARSIE_WINDOW_COLOUR
for(var/obj/item/weapon/shard/shard in debris)
- shard.color = evil_color
+ shard.color = NARSIE_WINDOW_COLOUR
/obj/structure/window/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index fc864ad8326..a81b33ab048 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -95,10 +95,8 @@
C.spin(1,1)
return 1
-/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min = 0, max = 0) // 1 = Water, 2 = Lube, 3 = Ice
- wet_time += max
- if(wet_time < min)
- wet_time = min
+/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice
+ wet_time = max(wet_time+wet_time_to_add, min_wet_time)
if(wet >= wet_setting)
return
wet = wet_setting
@@ -129,6 +127,10 @@
overlays -= wet_overlay
/turf/open/proc/HandleWet()
+ if(!wet)
+ //It's possible for this handler to get called after all the wetness is
+ //cleared, so bail out if that is the case
+ return
if(!wet_time && wet < TURF_WET_ICE)
MakeDry(TURF_WET_ICE)
if(wet_time > MAXIMUM_WET_TIME)
@@ -159,5 +161,5 @@
if(!wet && wet_time)
wet_time = 0
if(wet)
- addtimer(src, "HandleWet", 15, 1)
+ addtimer(src, "HandleWet", 15)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index afca2aebd16..7117d9592b5 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -231,7 +231,7 @@
else if (istype(thing, /mob/living))
. = 1
var/mob/living/L = thing
- if("mining" in L.faction)
+ if("lava" in L.weather_immunities)
continue
if(L.buckled)
if(isobj(L.buckled))
@@ -239,8 +239,8 @@
if(O.burn_state == LAVA_PROOF)
continue
if(isliving(L.buckled)) //Goliath riding
- var/mob/living/liv = L.buckled
- if("mining" in liv.faction)
+ var/mob/living/live = L.buckled
+ if("lava" in live.weather_immunities)
continue
L.adjustFireLoss(20)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 7f192fce020..f5421143b5b 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -157,6 +157,11 @@
/mob/living/proc/canSuicide()
if(stat == CONSCIOUS)
+ if(mental_dominator)
+ src << "This body's force of will is too strong! You can't break it enough to murder them."
+ if(mind_control_holder)
+ mind_control_holder << "Through tremendous force of will, you stop a suicide attempt!"
+ return 0
return 1
else if(stat == DEAD)
src << "You're already dead!"
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB_ban/functions.dm
similarity index 100%
rename from code/modules/admin/DB ban/functions.dm
rename to code/modules/admin/DB_ban/functions.dm
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 220b1b4c9e9..dfc910e5aa1 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -468,6 +468,16 @@
dat += "FLW | "
dat += ""
+ if(ticker.mode.servants_of_ratvar.len)
+ dat += "
| Servants of Ratvar | |
"
+ for(var/datum/mind/N in ticker.mode.servants_of_ratvar)
+ var/mob/M = N.current
+ if(M)
+ dat += "| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "FLW |
"
+ dat += "
"
+
if(ticker.mode.red_deities.len || ticker.mode.red_deity_prophets.len || ticker.mode.blue_deity_prophets.len || ticker.mode.red_deity_followers.len || ticker.mode.blue_deity_followers.len)
dat += "
| Red Deity | |
"
for(var/datum/mind/N in ticker.mode.red_deities)
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index b753875e24b..6f88e889ca2 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -91,7 +91,7 @@
var/mob/user = usr
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src))
usr << browse(null, "window=hscan")
onclose(usr, "hscan")
return
@@ -104,4 +104,4 @@
return
attack_self(user)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/atmospherics/gasmixtures/space_mixture.dm b/code/modules/atmospherics/gasmixtures/space_mixture.dm
index 608974f0ce0..5134087a386 100644
--- a/code/modules/atmospherics/gasmixtures/space_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/space_mixture.dm
@@ -18,7 +18,7 @@
return 0 //we're immutable.
/datum/gas_mixture/space/heat_capacity()
- . = 700000
+ . = 7000
/datum/gas_mixture/space/heat_capacity_archived()
. = heat_capacity()
@@ -57,5 +57,5 @@
return 0 //we're immutable.
/datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- . = ..(sharer, 1, sharer_temperature, sharer_heat_capacity)
- temperature = TCMB
\ No newline at end of file
+ . = ..()
+ temperature = TCMB
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 6c45742bb27..0788a8c2c27 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -79,11 +79,12 @@
if(ckey)
M.ckey = ckey
M << "[flavour_text]"
+ var/datum/mind/MM = M.mind
if(objectives)
- var/datum/mind/MM = M.mind
for(var/objective in objectives)
MM.objectives += new/datum/objective(objective)
special(M)
+ MM.name = M.real_name
if(uses > 0)
uses--
if(!permanent && !uses)
@@ -458,17 +459,6 @@
icon_state = "sleeper"
flavour_text = "You are a Nanotrasen Commander!"
-/obj/effect/mob_spawn/human/wwii
- name = "World War II Reenactor"
- uniform = /obj/item/clothing/under/wwii
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- mask = /obj/item/clothing/mask/gas
- helmet = /obj/item/clothing/head/helmet/stahlhelm
- back = /obj/item/weapon/storage/backpack/security
- has_id = 0
-
-
/////////////////Spooky Undead//////////////////////
/obj/effect/mob_spawn/human/skeleton
@@ -541,4 +531,4 @@
if(despawn == "No" || !loc || !Adjacent(user))
return
user.visible_message("[user.name] climbs back into cryosleep...")
- qdel(user)
\ No newline at end of file
+ qdel(user)
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client_defines.dm
similarity index 100%
rename from code/modules/client/client defines.dm
rename to code/modules/client/client_defines.dm
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client_procs.dm
similarity index 100%
rename from code/modules/client/client procs.dm
rename to code/modules/client/client_procs.dm
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a3856b0ee1c..b09809c649e 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -460,11 +460,9 @@ BLIND // can't see anything
/obj/item/clothing/under/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
rolldown()
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 24a18a98808..157c2254b3d 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -260,37 +260,4 @@
name = "paper sack hat"
desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all."
icon_state = "papersack_smile"
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
-
-/*
--!WARNING!-
--POTENTIAL TRIGGER-INDUCING ITEMS AHEAD-
--TREAD WITH CAUTION-
-*/
-
-/obj/item/clothing/head/helmet/stahlhelm
- name = "stahlhelm"
- desc = "A hard military helmet, seems dusty."
- icon_state = "stalhelm"
- item_state = "stalhelm"
- armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- strip_delay = 30
-
-/obj/item/clothing/head/helmet/panzer
- name = "Panzer Cap"
- desc = "A fancy-looking military cap."
- icon_state = "panzercap"
- item_state = "panzercap"
-
-/obj/item/clothing/head/helmet/naziofficer
- name = "Officer Cap"
- desc = "A cap fit for a commanding officer."
- icon_state = "officercap"
- item_state = "officercap"
- armor = list(melee = 20, bullet = 15, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- strip_delay = 60
-
-/*
--YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT-
--PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY-
-*/
\ No newline at end of file
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
\ No newline at end of file
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index d66fef73c9b..1ce016c73fe 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -23,11 +23,9 @@
/obj/item/clothing/head/soft/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
flip(user)
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 2ac22361d26..8b82ff05ae2 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -18,11 +18,9 @@
/obj/item/clothing/mask/breath/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
adjustmask(user)
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 7209b40e937..d7254471867 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -124,7 +124,8 @@
/obj/item/weapon/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/weapon/gun/energy/pulse/pistol/loyalpin=1,\
- /obj/item/weapon/reagent_containers/hypospray/combat/nanites=1)
+ /obj/item/weapon/reagent_containers/hypospray/combat/nanites=1,\
+ /obj/item/weapon/gun/medbeam=1)
/datum/outfit/ert/engineer
name = "ERT Engineer"
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 5f7b4386db7..35049b25351 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -70,11 +70,9 @@
/obj/item/clothing/suit/toggle/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
suit_toggle(user)
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 6f7f9224e6e..cc8f789e3cd 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -12,23 +12,33 @@
/obj/item/clothing/under/rank/security
name = "security jumpsuit"
desc = "A tactical security jumpsuit for officers complete with nanotrasen belt buckle."
- icon_state = "security"
- item_state = "gy_suit"
- item_color = "security"
+ icon_state = "rsecurity"
+ item_state = "r_suit"
+ item_color = "rsecurity"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
strip_delay = 50
alt_covers_chest = 1
+/obj/item/clothing/under/rank/security/grey
+ icon_state = "security"
+ item_state = "gy_suit"
+ item_color = "security"
+
/obj/item/clothing/under/rank/warden
name = "security suit"
desc = "A formal security suit for officers complete with nanotrasen belt buckle."
- icon_state = "warden"
- item_state = "gy_suit"
- item_color = "warden"
+ icon_state = "rwarden"
+ item_state = "r_suit"
+ item_color = "rwarden"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
strip_delay = 50
alt_covers_chest = 1
+/obj/item/clothing/under/rank/warden/grey
+ icon_state = "warden"
+ item_state = "gy_suit"
+ item_color = "warden"
+
/*
* Detective
*/
@@ -56,13 +66,18 @@
/obj/item/clothing/under/rank/head_of_security
name = "head of security's jumpsuit"
desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security."
- icon_state = "hos"
- item_state = "gy_suit"
- item_color = "hos"
+ icon_state = "rhos"
+ item_state = "r_suit"
+ item_color = "rhos"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
strip_delay = 60
alt_covers_chest = 1
+/obj/item/clothing/under/rank/head_of_security/grey
+ icon_state = "hos"
+ item_state = "gy_suit"
+ item_color = "hos"
+
/obj/item/clothing/under/rank/head_of_security/alt
name = "head of security's turtleneck"
desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index a63fd72439e..5c660d23388 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -573,33 +573,3 @@
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
-
-/*
--!WARNING!-
--POTENTIAL TRIGGER-INDUCING ITEMS AHEAD-
--TREAD WITH CAUTION-
-*/
-
-/obj/item/clothing/under/wwii
- name = "dusty uniform"
- desc = "A dusty old uniform, a relic from a time before."
- icon_state = "soldieruniform"
- item_state = "soldieruniform"
- item_color = "soldieruniform"
- armor = list(melee = 10, bullet = 5, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- strip_delay = 50
-
-
-/obj/item/clothing/under/wwii/officer
- name = "dusty uniform"
- desc = "A dusty old uniform, a relic from a time before. This one looks more official."
- icon_state = "officeruniform"
- item_state = "officeruniform"
- item_color = "officeruniform"
- armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- strip_delay = 60
-
-/*
--YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT-
--PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY-
-*/
diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm
index 13615544aaf..afdd178ac40 100644
--- a/code/modules/events/operative.dm
+++ b/code/modules/events/operative.dm
@@ -9,7 +9,7 @@
role_name = "lone operative"
/datum/round_event/ghost_role/operative/spawn_role()
- var/list/candidates = get_candidates("operative", 3000, ROLE_OPERATIVE)
+ var/list/candidates = get_candidates("operative", null, ROLE_OPERATIVE)
if(!candidates.len)
return NOT_ENOUGH_PLAYERS
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
similarity index 100%
rename from code/modules/food&drinks/drinks/drinks.dm
rename to code/modules/food_and_drinks/drinks/drinks.dm
diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
similarity index 99%
rename from code/modules/food&drinks/drinks/drinks/bottle.dm
rename to code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 852c8ed9108..7a61fd5f981 100644
--- a/code/modules/food&drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -203,7 +203,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell
desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
- list_reagents = list("hellwater" = 100)
+ list_reagents = list("hell_water" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth
name = "Goldeneye Vermouth"
diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
similarity index 100%
rename from code/modules/food&drinks/drinks/drinks/drinkingglass.dm
rename to code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
diff --git a/code/modules/food&drinks/food.dm b/code/modules/food_and_drinks/food.dm
similarity index 100%
rename from code/modules/food&drinks/food.dm
rename to code/modules/food_and_drinks/food.dm
diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
similarity index 100%
rename from code/modules/food&drinks/food/condiment.dm
rename to code/modules/food_and_drinks/food/condiment.dm
diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
similarity index 100%
rename from code/modules/food&drinks/food/customizables.dm
rename to code/modules/food_and_drinks/food/customizables.dm
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks.dm
rename to code/modules/food_and_drinks/food/snacks.dm
diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks/dough.dm
rename to code/modules/food_and_drinks/food/snacks/dough.dm
diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
similarity index 97%
rename from code/modules/food&drinks/food/snacks/meat.dm
rename to code/modules/food_and_drinks/food/snacks/meat.dm
index 6564bd05163..0d8cee8dff4 100644
--- a/code/modules/food&drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -31,7 +31,7 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
- name = "-meat"
+ name = " meat"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human
@@ -56,19 +56,19 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
icon_state = "slimemeat"
- desc = "Because jello wasn't offensive enough to vegans"
+ desc = "Because jello wasn't offensive enough to vegans."
list_reagents = list("nutriment" = 3, "slimejelly" = 3)
filling_color = "#00FFFF"
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
icon_state = "golemmeat"
- desc = "Edible rocks, welcome to the future"
+ desc = "Edible rocks, welcome to the future."
list_reagents = list("nutriment" = 3, "iron" = 3)
filling_color = "#A9A9A9"
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine
icon_state = "agolemmeat"
- desc = "From the slime pen to the rune to the kitchen, science"
+ desc = "From the slime pen to the rune to the kitchen, science."
filling_color = "#66CDAA"
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
@@ -78,7 +78,7 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
icon_state = "plantmeat"
- desc = "All the joys of healthy eating with all the fun of cannibalism"
+ desc = "All the joys of healthy eating with all the fun of cannibalism."
filling_color = "#E9967A"
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
@@ -88,18 +88,18 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
icon_state = "flymeat"
- desc = "Nothing says tasty like maggot filled radioactive mutant flesh"
+ desc = "Nothing says tasty like maggot filled radioactive mutant flesh."
list_reagents = list("nutriment" = 3, "uranium" = 3)
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
name = "-bone"
icon_state = "skeletonmeat"
- desc = "There's a point where this needs to stop and clearly we have passed it"
+ desc = "There's a point where this needs to stop, and clearly we have passed it."
filling_color = "#F0F0F0"
slice_path = null //can't slice a bone into cutlets
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
- name = "-meat (rotten)"
+ name = " meat (rotten)"
icon_state = "lizardmeat" //Close enough.
desc = "Halfway to becoming fertilizer for your garden."
filling_color = "#6B8E23"
diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_bread.dm
rename to code/modules/food_and_drinks/food/snacks_bread.dm
diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_burgers.dm
rename to code/modules/food_and_drinks/food/snacks_burgers.dm
diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_cake.dm
rename to code/modules/food_and_drinks/food/snacks_cake.dm
diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_egg.dm
rename to code/modules/food_and_drinks/food/snacks_egg.dm
diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_meat.dm
rename to code/modules/food_and_drinks/food/snacks_meat.dm
diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_other.dm
rename to code/modules/food_and_drinks/food/snacks_other.dm
diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pastry.dm
rename to code/modules/food_and_drinks/food/snacks_pastry.dm
diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pie.dm
rename to code/modules/food_and_drinks/food/snacks_pie.dm
diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pizza.dm
rename to code/modules/food_and_drinks/food/snacks_pizza.dm
diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_salad.dm
rename to code/modules/food_and_drinks/food/snacks_salad.dm
diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_sandwichtoast.dm
rename to code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_soup.dm
rename to code/modules/food_and_drinks/food/snacks_soup.dm
diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_spaghetti.dm
rename to code/modules/food_and_drinks/food/snacks_spaghetti.dm
diff --git a/code/modules/food&drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_vend.dm
rename to code/modules/food_and_drinks/food/snacks_vend.dm
diff --git a/code/modules/food&drinks/kitchen machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/food_cart.dm
rename to code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
similarity index 99%
rename from code/modules/food&drinks/kitchen machinery/gibber.dm
rename to code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index b31d4f68e18..d3df1ef47f9 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -204,7 +204,7 @@
for (var/i=1 to meat_produced)
var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat
var/obj/item/stack/sheet/animalhide/newskin = new typeofskin
- newmeat.name = sourcename + newmeat.name
+ newmeat.name = "[sourcename] [newmeat.name]"
newmeat.subjectname = sourcename
if(sourcejob)
newmeat.subjectjob = sourcejob
diff --git a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/icecream_vat.dm
rename to code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/juicer.dm
rename to code/modules/food_and_drinks/kitchen_machinery/juicer.dm
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/microwave.dm
rename to code/modules/food_and_drinks/kitchen_machinery/microwave.dm
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
rename to code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/processor.dm
rename to code/modules/food_and_drinks/kitchen_machinery/processor.dm
diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
similarity index 100%
rename from code/modules/food&drinks/kitchen machinery/smartfridge.dm
rename to code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
diff --git a/code/modules/food&drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
similarity index 100%
rename from code/modules/food&drinks/pizzabox.dm
rename to code/modules/food_and_drinks/pizzabox.dm
diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/drinks_recipes.dm
rename to code/modules/food_and_drinks/recipes/drinks_recipes.dm
diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/food_mixtures.dm
rename to code/modules/food_and_drinks/recipes/food_mixtures.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index b53d7c76906..02bb64af42b 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -97,9 +97,9 @@ Warden
ears = /obj/item/device/radio/headset/headset_sec/alt
uniform = /obj/item/clothing/under/rank/warden
shoes = /obj/item/clothing/shoes/jackboots
- suit = /obj/item/clothing/suit/armor/vest/warden
+ suit = /obj/item/clothing/suit/armor/vest/warden/alt
gloves = /obj/item/clothing/gloves/color/black
- head = /obj/item/clothing/head/beret/sec/navywarden
+ head = /obj/item/clothing/head/warden
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
r_pocket = /obj/item/device/assembly/flash/handheld
l_pocket = /obj/item/weapon/restraints/handcuffs
@@ -209,7 +209,7 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science")
uniform = /obj/item/clothing/under/rank/security
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/helmet/sec
- suit = /obj/item/clothing/suit/armor/vest
+ suit = /obj/item/clothing/suit/armor/vest/alt
shoes = /obj/item/clothing/shoes/jackboots
l_pocket = /obj/item/weapon/restraints/handcuffs
r_pocket = /obj/item/device/assembly/flash/handheld
diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm
index d0572ff0531..fed8c95c19f 100644
--- a/code/modules/mining/lavaland/weather.dm
+++ b/code/modules/mining/lavaland/weather.dm
@@ -25,6 +25,7 @@
var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs.
var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people
var/list/impacted_areas = list()
+ var/immunity_type = "storm"
/datum/weather/proc/weather_start_up()
for(var/area/N in get_areas(area_type))
@@ -73,9 +74,8 @@
/datum/weather/proc/storm_act(mob/living/L)
- if(prob(30)) //Dont want it spammed very tick
- L << "You're buffeted by the storm!"
- L.adjustBruteLoss(1)
+ if(immunity_type in L.weather_immunities)
+ return
/datum/weather/proc/update_areas()
for(var/area/N in impacted_areas)
diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm
index 181569c8792..1f75b7daa07 100644
--- a/code/modules/mining/lavaland/weather_types.dm
+++ b/code/modules/mining/lavaland/weather_types.dm
@@ -18,8 +18,13 @@
duration_overlay = "lava"
overlay_layer = 2 //Covers floors only
+ immunity_type = "lava"
+
/datum/weather/floor_is_lava/storm_act(mob/living/L)
+ if(immunity_type in L.weather_immunities)
+ return
+
var/turf/F = get_turf(L)
for(var/obj/structure/O in F.contents)
if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
@@ -77,6 +82,8 @@
duration_overlay = "ash_storm"
overlay_layer = 10
+ immunity_type = "ash"
+
/datum/weather/ash_storm/false_alarm //No storm, just light ember fall
purely_aesthetic = TRUE
@@ -85,8 +92,9 @@
wind_down_message = "The ash fall starts to trail off."
/datum/weather/ash_storm/storm_act(mob/living/L)
- if("mining" in L.faction)
+ if(immunity_type in L.weather_immunities)
return
+
if(istype(L.loc, /obj/mecha))
return
if(ishuman(L))
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2b37d2476b4..3c1e42f0166 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -50,6 +50,9 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
//If there's a bug with changing your ghost settings, it's probably related to this.
var/ghost_accs = GHOST_ACCS_DEFAULT_OPTION
var/ghost_others = GHOST_OTHERS_DEFAULT_OPTION
+ // Used for displaying in ghost chat, without changing the actual name
+ // of the mob
+ var/deadchat_name
/mob/dead/observer/New(mob/body)
verbs += /mob/dead/observer/proc/dead_tele
@@ -117,7 +120,6 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0)
return 1
-
/*
* This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image.
* Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost,
@@ -231,6 +233,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
+ if(mental_dominator)
+ src << "This body's force of will is too strong! You can't break it enough to force them into a catatonic state."
+ if(mind_control_holder)
+ mind_control_holder << "Through tremendous force of will, you stop a catatonia attempt!"
+ return 0
if(stat != DEAD)
succumb()
if(stat == DEAD)
@@ -590,6 +597,34 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << "Data HUDs enabled."
data_huds_on = 1
+/mob/dead/observer/verb/restore_ghost_apperance()
+ set name = "Restore Ghost Character"
+ set desc = "Sets your deadchat name and ghost appearance to your \
+ roundstart character."
+ set category = "Ghost"
+
+ set_ghost_appearance()
+ if(client && client.prefs)
+ deadchat_name = client.prefs.real_name
+
+/mob/dead/observer/proc/set_ghost_appearance()
+ if((!client) || (!client.prefs))
+ return
+
+ if(client.prefs.be_random_name)
+ client.prefs.real_name = random_unique_name(gender)
+ if(client.prefs.be_random_body)
+ client.prefs.random_character(gender)
+
+ if(HAIR in client.prefs.pref_species.specflags)
+ hair_style = client.prefs.hair_style
+ hair_color = brighten_color(client.prefs.hair_color)
+ if(FACEHAIR in client.prefs.pref_species.specflags)
+ facial_hair_style = client.prefs.facial_hair_style
+ facial_hair_color = brighten_color(client.prefs.facial_hair_color)
+
+ update_icon()
+
/mob/dead/observer/canUseTopic()
if(check_rights(R_ADMIN, 0))
return 1
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index d5020b6dd6f..20659829676 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -9,11 +9,12 @@
origin_tech = "biotech=3"
var/braintype = "Cyborg"
var/obj/item/device/radio/radio = null //Let's give it a radio.
- var/syndiemmi = 0 //Whether or not this is a Syndicate MMI
+ var/hacked = 0 //Whether or not this is a Syndicate MMI
var/mob/living/carbon/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm.
var/obj/item/organ/brain/brain = null //The actual brain
+ var/clockwork = FALSE //If this is a soul vessel
/obj/item/device/mmi/update_icon()
if(brain)
@@ -67,6 +68,8 @@
living_mob_list += brainmob
brainmob.reset_perspective()
+ if(clockwork)
+ add_servant_of_ratvar(brainmob, TRUE)
newbrain.loc = src //P-put your brain in it
brain = newbrain
@@ -187,7 +190,7 @@
/obj/item/device/mmi/syndie
name = "Syndicate Man-Machine Interface"
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores."
- syndiemmi = 1
+ hacked = 1
/obj/item/device/mmi/syndie/New()
..()
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 094df1ba1d3..d9c39e2dfc2 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -14,6 +14,18 @@ var/global/posibrain_notif_cooldown = 0
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
braintype = "Android"
+ var/begin_activation_message = "You carefully locate the manual activation switch and start the positronic brain's boot process."
+ var/success_message = "The positronic brain pings, and its lights start flashing. Success!"
+ var/fail_message = "The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?"
+ var/new_role = "Positronic Brain"
+ var/welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\
+ You are a positronic brain, brought into existence aboard Space Station 13.\n\
+ As a synthetic intelligence, you answer to all crewmembers and the AI.\n\
+ Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
+ var/new_mob_message = "The positronic brain chimes quietly."
+ var/dead_message = "It appears to be completely inactive. The reset light is blinking."
+ var/list/fluff_names = list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD")
+
/obj/item/device/mmi/posibrain/Topic(href, href_list)
if(href_list["activate"])
@@ -23,7 +35,7 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/proc/ping_ghosts(msg)
if(!posibrain_notif_cooldown)
- notify_ghosts("Positronic brain [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1)
+ notify_ghosts("[name] [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1)
posibrain_notif_cooldown = 1
spawn(askDelay) //Global one minute cooldown to avoid spam.
posibrain_notif_cooldown = 0
@@ -31,7 +43,7 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/attack_self(mob/user)
if(brainmob && !brainmob.key && !notified)
//Start the process of requesting a new ghost.
- user << "You carefully locate the manual activation switch and start the positronic brain's boot process."
+ user << begin_activation_message
ping_ghosts("requested")
notified = 1
used = 0
@@ -40,9 +52,9 @@ var/global/posibrain_notif_cooldown = 0
notified = 0
update_icon()
if(brainmob.client)
- visible_message("The positronic brain pings, and its lights start flashing. Success!")
+ visible_message(success_message)
else
- visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ visible_message(fail_message)
return //Code for deleting personalities recommended here.
@@ -55,13 +67,13 @@ var/global/posibrain_notif_cooldown = 0
if(used || (brainmob && brainmob.key) || jobban_isbanned(user,"posibrain"))
return
- var/posi_ask = alert("Become a positronic brain? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
+ var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
if(posi_ask == "No" || qdeleted(src))
return
transfer_personality(user)
/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/C)
- name = "positronic brain ([C])"
+ name = "[initial(name)] ([C])"
brainmob.name = C.real_name
brainmob.real_name = C.real_name
brainmob.dna = C.dna
@@ -72,16 +84,12 @@ var/global/posibrain_notif_cooldown = 0
brainmob.timeofhostdeath = C.timeofdeath
brainmob.stat = CONSCIOUS
if(brainmob.mind)
- brainmob.mind.assigned_role = "Positronic Brain"
+ brainmob.mind.assigned_role = new_role
if(C.mind)
C.mind.transfer_to(brainmob)
brainmob.mind.remove_all_antag()
brainmob.mind.wipe_memory()
-
- brainmob << "ALL PAST LIVES ARE FORGOTTEN."
-
- brainmob << "Hello World!"
update_icon()
return
@@ -91,19 +99,14 @@ var/global/posibrain_notif_cooldown = 0
return
notified = 0
brainmob.ckey = candidate.ckey
- name = "positronic brain ([brainmob.name])"
-
- brainmob << "ALL PAST LIVES ARE FORGOTTEN."
-
- brainmob << "You are a positronic brain, brought into existence on [station_name()]."
- brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
- brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
- brainmob.mind.assigned_role = "Positronic Brain"
+ name = "[initial(name)] ([brainmob.name])"
+ brainmob << welcome_message
+ brainmob.mind.assigned_role = new_role
brainmob.stat = CONSCIOUS
dead_mob_list -= brainmob
living_mob_list += brainmob
- visible_message("The positronic brain chimes quietly.")
+ visible_message(new_mob_message)
update_icon()
used = 1
@@ -129,14 +132,14 @@ var/global/posibrain_notif_cooldown = 0
if(DEAD)
msg += "It appears to be completely inactive.\n"
else
- msg += "It appears to be completely inactive. The reset light is blinking.\n"
+ msg += "[dead_message]\n"
msg += "*---------*"
usr << msg
return
/obj/item/device/mmi/posibrain/New()
brainmob = new(src)
- brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD"))]-[rand(100, 999)]"
+ brainmob.name = "[pick(fluff_names)]-[rand(100, 999)]"
brainmob.real_name = brainmob.name
brainmob.loc = src
brainmob.container = src
@@ -150,9 +153,9 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/update_icon()
if(notified)
- icon_state = "posibrain-searching"
+ icon_state = "[initial(icon_state)]-searching"
return
if(brainmob && brainmob.key)
- icon_state = "posibrain-occupied"
+ icon_state = "[initial(icon_state)]-occupied"
else
- icon_state = "posibrain"
+ icon_state = initial(icon_state)
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index 4b18297b92c..b68124230d4 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -227,7 +227,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if (!injected || !our || !dna)
return
- if (!(injected.data["blood_type"] in get_safe_blood(dna.blood_type)) || injected.data["species"] != dna.species.id)
+ if (!(injected.data["blood_type"] in get_safe_blood(dna.blood_type)) || (injected.data["species"] && injected.data["species"] != dna.species.id))
reagents.add_reagent("toxin",amount * 0.5)
our.on_merge(injected.data) //still transfer viruses and such, even if incompatibles bloods
reagents.update_total()
@@ -255,7 +255,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if("A-")
return list("A-", "O-")
if("A+")
- return list("A", "A+", "O-", "O+")
+ return list("A-", "A+", "O-", "O+")
if("B-")
return list("B-", "O-")
if("B+")
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index df0e5344f19..71ec592a7a8 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -258,6 +258,9 @@
if(reagents.has_reagent("teslium"))
msg += "[t_He] is emitting a gentle blue glow!\n"
+ if(stun_absorption)
+ msg += "[t_He] is radiating with a soft yellow light!\n" //Used by Vanguard
+
if(drunkenness && !skipface && stat != DEAD) //Drunkenness
switch(drunkenness)
if(11 to 21)
diff --git a/code/modules/mob/living/carbon/human/mutantrace.dm b/code/modules/mob/living/carbon/human/mutantrace.dm
deleted file mode 100644
index 32ad63444b5..00000000000
--- a/code/modules/mob/living/carbon/human/mutantrace.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-var/global/list/colored_mutraces = list( // these mutantraces are affected by mutant color
- "lizard",
- "plant",
- "pod",
- "slime",
- "jelly",
- "golem"
-)
-
-var/global/list/mutants_with_eyes = list( // these mutantraces have eyes
- "lizard",
- "plant",
- "pod",
- "jelly",
-)
-
-/mob/living/carbon/human/proc/check_mutrace(mutneeded = "mut1", mutneededalt = "mut2")
- if(dna)
- if(dna.mutantrace == mutneeded || dna.mutantrace == mutneededalt)
- return 1
-
- return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a04bb808579..2e077506d22 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1024,3 +1024,18 @@ Sorry Giacom. Please don't be mad :(
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
return 1
return 0
+
+// Called when we are hit by a bolt of polymorph and changed
+// Generally the mob we are currently in, is about to be deleted
+/mob/living/proc/wabbajack_act(mob/living/new_mob)
+ if(mind)
+ mind.transfer_to(new_mob)
+ else
+ new_mob.key = key
+
+ for(var/para in hasparasites())
+ var/mob/living/simple_animal/hostile/guardian/G = para
+ G.summoner = new_mob
+ G.Recall()
+ G << "Your summoner has changed \
+ form to [new_mob]!"
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 773931c8d7d..2ae03291140 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -170,6 +170,40 @@
//Mobs on Fire end
+/mob/living/proc/dominate_mind(mob/living/target, duration = 100, silent) //Allows one mob to assume control of another while imprisoning the old consciousness for a time
+ if(!target)
+ return 0
+ if(target.mental_dominator)
+ src << "[target] is already being controlled by someone else!"
+ return 0
+ if(!target.mind)
+ src << "[target] is mindless and would make you permanently catatonic!"
+ return 0
+ if(!silent)
+ src << "You pounce upon [target]'s mind and seize control of their body!"
+ target << "Your control over your body is wrenched away from you!"
+ target.mind_control_holder = new/mob/living/mind_control_holder(target)
+ target.mind_control_holder.real_name = "imprisoned mind of [target.real_name]"
+ target.mind.transfer_to(target.mind_control_holder)
+ mind.transfer_to(target)
+ target.mental_dominator = src
+ spawn(duration)
+ if(!src)
+ if(!silent)
+ target << "You try to return to your own body, but sense nothing! You're being forced out!"
+ target.ghostize(1)
+ target.mind_control_holder.mind.transfer_to(target)
+ if(!silent)
+ target << "You take control of your own body again!"
+ return 0
+ if(!silent)
+ target << "You're forced out! You return to your own body."
+ target.mind.transfer_to(src)
+ target.mind_control_holder.mind.transfer_to(target)
+ qdel(mind_control_holder)
+ if(!silent)
+ target << "You take control of your own body again!"
+ return 1
/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
@@ -300,3 +334,17 @@
return 1
//Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs.
+
+/mob/living/Stun(amount)
+ if(stun_absorption && !stat)
+ visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!")
+ stun_absorption_count += amount
+ return 0
+ ..()
+
+/mob/living/Weaken(amount)
+ if(stun_absorption && !stat)
+ visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!")
+ stun_absorption_count += amount
+ return 0
+ ..()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index dab7e893b8a..400503818f9 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -60,4 +60,11 @@
var/list/butcher_results = null
var/hellbound = 0 //People who've signed infernal contracts are unrevivable.
-
+
+ var/list/weather_immunities = list()
+
+ var/stun_absorption = FALSE //If all incoming stuns are being absorbed
+ var/stun_absorption_count = 0 //How many seconds of stun that have been absorbed
+
+ var/mob/living/mental_dominator //The person controlling the mind of this person, if applicable
+ var/mob/living/mind_control_holder/mind_control_holder //If the mob is being mind controlled, where their old mind is stored (check clock_mobs.dm)
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index fc82775ddce..81e0365ba06 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -33,6 +33,9 @@
if(cell && cell.charge <= 0)
msg += "Its battery indicator is blinking red!\n"
+ if(is_servant_of_ratvar(src) && user.Adjacent(src) && !stat) //To counter pseudo-stealth by using headlamps
+ msg += "Its eyes are glowing a blazing yellow!\n"
+
switch(src.stat)
if(CONSCIOUS)
if(!src.client)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0ac2332ed47..dd48ae69ce5 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -167,6 +167,8 @@
return
var/list/modulelist = list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service")
+ if(!config.forbid_peaceborg)
+ modulelist += "Peacekeeper"
if(!config.forbid_secborg)
modulelist += "Security"
@@ -235,6 +237,16 @@
status_flags &= ~CANPUSH
feedback_inc("cyborg_security",1)
+ if("Peacekeeper") //Secborg sprites untill someone gives me some to update with
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
+ hands.icon_state = "standard"
+ icon_state = "peaceborg"
+ animation_length = 54
+ modtype = "Peace"
+ src << "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you."
+ status_flags &= ~CANPUSH
+ feedback_inc("cyborg_peacekeeper",1) //I'm assuming this is for logging.
+
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
@@ -802,21 +814,21 @@
var/state_name = icon_state //For easy conversion and/or different names
switch(icon_state)
if("robot")
- overlays += "eyes-standard"
+ overlays += "eyes-standard[is_servant_of_ratvar(src) ? "_r" : ""]" //Cyborgs converted by Ratvar have yellow eyes rather than blue
state_name = "standard"
if("mediborg")
- overlays += "eyes-mediborg"
+ overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("toiletbot")
- overlays += "eyes-mediborg"
+ overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]"
state_name = "mediborg"
if("secborg")
- overlays += "eyes-secborg"
+ overlays += "eyes-secborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("engiborg")
- overlays += "eyes-engiborg"
+ overlays += "eyes-engiborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("janiborg")
- overlays += "eyes-janiborg"
+ overlays += "eyes-janiborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("minerborg")
- overlays += "eyes-minerborg"
+ overlays += "eyes-minerborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("syndie_bloodhound")
overlays += "eyes-syndie_bloodhound"
else
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 45257c61186..cfb56c69017 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -131,6 +131,7 @@
modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/device/healthanalyzer(src)
modules += new /obj/item/toy/crayon/spraycan/borg(src)
+ modules += new /obj/item/borg/cyborghug(src)
emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
fix_modules()
@@ -155,6 +156,7 @@
modules += new /obj/item/weapon/circular_saw(src)
modules += new /obj/item/weapon/extinguisher/mini(src)
modules += new /obj/item/roller/robo(src)
+ modules += new /obj/item/borg/cyborghug(src)
add_module(new /obj/item/stack/medical/gauze/cyborg())
@@ -219,6 +221,32 @@
else
T.charge_tick = 0
+/obj/item/weapon/robot_module/peacekeeper
+ name = "peacekeeper robot module"
+
+/obj/item/weapon/robot_module/peacekeeper/New()
+ ..()
+ modules += new /obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg(src)
+ modules += new /obj/item/weapon/cookiesynth(src)
+ modules += new /obj/item/device/harmalarm(src)
+ modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
+ modules += new /obj/item/weapon/holosign_creator/cyborg(src)
+ modules += new /obj/item/borg/cyborghug(src)
+ modules += new /obj/item/weapon/extinguisher(src)
+
+ emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
+
+/obj/item/weapon/robot_module/peacekeeper/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
+ ..()
+ var/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg) in get_usable_modules()
+ if(T)
+ if(T.power_supply.charge < T.power_supply.maxcharge)
+ var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
+ T.power_supply.give(S.e_cost * coeff)
+ T.update_icon()
+ else
+ T.charge_tick = 0
+
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
var/obj/item/weapon/reagent_containers/spray/drying_agent
@@ -372,4 +400,4 @@
/datum/robot_energy_storage/medical
max_energy = 2500
recharge_rate = 250
- name = "Medical Synthesizer"
+ name = "Medical Synthesizer"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 7e566ed9b96..934e5571d8a 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -105,7 +105,7 @@
if(prob(10)) //Wets floors randomly
var/turf/open/OT = get_turf(loc)
- OT.MakeSlippery(min = 5, max = 1)
+ OT.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index f1d0ececa64..dc7013eb84b 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -26,6 +26,7 @@
AIStatus = AI_OFF //normal constructs don't have AI
loot = list(/obj/item/weapon/ectoplasm)
del_on_death = 1
+ deathmessage = "collapses in a shattered heap."
var/list/construct_spells = list()
var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this."
@@ -35,10 +36,6 @@
for(var/spell in construct_spells)
AddSpell(new spell(null))
-/mob/living/simple_animal/hostile/construct/death()
- deathmessage = "[src] collapses in a shattered heap."
- ..()
-
/mob/living/simple_animal/hostile/construct/examine(mob/user)
var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
if (src.health < src.maxHealth)
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 c6b108c951a..7c710cf6c8c 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -156,6 +156,13 @@
update_drone_icon()
updateSeeStaticMobs()
+/mob/living/simple_animal/drone/proc/liberate()
+ // F R E E D R O N E
+ laws = "1. You are a Free Drone."
+ src << laws
+ seeStatic = FALSE
+ updateSeeStaticMobs()
+
/mob/living/simple_animal/drone/proc/update_drone_icon()
//Different icons for different hack states
if(!hacked)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index 3e5756baa6a..a1d618a632b 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -73,7 +73,7 @@
set desc = "Set an invisible snare that will alert you when living creatures walk over it. Max of 5"
if(src.snares.len <6)
var/turf/snare_loc = get_turf(src.loc)
- var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc)
+ var/obj/effect/snare/S = new /obj/effect/snare(snare_loc)
S.spawner = src
S.name = "[get_area(snare_loc)] snare ([rand(1, 1000)])"
src.snares |= S
@@ -91,14 +91,14 @@
qdel(picked_snare)
src << "Snare disarmed."
-/obj/item/effect/snare
+/obj/effect/snare
name = "snare"
desc = "You shouldn't be seeing this!"
var/mob/living/simple_animal/hostile/guardian/spawner
invisibility = INVISIBILITY_ABSTRACT
-/obj/item/effect/snare/Crossed(AM as mob|obj)
+/obj/effect/snare/Crossed(AM as mob|obj)
if(isliving(AM) && spawner && spawner.summoner && AM != spawner && !spawner.hasmatchingsummoner(AM))
spawner.summoner << "[AM] has crossed surveillance snare, [name]."
var/list/guardians = spawner.summoner.hasparasites()
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index c0474b51e44..3bc8f6593e9 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -17,6 +17,7 @@
var/mob/living/parent_mob
var/multiply_chance = 0 //if we multiply on hit
del_on_death = 1
+ deathmessage = "vanishes into thin air! It was a fake!"
/mob/living/simple_animal/hostile/illusion/Life()
@@ -38,11 +39,6 @@
pixel_y = initial(pixel_y)
pixel_x = initial(pixel_x)
-
-/mob/living/simple_animal/hostile/illusion/New()
- ..()
- deathmessage = "[src] vanishes into thin air! It was a fake!"
-
/mob/living/simple_animal/hostile/illusion/examine(mob/user)
if(parent_mob)
parent_mob.examine(user)
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 2d1206f0d7b..6e5d69f172c 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -11,6 +11,7 @@
friendly = "stares down"
icon = 'icons/mob/lavaland/dragon.dmi'
faction = list("mining")
+ weather_immunities = list("lava","ash")
speak_emote = list("roars")
luminosity = 3
armour_penetration = 40
@@ -42,6 +43,11 @@
qdel(internal)
. = ..()
+/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount)
+ if(swooping)
+ return 0
+ return ..()
+
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
if(swooping)
return
@@ -52,8 +58,7 @@
if(L.stat == DEAD)
usr.visible_message(
"[src] devours [L]!",
- "You feast on [L], restoring \
- your health!")
+ "You feast on [L], restoring your health!")
adjustBruteLoss(-L.maxHealth)
L.gib()
@@ -162,6 +167,7 @@
swoop_target = target
stop_automated_movement = TRUE
swooping = 1
+ density = 0
icon_state = "swoop"
visible_message("[src] swoops up high!")
if(prob(50))
@@ -179,7 +185,7 @@
tturf = get_turf(swoop_target)
else
tturf = get_turf(src)
- src.loc = tturf
+ forceMove(tturf)
new/obj/effect/overlay/temp/dragon_swoop(tturf)
animate(src, pixel_x = 0, pixel_z = 0, time = 10)
sleep(10)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 8a846d02623..f9ff4a3762d 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -6,12 +6,13 @@
a_intent = "harm"
sentience_type = SENTIENCE_BOSS
environment_smash = 4
+ weather_immunities = list("lava","ash")
robust_searching = 1
stat_attack = 1
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
- layer = 6 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
+ layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 130ec9d0ff2..2cbaff85393 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -2,6 +2,7 @@
vision_range = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining")
+ weather_immunities = list("lava","ash")
environment_smash = 2
minbodytemp = 0
maxbodytemp = INFINITY
@@ -126,6 +127,7 @@
a_intent = "help"
speak_emote = list("screeches")
throw_message = "sinks in slowly, before being pushed out of "
+ deathmessage = "spits up the contents of its stomach before dying!"
status_flags = CANPUSH
search_objects = 1
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
@@ -136,7 +138,6 @@
/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
..()
- deathmessage = "[src] spits up the contents of its stomach before dying!"
var/i = rand(1,3)
while(i)
loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
@@ -881,6 +882,7 @@
speak_emote = list("warbles", "quavers")
emote_hear = list("trills.")
emote_see = list("sniffs.", "burps.")
+ weather_immunities = list("lava","ash")
faction = list("mining", "ashwalker")
density = 0
speak_chance = 1
@@ -903,6 +905,7 @@
search_objects = TRUE
del_on_death = TRUE
loot = list(/obj/effect/decal/cleanable/blood/gibs)
+ deathmessage = "is pulped into bugmash."
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
@@ -910,10 +913,8 @@
wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
var/obj/item/udder/gutlunch/udder = null
-
/mob/living/simple_animal/hostile/asteroid/gutlunch/New()
udder = new()
- deathmessage = "[src] is pulped into bugmash."
..()
/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy()
@@ -994,6 +995,7 @@
icon_living = "tendril"
icon_dead = "tendril"
faction = list("mining")
+ weather_immunities = list("lava","ash")
health = 250
maxHealth = 250
max_mobs = 3
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 258b60e91a4..373e7b12a61 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -27,6 +27,7 @@
robust_searching = 1
unique_name = 1
speak_emote = list("squeaks")
+ deathmessage = "fainted."
var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms
var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it
var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight
@@ -58,7 +59,6 @@
cap_dead.color = cap_color
UpdateMushroomCap()
health = maxHealth
- deathmessage = "[src] fainted."
..()
/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting
diff --git a/code/modules/mob/living/simple_animal/hostile/reenactors.dm b/code/modules/mob/living/simple_animal/hostile/reenactors.dm
deleted file mode 100644
index b6382dc4302..00000000000
--- a/code/modules/mob/living/simple_animal/hostile/reenactors.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
--!WARNING!-
--POTENTIAL TRIGGER-INDUCING ITEMS AHEAD-
--TREAD WITH CAUTION-
-*/
-
-/mob/living/simple_animal/hostile/wwii
- name = "World War II Reenactor"
- desc = "A VERY enthusiastic WWII reenactor."
- icon_state = "nsoldier"
- icon_living = "nsoldier"
- speak_chance = 0
- turns_per_move = 5
- response_help = "pokes"
- response_disarm = "shoves"
- response_harm = "hits"
- speed = 0
- stat_attack = 1
- robust_searching = 1
- maxHealth = 100
- health = 100
- harm_intent_damage = 10
- melee_damage_lower = 10
- melee_damage_upper = 15
- attacktext = "punches"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = "harm"
- loot = list(/obj/effect/mob_spawn/human/wwii)
- atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 15
- faction = list("german")
- check_friendly_fire = 1
- status_flags = CANPUSH
- del_on_death = 1
-
-/mob/living/simple_animal/hostile/wwii/ranged
- ranged = 1
- rapid = 1
- retreat_distance = 5
- minimum_distance = 5
- icon_state = "nsoldierranged"
- icon_living = "nsoldierranged"
- casingtype = /obj/item/ammo_casing/c45nostamina
- projectilesound = 'sound/weapons/Gunshot_smg.ogg'
-
-/mob/living/simple_animal/hostile/wwii/melee
- name = "Hulking World War II Reenactor"
- icon_state = "nsoldierbuff"
- icon_living = "nsoldierbuff"
- stat_attack = 0
- speed = 4
- maxHealth = 200
- health = 200
- force_threshold = 10
- harm_intent_damage = 25
- melee_damage_lower = 25
- melee_damage_upper = 30
- environment_smash = 2
- attacktext = "slams"
- deathmessage = "The Reenactor's body collapses in on itself from the strain!"
- loot = list(/obj/effect/gibspawner/human)
-
-/mob/living/simple_animal/hostile/wwii/melee/AttackingTarget()
- ..()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(prob(40))
- C.Weaken(3)
- C.adjustBruteLoss(10)
- C.visible_message("\The [src] smashes \the [C] into the ground!", \
- "\The [src] smashes you into the ground!")
- src.say(pick("RAAAAAGGHHHH!!!","AAAARRRGGHHHH!!!","RRRAAUUUGGHH!!!"))
-
-
-/mob/living/simple_animal/hostile/wwii/bomber
- name = "Mini-Fhrer"
- desc = "A small, robotic recreation of the Fhrer himself; it seems like he wants to tell you something."
- icon_state = "miniheil"
- icon_living = "miniheil"
- speed = 1
- maxHealth = 25
- health = 25
- harm_intent_damage = 5
- melee_damage_lower = 5
- melee_damage_upper = 7
- attacktext = "heils"
- deathmessage = "The Mini-Fhrer explodes!"
- loot = list(/obj/effect/gibspawner/robot)
-
-/mob/living/simple_animal/hostile/wwii/bomber/AttackingTarget()
- ..()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(prob(90))
- C.Weaken(2)
- src.say("HEIL HITLER!")
- explosion(src, 0, 0, 2, 3, 2)
- src.gib()
-
-/*
--YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT-
--PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY-
-*/
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
new file mode 100644
index 00000000000..d59dab79591
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -0,0 +1,23 @@
+/mob/living/simple_animal/hostile/retaliate/spaceman
+ name = "Spaceman"
+ desc = "What in the actual hell..?"
+ icon_state = "old"
+ icon_living = "old"
+ icon_dead = "old_dead"
+ icon_gib = "clown_gib"
+ turns_per_move = 5
+ response_help = "pokes"
+ response_disarm = "gently pushes aside"
+ response_harm = "punches"
+ a_intent = "harm"
+ maxHealth = 100
+ health = 100
+ speed = 0
+ harm_intent_damage = 8
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attacktext = "hits"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ environment_smash = 0
+ del_on_death = 0
+
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index 79fa9969b17..e550017407c 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -30,7 +30,7 @@
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
layer = MOB_LAYER - 0.1
- deathmessage = "The skeleton collaspes into a pile of bones!"
+ deathmessage = "collapses into a pile of bones!"
del_on_death = 1
loot = list(/obj/effect/decal/remains/human)
@@ -46,7 +46,7 @@
gold_core_spawnable = 0
melee_damage_lower = 17
melee_damage_upper = 20
- deathmessage = "The skeleton collaspes into a pile of bones, its gear falling to the floor!"
+ deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
loot = list(/obj/effect/decal/remains/human,
/obj/item/weapon/twohanded/spear,
/obj/item/clothing/shoes/winterboots,
@@ -69,7 +69,7 @@
force_threshold = 10 //trying to simulate actually having armor
melee_damage_lower = 25
melee_damage_upper = 30
- deathmessage = "The templar knight collaspes into a pile of bones, its gear clanging as it hits the ground!"
+ deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
loot = list(/obj/effect/decal/remains/human,
/obj/item/clothing/suit/armor/riot/knight/templar,
/obj/item/clothing/head/helmet/knight/templar,
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index a71f5fe68e9..bb6135079d1 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -165,7 +165,4 @@
bubble_icon = "syndibot"
gold_core_spawnable = 1
del_on_death = 1
-
-/mob/living/simple_animal/hostile/viscerator/New()
- ..()
- deathmessage = "[src] is smashed into pieces!"
+ deathmessage = "is smashed into pieces!"
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 15e56b4813c..7295e272e8b 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -33,6 +33,7 @@
maxbodytemp = 1200
faction = list("hostile")
+ deathmessage = "is hacked into pieces!"
loot = list(/obj/item/stack/sheet/mineral/wood)
gold_core_spawnable = 1
del_on_death = 1
@@ -58,10 +59,6 @@
C.visible_message("\The [src] knocks down \the [C]!", \
"\The [src] knocks you down!")
-/mob/living/simple_animal/hostile/tree/New()
- ..()
- deathmessage = "[src] is hacked into pieces!"
-
/mob/living/simple_animal/hostile/tree/festivus
name = "festivus pole"
desc = "serenity now... SERENITY NOW!"
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index cd600cd1367..cf71e21028e 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -153,6 +153,7 @@ mob/living/simple_animal/hostile/zombie/gymboss
spawn_text = "emerges from"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("zombie")
+ deathmessage = "collapses, stopping the flow of zombies!"
del_on_death = 1
/mob/living/simple_animal/hostile/spawner/zombie/lesser
@@ -163,11 +164,6 @@ mob/living/simple_animal/hostile/zombie/gymboss
health = 200
maxHealth = 200
-/mob/living/simple_animal/hostile/spawner/zombie/New()
- ..()
- deathmessage = "[src] collapes, stopping the flow of zombies!"
-
-
/obj/item/weapon/shovel/cursed
name = "cursed shovel"
desc = "You probably shouldn't use this particular shovel."
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5a1dffc3c42..3568d43dc52 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -923,12 +923,13 @@
S["longestsurvival"] >> longest_survival
S["longestdeathstreak"] >> longest_deathstreak
- if(isnull(speech_buffer))
+ if(!islist(speech_buffer))
speech_buffer = list()
/mob/living/simple_animal/parrot/Poly/proc/Write_Memory()
var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
- S["phrases"] << speech_buffer
+ if(islist(speech_buffer))
+ S["phrases"] << speech_buffer
S["roundssurvived"] << rounds_survived
S["longestsurvival"] << longest_survival
S["longestdeathstreak"] << longest_deathstreak
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index f2164eec7b9..50429b4430f 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -28,11 +28,12 @@
flying = 1
loot = list(/obj/item/weapon/ectoplasm)
del_on_death = 1
+ deathmessage = "lets out a contented sigh as their form unwinds."
-
-/mob/living/simple_animal/shade/death()
- deathmessage = "[src] lets out a contented sigh as their form unwinds."
- ..()
+/mob/living/simple_animal/shade/canSuicide()
+ if(istype(loc, /obj/item/device/soulstone)) //do not suicide inside the soulstone
+ return 0
+ return ..()
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 40457e167aa..597a1660f70 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -398,9 +398,9 @@
if(death_sound)
playsound(get_turf(src),death_sound, 200, 1)
if(deathmessage)
- visible_message("[deathmessage]")
+ visible_message("\The [src] [deathmessage]")
else if(!del_on_death)
- visible_message("\the [src] stops moving...")
+ visible_message("\The [src] stops moving...")
if(del_on_death)
ghostize()
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 5b0ed1aaa8d..7f67da0ad76 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -1,3 +1,8 @@
+var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
+ "blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red",
+ "gold", "green", "adamantine", "oil", "light pink", "bluespace",
+ "cerulean", "sepia", "black", "pyrite")
+
/mob/living/simple_animal/slime
name = "baby slime"
icon = 'icons/mob/slimes.dmi'
@@ -16,7 +21,7 @@
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
- speak_emote = list("chirps")
+ speak_emote = list("telepathically chirps")
bubble_icon = "slime"
layer = 5
@@ -83,19 +88,26 @@
var/datum/action/innate/slime/evolve/E = new
E.Grant(src)
create_reagents(100)
- spawn (0)
- number = rand(1, 1000)
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
- icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
- icon_dead = "[icon_state] dead"
- real_name = name
- slime_mutation = mutation_table(colour)
- var/sanitizedcolour = replacetext(colour, " ", "")
- coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ spawn(0)
+ set_colour(colour)
..()
+/mob/living/simple_animal/slime/proc/set_colour(new_colour)
+ colour = new_colour
+
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
+ real_name = name
+ slime_mutation = mutation_table(colour)
+ var/sanitizedcolour = replacetext(colour, " ", "")
+ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ regenerate_icons()
+
+/mob/living/simple_animal/slime/proc/random_colour()
+ set_colour(pick(slime_colours))
+
/mob/living/simple_animal/slime/regenerate_icons()
- overlays.len = 0
+ overlays.Cut()
var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
icon_dead = "[icon_text] dead"
if(stat != DEAD)
@@ -107,7 +119,7 @@
..()
/mob/living/simple_animal/slime/movement_delay()
- if(bodytemperature >= 330.23) // 135 F
+ if(bodytemperature >= 330.23) // 135 F or 57.08 C
return -1 // slimes become supercharged at high temperatures
. = ..()
diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm
index 2c2eb731b63..204d2b400f7 100644
--- a/code/modules/mob/living/simple_animal/spawner.dm
+++ b/code/modules/mob/living/simple_animal/spawner.dm
@@ -19,6 +19,7 @@
minbodytemp = 0
maxbodytemp = 350
layer = MOB_LAYER-0.1
+ sentience_type = SENTIENCE_BOSS
/mob/living/simple_animal/hostile/spawner/Destroy()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5efb361452b..543a564c788 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -764,6 +764,10 @@ var/next_mob_id = 0
if(mind)
return mind.get_ghost(even_if_they_cant_reenter)
+/mob/proc/grab_ghost(force)
+ if(mind)
+ return mind.grab_ghost(force = force)
+
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
var/mob/dead/observer/ghost = get_ghost()
if(ghost)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 2861e2e41aa..c6223dfcd19 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -127,19 +127,12 @@
observer.loc = O.loc
else
src << "Teleporting failed. You should be able to use ghost verbs to teleport somewhere useful"
- if(client.prefs.be_random_name)
- client.prefs.real_name = random_unique_name(gender)
- if(client.prefs.be_random_body)
- client.prefs.random_character(gender)
- if(HAIR in client.prefs.pref_species.specflags)
- observer.hair_style = client.prefs.hair_style
- observer.hair_color = observer.brighten_color(client.prefs.hair_color)
- if(FACEHAIR in client.prefs.pref_species.specflags)
- observer.facial_hair_style = client.prefs.facial_hair_style
- observer.facial_hair_color = observer.brighten_color(client.prefs.facial_hair_color)
- observer.real_name = client.prefs.real_name
- observer.name = observer.real_name
observer.key = key
+ observer.client = client
+ observer.set_ghost_appearance()
+ if(observer.client && observer.client.prefs)
+ observer.real_name = observer.client.prefs.real_name
+ observer.name = observer.real_name
observer.update_icon()
observer.stopLobbySound()
qdel(mind)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 70344fe4bc1..e65ab6113d5 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -32,13 +32,16 @@
usr << "Speech is currently admin-disabled."
return
- if(mind && mind.name)
- name = "[mind.name]"
+ var/mob/dead/observer/O = src
+ if(isobserver(src) && O.deadchat_name)
+ name = "[O.deadchat_name]"
else
- name = real_name
- if(name != real_name)
- alt_name = " (died as [real_name])"
-
+ if(mind && mind.name)
+ name = "[mind.name]"
+ else
+ name = real_name
+ if(name != real_name)
+ alt_name = " (died as [real_name])"
var/K
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 654614f7574..ba4def1b629 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -32,7 +32,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
- layer = 5
+ layer = MOB_LAYER + 0.25
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -131,7 +131,7 @@
icon_state = "tube1"
desc = "A lighting fixture."
anchored = 1
- layer = 5 // They were appearing under mobs which is a little weird - Ostaf
+ layer = MOB_LAYER + 0.25
use_power = 2
idle_power_usage = 2
active_power_usage = 20
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 242adf9e287..8658fe0b341 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -11,6 +11,7 @@
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
+ var/clashing = FALSE //If Nar-Sie is fighting Ratvar
/obj/singularity/narsie/large
name = "Nar-Sie"
@@ -46,6 +47,8 @@
/obj/singularity/narsie/process()
eat()
+ if(clashing)
+ return 0
if(!target || prob(5))
pickcultist()
move()
diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerator.dm
rename to code/modules/procedural_mapping/mapGenerator.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModule.dm
rename to code/modules/procedural_mapping/mapGeneratorModule.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModules/helpers.dm
rename to code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModules/nature.dm b/code/modules/procedural_mapping/mapGeneratorModules/nature.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModules/nature.dm
rename to code/modules/procedural_mapping/mapGeneratorModules/nature.dm
diff --git a/code/modules/procedural mapping/mapGeneratorObj.dm b/code/modules/procedural_mapping/mapGeneratorObj.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorObj.dm
rename to code/modules/procedural_mapping/mapGeneratorObj.dm
diff --git a/code/modules/procedural mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorReadme.dm
rename to code/modules/procedural_mapping/mapGeneratorReadme.dm
diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/asteroid.dm
rename to code/modules/procedural_mapping/mapGenerators/asteroid.dm
diff --git a/code/modules/procedural mapping/mapGenerators/cellular.dm b/code/modules/procedural_mapping/mapGenerators/cellular.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/cellular.dm
rename to code/modules/procedural_mapping/mapGenerators/cellular.dm
diff --git a/code/modules/procedural mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/lava_river.dm
rename to code/modules/procedural_mapping/mapGenerators/lava_river.dm
diff --git a/code/modules/procedural mapping/mapGenerators/nature.dm b/code/modules/procedural_mapping/mapGenerators/nature.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/nature.dm
rename to code/modules/procedural_mapping/mapGenerators/nature.dm
diff --git a/code/modules/procedural mapping/mapGenerators/shuttle.dm b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/shuttle.dm
rename to code/modules/procedural_mapping/mapGenerators/shuttle.dm
diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/syndicate.dm
rename to code/modules/procedural_mapping/mapGenerators/syndicate.dm
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 3d245ea9956..62b3ba8a669 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -167,6 +167,10 @@ obj/item/ammo_casing/energy/net
projectile_type = /obj/item/projectile/energy/trap
select_name = "snare"
+/obj/item/ammo_casing/energy/trap/cyborg
+ projectile_type = /obj/item/projectile/energy/trap/cyborg
+ e_cost = 50
+
/obj/item/ammo_casing/energy/instakill
projectile_type = /obj/item/projectile/beam/instakill
e_cost = 0
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 528ecc04816..f69cadac134 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -48,6 +48,22 @@
can_flashlight = 0
ammo_x_offset = 1
+/obj/item/weapon/gun/energy/gun/dragnet/snare
+ name = "Energy Snare Launcher"
+ desc = "Fires an energy snare that slows the target down"
+ ammo_type = list(/obj/item/ammo_casing/energy/trap)
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg
+ can_charge = 0
+ ammo_type = list(/obj/item/ammo_casing/energy/trap/cyborg)
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/newshot()
+ ..()
+ robocharge()
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/emp_act()
+ return
+
/obj/item/weapon/gun/energy/gun/turret
name = "hybrid turret gun"
desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 3a7194a1d81..76bde0e0903 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -229,6 +229,8 @@
ammo_type = list(/obj/item/ammo_casing/energy/plasma)
flags = CONDUCT | OPENCONTAINER
attack_verb = list("attacked", "slashed", "cut", "sliced")
+ force = 12
+ sharpness = IS_SHARP
can_charge = 0
heat = 3800
@@ -257,6 +259,7 @@
name = "advanced plasma cutter"
icon_state = "adv_plasmacutter"
origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2"
+ force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
/obj/item/weapon/gun/energy/wormhole_projector
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 44fd2c98dd4..023c7c2fd02 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -24,7 +24,8 @@
if(!S) return
- chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src)
+ chambered.BB = new S.projectile_type (src)
+
S.reagents.trans_to(chambered.BB, S.reagents.total_volume)
chambered.BB.name = S.name
syringes.Remove(S)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index feb1a8d04ca..83d17c7ebfe 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -8,6 +8,7 @@
mouse_opacity = 0
hitsound = 'sound/weapons/pierce.ogg'
pressure_resistance = INFINITY
+ burn_state = LAVA_PROOF
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
var/obj/item/ammo_casing/ammo_casing = null
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 2b081c5f1bd..c1dce29e70f 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -124,7 +124,7 @@
damage = 10
weaken = 4
stun = 4
-
+
/obj/item/projectile/bullet/honker
damage = 0
weaken = 5
@@ -135,7 +135,7 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
range = 200
-
+
/obj/item/projectile/bullet/honker/New()
..()
SpinAnimation()
@@ -166,6 +166,7 @@
name = "dart"
icon_state = "cbbolt"
damage = 6
+ var/piercing = 0
/obj/item/projectile/bullet/dart/New()
..()
@@ -176,7 +177,7 @@
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100) // not completely blocked
- if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ if(M.can_inject(null,0,hit_zone,piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
..()
reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume)
@@ -203,6 +204,10 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "syringeproj"
+//Piercing Syringe
+/obj/item/projectile/bullet/dart/syringe/piercing
+ piercing = 1
+
/obj/item/projectile/bullet/neurotoxin
name = "neurotoxin spit"
icon_state = "neurotoxin"
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 4dde9cc6fc8..3cd537d41ad 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -111,6 +111,32 @@
new/obj/item/weapon/restraints/legcuffs/beartrap/energy(loc)
..()
+/obj/item/projectile/energy/trap/cyborg
+ name = "Energy Bola"
+ icon_state = "e_snare"
+ nodamage = 1
+ weaken = 0
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0)
+ if(!ismob(target) || blocked >= 100)
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ qdel(src)
+ if(iscarbon(target))
+ var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
+ B.Crossed(target)
+ spawn(10)
+ qdel(src)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg/on_range()
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ qdel(src)
/obj/item/projectile/energy/declone
name = "radiation beam"
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index cbe4524c9f9..b0e825110af 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -61,12 +61,9 @@
var/mob/living/carbon/C = target
C.regenerate_limbs()
if(target.revive(full_heal = 1))
- if(!target.ckey)
- for(var/mob/dead/observer/ghost in player_list)
- if(target.real_name == ghost.real_name)
- ghost.reenter_corpse()
- break
- target << "You rise with a start, you're alive!!!"
+ target.grab_ghost(force = TRUE) // even suicides
+ target << "You rise with a start, \
+ you're alive!!!"
else if(target.stat != DEAD)
target << "You feel great!"
@@ -175,7 +172,7 @@
if("drone")
new_mob = new /mob/living/simple_animal/drone(M.loc)
var/mob/living/simple_animal/drone/D = new_mob
- D.update_drone_hack()
+ D.liberate() // F R E E D R O N E
if(issilicon(new_mob))
new_mob.gender = M.gender
new_mob.invisibility = 0
@@ -186,9 +183,10 @@
new_mob.languages |= HUMAN
if("slime")
new_mob = new /mob/living/simple_animal/slime(M.loc)
+ var/mob/living/simple_animal/slime/slimey = new_mob
if(prob(50))
- var/mob/living/simple_animal/slime/Slime = new_mob
- Slime.is_adult = 1
+ slimey.is_adult = 1
+ slimey.random_colour()
new_mob.languages |= HUMAN
if("xeno")
if(prob(50))
@@ -220,7 +218,7 @@
if("spiderhunter")
new_mob = new /mob/living/simple_animal/hostile/poison/giant_spider/hunter(M.loc)
if("blobbernaut")
- new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut(M.loc)
+ new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(M.loc)
if("magicarp")
new_mob = new /mob/living/simple_animal/hostile/carp/ranged(M.loc)
if("chaosmagicarp")
@@ -279,10 +277,8 @@
M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name].")
new_mob.a_intent = "harm"
- if(M.mind)
- M.mind.transfer_to(new_mob)
- else
- new_mob.key = M.key
+
+ M.wabbajack_act(new_mob)
new_mob << "Your form morphs into that of a [randomize]."
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 631efab912f..0002f3dbeca 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -141,7 +141,7 @@
..()
/obj/item/projectile/kinetic/on_range()
- new /obj/item/effect/kinetic_blast(src.loc)
+ new /obj/effect/kinetic_blast(src.loc)
..()
/obj/item/projectile/kinetic/on_hit(atom/target)
@@ -150,7 +150,7 @@
if(istype(target_turf, /turf/closed/mineral))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
- new /obj/item/effect/kinetic_blast(target_turf)
+ new /obj/effect/kinetic_blast(target_turf)
if(src.splash)
for(var/turf/T in range(splash, target_turf))
if(istype(T, /turf/closed/mineral))
@@ -158,13 +158,13 @@
M.gets_drilled(firer)
-/obj/item/effect/kinetic_blast
+/obj/effect/kinetic_blast
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
layer = 4.1
-/obj/item/effect/kinetic_blast/New()
+/obj/effect/kinetic_blast/New()
spawn(4)
qdel(src)
@@ -218,7 +218,7 @@
icon_state = "plasmacutter"
damage_type = BRUTE
damage = 5
- range = 3
+ range = 5
/obj/item/projectile/plasma/New()
var/turf/proj_turf = get_turf(src)
@@ -227,9 +227,9 @@
var/datum/gas_mixture/environment = proj_turf.return_air()
if(environment)
var/pressure = environment.return_pressure()
- if(pressure < 30)
+ if(pressure < 60)
name = "full strength plasma blast"
- damage *= 3
+ damage *= 4
..()
/obj/item/projectile/plasma/on_hit(atom/target)
@@ -237,12 +237,14 @@
if(istype(target, /turf/closed/mineral))
var/turf/closed/mineral/M = target
M.gets_drilled(firer)
- range = max(range - 1, 1)
- return -1
+ Range()
+ if(range > 0)
+ return -1
/obj/item/projectile/plasma/adv
- range = 5
+ damage = 7
+ range = 7
/obj/item/projectile/plasma/adv/mech
damage = 10
- range = 6
\ No newline at end of file
+ range = 8
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 4730cd0f891..ccdcc770c74 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -9,8 +9,10 @@
idle_power_usage = 20
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/bottle = null
- var/mode = 0
+ var/mode = 1
var/condi = 0
+ var/screen = "home"
+ var/analyzeVars[0]
var/useramount = 30 // Last used amount
/obj/machinery/chem_master/New()
@@ -113,122 +115,98 @@
else
return ..()
-/obj/machinery/chem_master/Topic(href, href_list)
+
+/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
+ datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "chem_master", name, 500, 550, master_ui, state)
+ ui.open()
+
+
+/obj/machinery/chem_master/ui_data(mob/user)
+ var/list/data = list()
+ data["isBeakerLoaded"] = beaker ? 1 : 0
+ data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null
+ data["beakerMaxVolume"] = beaker ? beaker.volume : null
+ data["mode"] = mode
+ data["condi"] = condi
+ data["screen"] = screen
+ data["analyzeVars"] = analyzeVars
+
+ data["isPillBottleLoaded"] = bottle ? 1 : 0
+ if(bottle)
+ data["pillBotContent"] = bottle.contents.len
+ data["pillBotMaxContent"] = bottle.storage_slots
+
+
+ var beakerContents[0]
+ if(beaker)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ beakerContents.Add(list(list("name" = R.name, "id" = R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
+ data["beakerContents"] = beakerContents
+
+ var bufferContents[0]
+ if(reagents.total_volume)
+ for(var/datum/reagent/N in reagents.reagent_list)
+ bufferContents.Add(list(list("name" = N.name, "id" = N.id, "volume" = N.volume))) // ^
+ data["bufferContents"] = bufferContents
+
+
+ return data
+
+/obj/machinery/chem_master/ui_act(action, params)
if(..())
return
-
- usr.set_machine(src)
-
- if(href_list["ejectp"])
- if(bottle)
- bottle.loc = src.loc
- bottle = null
-
- else if(href_list["close"])
- usr << browse(null, "window=chem_master")
- usr.unset_machine()
- return
-
- else if(href_list["toggle"])
- mode = !mode
-
- else if(href_list["createbottle"])
- var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
- if(!name)
- return
- var/obj/item/weapon/reagent_containers/P
- if(condi)
- P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
- else
- P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- P.pixel_x = rand(-7, 7) //random position
- P.pixel_y = rand(-7, 7)
- P.name = trim("[name] bottle")
- reagents.trans_to(P, P.volume)
-
- if(beaker)
-
- if(href_list["analyze"])
- if(locate(href_list["reagent"]))
- var/datum/reagent/R = locate(href_list["reagent"])
- if(R)
- var/dat = ""
- dat += "[condi ? "Condiment" : "Chemical"] information:
"
- dat += "Name: [initial(R.name)]
"
- dat += "State: "
- if(initial(R.reagent_state) == 1)
- dat += "Solid"
- else if(initial(R.reagent_state) == 2)
- dat += "Liquid"
- else if(initial(R.reagent_state) == 3)
- dat += "Gas"
- else
- dat += "Unknown"
- dat += "
"
- dat += "Color: [initial(R.color)]
"
- dat += "Description: [initial(R.description)]
"
- var/const/P = 3 //The number of seconds between life ticks
- var/T = initial(R.metabolization_rate) * (60 / P)
- dat += "Metabolization Rate: [T]u/minute
"
- dat += "Overdose Threshold: [initial(R.overdose_threshold) ? "[initial(R.overdose_threshold)]u" : "none"]
"
- dat += "Addiction Threshold: [initial(R.addiction_threshold) ? "[initial(R.addiction_threshold)]u" : "none"]
"
- dat += "
Back"
- var/datum/browser/popup = new(usr, "chem_master", name)
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
- popup.open(1)
- return
-
- else if(href_list["main"]) // Used to exit the analyze screen.
- attack_hand(usr)
- return
-
- else if(href_list["add"])
- if(href_list["amount"])
- var/id = href_list["add"]
- var/amount = text2num(href_list["amount"])
- if (amount > 0)
- beaker.reagents.trans_id_to(src, id, amount)
-
- else if(href_list["addcustom"])
- var/id = href_list["addcustom"]
- var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null)
- if(!amt_temp)
- return
- useramount = amt_temp
- src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
-
- else if(href_list["remove"])
- if(href_list["amount"])
- var/id = href_list["remove"]
- var/amount = text2num(href_list["amount"])
- if (amount > 0)
- if(mode)
- reagents.trans_id_to(beaker, id, amount)
- else
- reagents.remove_reagent(id, amount)
-
- else if(href_list["removecustom"])
- var/id = href_list["removecustom"]
- var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null)
- if(!amt_temp)
- return
- useramount = amt_temp
- src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
-
- else if(href_list["eject"])
+ switch(action)
+ if("eject")
if(beaker)
beaker.loc = src.loc
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
+ . = TRUE
- else if(href_list["createpill"]) //Also used for condiment packs.
+ if("ejectp")
+ if(bottle)
+ bottle.loc = src.loc
+ bottle = null
+ . = TRUE
+
+ if("transferToBuffer")
+ if(beaker)
+ var/id = params["id"]
+ var/amount = text2num(params["amount"])
+ if (amount > 0)
+ beaker.reagents.trans_id_to(src, id, amount)
+ . = TRUE
+ else if (amount == -1) // -1 means custom amount
+ useramount = input("Enter the Amount you want to transfer:", name, useramount) as num|null
+ beaker.reagents.trans_id_to(src, id, useramount)
+ . = TRUE
+
+ if("transferFromBuffer")
+ var/id = params["id"]
+ var/amount = text2num(params["amount"])
+ if (amount > 0)
+ if(mode)
+ reagents.trans_id_to(beaker, id, amount)
+ . = TRUE
+ else
+ reagents.remove_reagent(id, amount)
+ . = TRUE
+
+ if("toggleMode")
+ mode = !mode
+ . = TRUE
+
+ if("createPill")
+ var/many = params["many"]
if(reagents.total_volume == 0) return
if(!condi)
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
- if(text2num(href_list["many"]))
+ if(text2num(many))
amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0), 10)
if(!amount)
return
@@ -257,12 +235,14 @@
P.name = trim("[name] pack")
P.desc = "A small condiment pack. The label says it contains [name]."
reagents.trans_to(P,10)
+ . = TRUE
- else if(href_list["createpatch"])
+ if("createPatch")
+ var/many = params["many"]
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
- if(text2num(href_list["many"]))
+ if(text2num(many))
amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0), 10)
if(!amount)
return
@@ -278,84 +258,46 @@
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
reagents.trans_to(P,vol_each)
+ . = TRUE
- src.updateUsrDialog()
- return
+ if("createBottle")
+ var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
+ if(!name)
+ return
+ var/obj/item/weapon/reagent_containers/P
+ if(condi)
+ P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
+ else
+ P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
-/obj/machinery/chem_master/attack_hand(mob/user)
- if(stat & BROKEN)
- return
+ P.pixel_x = rand(-7, 7) //random position
+ P.pixel_y = rand(-7, 7)
+ P.name = trim("[name] bottle")
+ reagents.trans_to(P, P.volume)
+ . = TRUE
- user.set_machine(src)
- var/dat = ""
- if(beaker)
- dat += "Beaker \[[beaker.reagents.total_volume]/[beaker.volume]\] Eject and Clear Buffer
"
- else
- dat = "Please insert beaker.
"
+ if("analyze")
+ var/datum/reagent/R = chemical_reagents_list[params["id"]]
+ if(R)
+ var/state = "Unknown"
+ if(initial(R.reagent_state) == 1)
+ state = "Solid"
+ else if(initial(R.reagent_state) == 2)
+ state = "Liquid"
+ else if(initial(R.reagent_state) == 3)
+ state = "Gas"
+ var/const/P = 3 //The number of seconds between life ticks
+ var/T = initial(R.metabolization_rate) * (60 / P)
+ analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold))
+ screen = "analyze"
+ return
- dat += "
Add to buffer:"
- if(beaker)
- if(beaker.reagents.total_volume)
- for(var/datum/reagent/G in beaker.reagents.reagent_list)
- dat += "- [G.name], [G.volume] Units - "
- dat += "Analyze "
- dat += "1 "
- dat += "5 "
- dat += "10 "
- dat += "All "
- dat += "Custom"
- else
- dat += "
- Beaker is empty."
- else
- dat += "
- No beaker."
+ if("goScreen")
+ screen = params["screen"]
+ . = TRUE
- dat += "
Transfer to [(!mode ? "disposal" : "beaker")]:"
- if(reagents.total_volume)
- for(var/datum/reagent/N in reagents.reagent_list)
- dat += "- [N.name], [N.volume] Units - "
- dat += "Analyze "
- dat += "1 "
- dat += "5 "
- dat += "10 "
- dat += "All "
- dat += "Custom"
- else
- dat += "
- Buffer is empty."
- dat += "
"
- if(!condi)
- if(bottle)
- dat += "Pill Bottle \[[bottle.contents.len]/[bottle.storage_slots]\] Eject"
- else
- dat += "No pill bottle inserted."
- else
- dat += "
"
- dat += ""
- if(!condi)
- if(beaker && reagents.total_volume)
- dat += "- Create pill (50 units max)"
- dat += "
- Create multiple pills
"
- dat += " - Create patch (50 units max)"
- dat += "
- Create multiple patches
"
- else
- dat += " - Create pill (50 units max)"
- dat += "
- Create multiple pills
"
- dat += " - Create patch (50 units max)"
- dat += "
- Create multiple patches
"
- else
- if(beaker && reagents.total_volume)
- dat += " - Create pack (10 units max)
"
- else
- dat += " - Create pack (10 units max)
"
- dat += " - Create bottle ([condi ? "50" : "30"] units max)"
- dat += "
"
- dat += "
Close"
- var/datum/browser/popup = new(user, "chem_master", name, 470, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open(1)
- return
/obj/machinery/chem_master/proc/isgoodnumber(num)
if(isnum(num))
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 419d5e2c91d..e71f8a95b48 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -29,15 +29,6 @@
/obj/item/weapon/grown/nettle/death = list("facid" = 0),
/obj/item/weapon/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0),
- //Crayons (for overriding colours)
- /obj/item/toy/crayon/red = list("redcrayonpowder" = 10),
- /obj/item/toy/crayon/orange = list("orangecrayonpowder" = 10),
- /obj/item/toy/crayon/yellow = list("yellowcrayonpowder" = 10),
- /obj/item/toy/crayon/green = list("greencrayonpowder" = 10),
- /obj/item/toy/crayon/blue = list("bluecrayonpowder" = 10),
- /obj/item/toy/crayon/purple = list("purplecrayonpowder" = 10),
- /obj/item/toy/crayon/mime = list("invisiblecrayonpowder" = 50),
-
//Blender Stuff
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0),
@@ -414,21 +405,6 @@
break
remove_object(O)
-
- //Crayons
- //With some input from aranclanos, now 30% less shoddily copypasta
- for (var/obj/item/toy/crayon/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/allowed = get_allowed_by_id(O)
- for (var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- beaker.reagents.add_reagent(r_id,min(amount, space))
- if (space < amount)
- break
- remove_object(O)
-
//Everything else - Transfers reagents from it into beaker
for (var/obj/item/weapon/reagent_containers/O in holdingitems)
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
@@ -436,4 +412,4 @@
var/amount = O.reagents.total_volume
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
- remove_object(O)
\ No newline at end of file
+ remove_object(O)
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 73943891b08..0d648c46fc2 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -565,7 +565,7 @@
reac_volume = ..()
var/turf/open/T = get_turf(M)
if(istype(T) && prob(reac_volume))
- T.MakeSlippery(min = 5, max = 1)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
M.apply_damage(0.1*reac_volume, BRUTE)
@@ -586,7 +586,7 @@
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance)
for(var/turf/open/T in range(1, B))
if(prob(probchance))
- T.MakeSlippery(min = 5, max = 1)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
for(var/obj/O in T)
O.extinguish()
for(var/mob/living/L in T)
@@ -663,4 +663,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- M << "[totalmessage]"
\ No newline at end of file
+ M << "[totalmessage]"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 27ac8a195ae..c9e1e5c4897 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -155,7 +155,7 @@
if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades!
if(istype(T, /turf/open))
var/turf/open/OT = T
- OT.MakeSlippery(TURF_WET_ICE, 5, reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
+ OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=5, wet_time_to_add=reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit.
/datum/reagent/consumable/condensedcapsaicin
@@ -324,7 +324,7 @@
/datum/reagent/consumable/cornoil/reaction_turf(turf/open/T, reac_volume)
if (!istype(T))
return
- T.MakeSlippery(min = 5, max = reac_volume*2)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*2)
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index d3a0dd84c01..eaf4e1c8c68 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -123,7 +123,7 @@
var/CT = cooling_temperature
if(reac_volume >= 5)
- T.MakeSlippery(min = 5, max = reac_volume*0.2)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*0.2)
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
@@ -173,6 +173,11 @@
description = "Water blessed by some deity."
color = "#E0E8EF" // rgb: 224, 232, 239
+/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(is_servant_of_ratvar(M))
+ M << "A darkness begins to spread its unholy tendrils through your mind, purging the Justiciar's influence!"
+ ..()
+
/datum/reagent/water/holywater/on_mob_life(mob/living/M)
if(!data) data = 1
data++
@@ -184,13 +189,23 @@
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
+ else if(is_servant_of_ratvar(M) && prob(5))
+ switch(pick("speech", "message", "emote"))
+ if("speech")
+ M.say("...[pick("Ratvar... lbhe yvtug tebjf qnex", "Jurer ner lbh, znfgre?", "Ur yvrf ehfgvat va Reebe", "Chetr nyy hagehguf naq... naq... fbzrguvat")]...")
+ if("message")
+ M << "[pick("Ratvar's illumination of your mind has begun to flicker.", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay.", \
+ "You can't save him. Nothing can save him now.", "It seems that Nar-Sie will triumph after all.")]"
+ if("emote")
+ M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")]")
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused)
M.confused = 1
M.confused += 3
- if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
+ if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)) || is_servant_of_ratvar(M))
ticker.mode.remove_cultist(M.mind, 1, 1)
ticker.mode.remove_hog_follower(M.mind)
+ remove_servant_of_ratvar(M.mind)
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0
M.stuttering = 0
@@ -258,7 +273,7 @@
/datum/reagent/lube/reaction_turf(turf/open/T, reac_volume)
if (!istype(T)) return
if(reac_volume >= 1)
- T.MakeSlippery(TURF_WET_LUBE, 5, reac_volume)
+ T.MakeSlippery(wet_setting=TURF_WET_LUBE, min_wet_time=5, wet_time_to_add=reac_volume)
/datum/reagent/spraytan
name = "Spray Tan"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 966481e1b2d..12016ff0618 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -267,6 +267,20 @@
. = 1
..()
+/datum/reagent/toxin/chloralhydrate/delayed
+ id = "chloralhydrate2"
+
+/datum/reagent/toxin/chloralhydrate/delayed/on_mob_life(mob/living/M)
+ switch(current_cycle)
+ if(1 to 10)
+ return
+ if(10 to 20)
+ M.confused += 1
+ M.drowsyness += 1
+ if(20 to INFINITY)
+ M.Sleeping(2, 0)
+ ..()
+
/datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots
name = "Beer"
id = "beer2"
@@ -707,3 +721,31 @@
M.adjustFireLoss(current_cycle/10, 0) // I rode a tank, held a general's rank
. = 1 // When the blitzkrieg raged and the bodies stank
..() // Pleased to meet you, hope you guess my name
+
+/datum/reagent/toxin/peaceborg/confuse
+ name = "Dizzying Solution"
+ id = "dizzysolution"
+ description = "Makes the target off balance and dizzy"
+ toxpwr = 0
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M)
+ M.confused += 1
+ M.Dizzy(1)
+ if(prob(20))
+ M << "You feel confused and disorientated."
+ ..()
+
+/datum/reagent/toxin/peaceborg/tire
+ name = "Tiring Solution"
+ id = "tiresolution"
+ description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
+ toxpwr = 0
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/toxin/peaceborg/tire/on_mob_life(mob/living/M)
+ if(M.staminaloss < 50)
+ M.adjustStaminaLoss(10)
+ if(prob(30))
+ M << "You should sit down and take a rest..."
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 679999b573c..e6188a387f5 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -207,3 +207,13 @@ Borg Shaker
recharge_time = 3
reagent_ids = list("beer2")
+
+/obj/item/weapon/reagent_containers/borghypo/peace
+ name = "Peace Hypospray"
+
+ reagent_ids = list("dizzysolution","tiresolution")
+
+/obj/item/weapon/reagent_containers/borghypo/peace/hacked
+ desc = "Everything's peaceful in death!"
+ icon_state = "borghypo_s"
+ reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2")
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index e65c3fac38e..26b52650670 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -12,6 +12,7 @@
volume = 15
var/mode = SYRINGE_DRAW
var/busy = 0 // needed for delayed drawing of blood
+ var/projectile_type = /obj/item/projectile/bullet/dart/syringe
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/weapon/reagent_containers/syringe/New()
@@ -181,7 +182,7 @@
/obj/item/weapon/reagent_containers/syringe/update_icon()
- var/rounded_vol = Clamp(round(reagents.total_volume,5), 0, 15)
+ var/rounded_vol = Clamp(round((reagents.total_volume / volume * 15),5), 0, 15)
overlays.Cut()
if(ismob(loc))
var/injoverlay
@@ -253,4 +254,22 @@
desc = "A syringe recovered from a dread place. It probably isn't wise to use."
amount_per_transfer_from_this = 1
volume = 1
- list_reagents = list("gluttonytoxin" = 1)
\ No newline at end of file
+ list_reagents = list("gluttonytoxin" = 1)
+
+/obj/item/weapon/reagent_containers/syringe/bluespace
+ name = "bluespace syringe"
+ desc = "An advanced syringe that can hold 60 units of chemicals"
+ amount_per_transfer_from_this = 20
+ volume = 60
+
+/obj/item/weapon/reagent_containers/syringe/noreact
+ name = "cryo syringe"
+ desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
+ volume = 20
+ flags = NOREACT
+
+/obj/item/weapon/reagent_containers/syringe/piercing
+ name = "piercing syringe"
+ desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
+ volume = 10
+ projectile_type = /obj/item/projectile/bullet/dart/syringe/piercing
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index d7e9ef3882f..88f2ecad568 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -71,7 +71,7 @@
materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500)
reliability = 76
build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
- category = list("Misc","Medical Designs")
+ category = list("Medical Designs", "Bluespace Designs")
/datum/design/noreactbeaker
name = "Cryostasis Beaker"
@@ -84,6 +84,39 @@
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
category = list("Medical Designs")
+/datum/design/bluespacesyringe
+ name = "Bluespace Syringe"
+ desc = "An advanced syringe that can hold 60 units of chemicals"
+ id = "bluespacesyringe"
+ req_tech = list("bluespace" = 3, "materials" = 4, "combat" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_PLASMA = 2000, MAT_DIAMOND = 2000)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/bluespace
+ category = list("Medical Designs", "Bluespace Designs")
+
+/datum/design/noreactsyringe
+ name = "Cryo Syringe"
+ desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
+ id = "noreactsyringe"
+ req_tech = list("materials" = 2, "combat" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_GOLD = 1000)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/noreact
+ category = list("Medical Designs")
+
+/datum/design/piercesyringe
+ name = "Piercing Syringe"
+ desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
+ id = "piercesyringe"
+ req_tech = list("materials" = 3, "combat" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_DIAMOND = 1500)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/piercing
+ category = list("Medical Designs")
+
/datum/design/bluespacebodybag
name = "Bluespace body bag"
desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures."
@@ -132,6 +165,17 @@
build_path = /obj/item/organ/cyberimp/mouth/breathing_tube
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."
+ id = "ci-toolset"
+ req_tech = list("materials" = 4, "engineering" = 3, "biotech" = 4, "powerstorage" = 4)
+ 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/toolset
+ category = list("Misc", "Medical Designs")
+
/datum/design/cyberimp_medical_hud
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security_levels/keycard_authentication.dm
similarity index 100%
rename from code/modules/security levels/keycard authentication.dm
rename to code/modules/security_levels/keycard_authentication.dm
diff --git a/code/modules/security levels/security levels.dm b/code/modules/security_levels/security_levels.dm
similarity index 100%
rename from code/modules/security levels/security levels.dm
rename to code/modules/security_levels/security_levels.dm
diff --git a/code/modules/space transition/space_transition.dm b/code/modules/space_transition/space_transition.dm
similarity index 100%
rename from code/modules/space transition/space_transition.dm
rename to code/modules/space_transition/space_transition.dm
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb_augmentation.dm
similarity index 100%
rename from code/modules/surgery/limb augmentation.dm
rename to code/modules/surgery/limb_augmentation.dm
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 8bcdd00522e..a13204e8f9a 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -54,7 +54,7 @@
return 0
/obj/item/organ/cyberimp/arm/gun/emp_act(severity)
- if(prob(15/severity))
+ if(prob(15/severity) && owner)
owner << "[src] is hit by EMP!"
// give the owner an idea about why his implant is glitching
Retract()
@@ -168,7 +168,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."
- origin_tech = "materials=5;engineering=5;biotech=4;powerstorage=3"
+ origin_tech = "materials=4;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)
diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm
index 11b1c021cc2..e3e110a2a83 100644
--- a/code/modules/tgui/states/hands.dm
+++ b/code/modules/tgui/states/hands.dm
@@ -17,4 +17,9 @@
/mob/living/hands_can_use_topic(src_object)
if(src_object in get_both_hands(src))
return UI_INTERACTIVE
- return UI_CLOSE
\ No newline at end of file
+ return UI_CLOSE
+
+/mob/living/silicon/robot/hands_can_use_topic(src_object)
+ if(activated(src_object))
+ return UI_INTERACTIVE
+ return UI_CLOSE
diff --git a/code/orphaned procs/AStar.dm b/code/orphaned_procs/AStar.dm
similarity index 100%
rename from code/orphaned procs/AStar.dm
rename to code/orphaned_procs/AStar.dm
diff --git a/code/orphaned procs/dbcore.dm b/code/orphaned_procs/dbcore.dm
similarity index 100%
rename from code/orphaned procs/dbcore.dm
rename to code/orphaned_procs/dbcore.dm
diff --git a/code/orphaned procs/priority_announce.dm b/code/orphaned_procs/priority_announce.dm
similarity index 100%
rename from code/orphaned procs/priority_announce.dm
rename to code/orphaned_procs/priority_announce.dm
diff --git a/code/orphaned procs/statistics.dm b/code/orphaned_procs/statistics.dm
similarity index 100%
rename from code/orphaned procs/statistics.dm
rename to code/orphaned_procs/statistics.dm
diff --git a/config/admins.txt b/config/admins.txt
index 6c712096834..b650f5e1d67 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -8,6 +8,7 @@
# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
###############################################################################################
Optimumtact = Host
+kevinz000 = Host
kingofkosmos = Game Master
MrStonedOne = Game Master
microscopics = Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 914a64e3bcf..696eb46c1f8 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -197,9 +197,12 @@ EVENTS_MIN_PLAYERS_MUL 1
ALLOW_AI
### Secborg ###
-## Uncomment to prevent the secborg module from being chosen
+## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
+### Peacekeeper Borg ###
+## Uncomment to prevent the peacekeeper cyborg module from being chosen
+#DISABLE_PEACEBORG
### AWAY MISSIONS ###
@@ -309,7 +312,8 @@ ROUNDSTART_RACES plasmaman
ASSISTANT_CAP -1
## Starlight for exterior walls and breaches. Uncomment for starlight!
-STARLIGHT
+## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting
+#STARLIGHT
## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants.
#GREY_ASSISTANTS
diff --git a/html/changelog.html b/html/changelog.html
index a7fccab664d..9a22fc9aeff 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,40 @@
-->
+
24 May 2016
+
Joan updated:
+
+ - You can no longer scribe the Summon Nar-Sie rune under non-valid conditions.
+
+
Kiazusho updated:
+
+ - Added three new advanced syringes to R&D
+
+
+
23 May 2016
+
CoreOverload updated:
+
+ - New cyberimplant, "Toolset Arm", is now available in RnD.
+
+
coiax, OPDingo updated:
+
+ - Crayons and spraycans are now easier to use.
+ - Centcom announce due to budget cuts their supplier of rainbow crayons has been forced to use more... exotic chemicals. Please do not ingest your standard issue crayon.
+
+
kevinz000 updated:
+
+ - Peacekeeper borgs: Security borgs but without any stuns or restraints! Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector that confuses living things, and a weak holobarrier projector! It also comes with the ability to hug.
+ - Cookie Synthesizer: Self recharging RCD that prints out cookies!
+ - Nanotrasen scientists have added a hugging module to medical and peacekeeper cyborgs to boost emotions during human-cyborg interaction.
+
+
+
22 May 2016
+
coiax updated:
+
+ - Lavaland monsters now give ruins a wide berth.
+ - Glass tables now break when people are pushed onto them.
+
+
21 May 2016
Iamsaltball updated:
@@ -541,67 +575,6 @@
- Miners can now select explorer belts from the mining vendor using their vouchers, or mining points.
-
- 26 April 2016
- Iamgoofball & Super Aggro Crag updated:
-
- - Fluorosulfuric Acid now has doubled acid power.
- - Fluorosulfuric Acid now does BONUS burn damage scaling on the time it's been inside the consumer.
-
- Joan updated:
-
- - Blobbernauts now spawn at half health.
- - Blobbernauts regeneration on blob is now 2.5 health per tick, from 5.
- - Blobbernauts now cost 40 resources to produce, from 30.
- - Factories supporting blobbernauts do not spawn spores.
-
- Lati updated:
-
- - Syndicate bomb can be only delayed once by pulsing the delay wire. Time gained from this is changed from 10 seconds to 30 seconds.
-
- TechnoAlchemisto updated:
-
- - Goliath plates can now be stacked.
-
- phil235 updated:
-
- - More structures and machines are now breakable and/or destroyable with melee weapon. Additionally, Some structures and machines that are already breakable/destroyable are now affected by more attack methods (gun projectiles, thrown items, melee weapons, xeno/animal attacks, explosions).
- - Hitting any machine now always makes a sound.
- - You can hit closed closets/crates and doors by using an item on harm intent (but it doesn't actually hurt them).
- - you can now burst filled water balloons with sharp items.
- - Wooden barricade drops wood when destroyed.
- - Slot machines with coins inside are deconstructable now.
-
-
- 25 April 2016
- Joan updated:
-
- - You can once again hit a closet or crate with an item to open it.
-
- Kor Razharas updated:
-
- - Adds support for autoclicking.
- - The Shock Revolver has been added to RnD.
- - The Laser Gatling Gun has been added to RnD. The Gatling Gun uses autoclick to fire as you hold down the mouse.
- - The Research Director now starts with a box of firing pins.
- - The SABR and Stun Revolver recipes have been removed from RnD
-
- coiax updated:
-
- - Laughter demons are like slaughter demons, but they tickle people to death
- - Slaughter demons are no longer able to cast spells while phased.
- - Wizards can now speak while ethereal, but still cannot cast spells while ethereal.
- - Centcom's "drone expert" reports that drones vision filters have been upgraded to include the option of making all beings appear as harmless animals. info: As always, all drone filters are togglable.
- - As a sign of friendship between the Free Golems and Centcom, they have modified Centcom's jaunter to be worn around a user's waist, which will save them from falling to their death in a chasm.
- - The Golems warn that these modifications have created a risk of accidental activation when exposed to heavy electromagnetic fields.
- - Renamed hivelord stabilizer to stabilizing serum.
- - Centcom regret to inform you that new instabilities with nearby gas giants are causing exospheric bubbles to affect the telecommunications processors. Please contact your supervisor for further instructions.
- - The Janitor's Union has mandated additional features to station light replacer devices.
- - The light replacer now can be used on the floor to replace the bulbs of any lights on that tile.
- - The light replacer now eats replaced bulbs, and after a certain number of bulb fragments (four) will recycle them into a new bulb.
- - The description of the light replacer is now more informative.
- - Clown mask appearance toggle now has an action button.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index aa8559f07f7..11ca7bebea3 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -5124,3 +5124,28 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: About 5 seconds of wetness are removed from a tile for each unit of drying
agent. Absorbant Galoshes remain the most effective method of drying, and dry
tiles instantly regardless of wetness.
+2016-05-22:
+ coiax:
+ - rscdel: Lavaland monsters now give ruins a wide berth.
+ - bugfix: Glass tables now break when people are pushed onto them.
+2016-05-23:
+ CoreOverload:
+ - rscadd: New cyberimplant, "Toolset Arm", is now available in RnD.
+ coiax, OPDingo:
+ - rscadd: Crayons and spraycans are now easier to use.
+ - rscdel: Centcom announce due to budget cuts their supplier of rainbow crayons
+ has been forced to use more... exotic chemicals. Please do not ingest your standard
+ issue crayon.
+ kevinz000:
+ - rscadd: 'Peacekeeper borgs: Security borgs but without any stuns or restraints!
+ Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector
+ that confuses living things, and a weak holobarrier projector! It also comes
+ with the ability to hug.'
+ - rscadd: 'Cookie Synthesizer: Self recharging RCD that prints out cookies!'
+ - tweak: Nanotrasen scientists have added a hugging module to medical and peacekeeper
+ cyborgs to boost emotions during human-cyborg interaction.
+2016-05-24:
+ Joan:
+ - rscdel: You can no longer scribe the Summon Nar-Sie rune under non-valid conditions.
+ Kiazusho:
+ - rscadd: Added three new advanced syringes to R&D
diff --git a/html/changelogs/AutoChangeLog-pr-16441.yml b/html/changelogs/AutoChangeLog-pr-16441.yml
new file mode 100644
index 00000000000..54eaa1ec569
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-16441.yml
@@ -0,0 +1,4 @@
+author: Xhuis
+delete-after: True
+changes:
+ - rscadd: "Purge all untruths and honor Ratvar."
diff --git a/html/changelogs/AutoChangeLog-pr-17688.yml b/html/changelogs/AutoChangeLog-pr-17688.yml
deleted file mode 100644
index 139c5f4beed..00000000000
--- a/html/changelogs/AutoChangeLog-pr-17688.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: coiax
-delete-after: True
-changes:
- - rscdel: "Lavaland monsters now give ruins a wide berth."
diff --git a/html/changelogs/AutoChangeLog-pr-17881.yml b/html/changelogs/AutoChangeLog-pr-17881.yml
new file mode 100644
index 00000000000..423828cbef1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-17881.yml
@@ -0,0 +1,16 @@
+author: coiax
+delete-after: True
+changes:
+ - bugfix: "Fixes bug where bolt of change to the host would kill an attached
+guardian."
+ - bugfix: "Fixes bug where bolt of change to laughter demon would not release
+its friends."
+ - bugfix: "Fixes bug where bolt of change to morphling would not release its
+contents."
+ - bugfix: "Fixes bug where bolt of change transforming someone into a drone
+would not give them hacked laws and vision."
+ - bugfix: "Blobbernauts created by a staff of change are now \"independent\" and
+will not decay if seperated from a blob or missing a factory."
+ - rscadd: "Independent blobbernauts added to gold slime core spawn pool."
+ - rscadd: "Medical scanners now inform the user if the dead subject is
+within the (currently) 120 second defib window."
diff --git a/html/changelogs/AutoChangeLog-pr-17890.yml b/html/changelogs/AutoChangeLog-pr-17890.yml
new file mode 100644
index 00000000000..0681230702f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-17890.yml
@@ -0,0 +1,8 @@
+author: coiax
+delete-after: True
+changes:
+ - rscadd: "Ghosts now have the \"Restore Character Name\" verb, which will set
+their ghost appearance and dead chat name to their character preferences."
+ - bugfix: "Mob spawners now give any generated names to the mind of the
+spawned mob, meaning ghosts will have the name they had in life."
+ - bugfix: "Fixes interaction with envy's knife and lavaland spawns."
diff --git a/html/changelogs/AutoChangeLog-pr-17913.yml b/html/changelogs/AutoChangeLog-pr-17913.yml
new file mode 100644
index 00000000000..b87ef03942e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-17913.yml
@@ -0,0 +1,5 @@
+author: coiax
+delete-after: True
+changes:
+ - bugfix: "Fixes a bug where swarmers teleporting humans would incorrectly
+display a visible message about restraints breaking."
diff --git a/icons/effects/187x381.dmi b/icons/effects/187x381.dmi
new file mode 100644
index 00000000000..dd43297db53
Binary files /dev/null and b/icons/effects/187x381.dmi differ
diff --git a/icons/effects/211x247.dmi b/icons/effects/211x247.dmi
new file mode 100644
index 00000000000..35b25ffe146
Binary files /dev/null and b/icons/effects/211x247.dmi differ
diff --git a/icons/effects/254x361.dmi b/icons/effects/254x361.dmi
new file mode 100644
index 00000000000..4fd6543c32d
Binary files /dev/null and b/icons/effects/254x361.dmi differ
diff --git a/icons/effects/340x428.dmi b/icons/effects/340x428.dmi
new file mode 100644
index 00000000000..eb735c0ba92
Binary files /dev/null and b/icons/effects/340x428.dmi differ
diff --git a/icons/effects/400x400.dmi b/icons/effects/400x400.dmi
new file mode 100644
index 00000000000..c3fe60bc09c
Binary files /dev/null and b/icons/effects/400x400.dmi differ
diff --git a/icons/effects/512x512.dmi b/icons/effects/512x512.dmi
new file mode 100644
index 00000000000..98116dfdac1
Binary files /dev/null and b/icons/effects/512x512.dmi differ
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index a366c61e985..855e6d21922 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 39df6013a71..0aed64e2497 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi
new file mode 100644
index 00000000000..ab97d77bf1f
Binary files /dev/null and b/icons/effects/clockwork_effects.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index f4b379bd074..d9724cd6f16 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/clockwork_mobs.dmi b/icons/mob/clockwork_mobs.dmi
new file mode 100644
index 00000000000..7a97fa733e6
Binary files /dev/null and b/icons/mob/clockwork_mobs.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index b8f84216bd1..65b0323be4d 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 1dee82622ae..f68b23f4ba2 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 547f8a5ca94..38ec8bc7834 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index be64c757347..7cd4efa8dff 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index a289b451f05..0f522819853 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 2d54cb9552c..0b28b4e4914 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi
index 0ac3137707f..e3c81e501ee 100644
Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ
diff --git a/icons/mob/robot_transformations.dmi b/icons/mob/robot_transformations.dmi
index 1cedece909f..f389bb60a02 100644
Binary files a/icons/mob/robot_transformations.dmi and b/icons/mob/robot_transformations.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 9f1ea3d8562..997d2514ebc 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 2deeba386ab..d85d188d87d 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 2e42bd46e86..836b5da8222 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi
index 6acd646cedf..9ca7ba0aeb2 100644
Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
new file mode 100644
index 00000000000..01e06461c7a
Binary files /dev/null and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/clothing/clockwork_garb.dmi b/icons/obj/clothing/clockwork_garb.dmi
new file mode 100644
index 00000000000..9eed34114bf
Binary files /dev/null and b/icons/obj/clothing/clockwork_garb.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index c1c54f412a5..abf1e0ef5de 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 3bb92c1be20..8caf8e42270 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/crayons.dmi b/icons/obj/crayons.dmi
index 7d3489285c3..c4eebb65c80 100644
Binary files a/icons/obj/crayons.dmi and b/icons/obj/crayons.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 7730f914edd..9a130739353 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index b2cde1ea35b..c27f5c38893 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -73,6 +73,10 @@ h1.alert, h2.alert {color: #000000;}
.holoparasite {color: #35333a;}
.holoparasitebold {color: #35333a; font-weight: bold;}
+.brass {color: #BE8700;}
+.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
+.large_brass {color: #BE8700; font-size: 3;}
+
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
@@ -93,7 +97,7 @@ h1.alert, h2.alert {color: #000000;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
.robot {font-family: "Courier New", cursive, sans-serif;}
-.command_headset {font-weight: bold; font-size: 3; }
+.command_headset {font-weight: bold; font-size: 3;}
.big {font-size: 3;}
.reallybig {font-size: 4;}
.greentext {color: #00FF00; font-size: 3;}
diff --git a/sound/AI/harmalarm.ogg b/sound/AI/harmalarm.ogg
new file mode 100644
index 00000000000..b9107f6e44d
Binary files /dev/null and b/sound/AI/harmalarm.ogg differ
diff --git a/sound/effects/clockcult_gateway_active.ogg b/sound/effects/clockcult_gateway_active.ogg
new file mode 100644
index 00000000000..86487e3bdd4
Binary files /dev/null and b/sound/effects/clockcult_gateway_active.ogg differ
diff --git a/sound/effects/clockcult_gateway_charging.ogg b/sound/effects/clockcult_gateway_charging.ogg
new file mode 100644
index 00000000000..1c4e55538ce
Binary files /dev/null and b/sound/effects/clockcult_gateway_charging.ogg differ
diff --git a/sound/effects/clockcult_gateway_closing.ogg b/sound/effects/clockcult_gateway_closing.ogg
new file mode 100644
index 00000000000..1c69f386834
Binary files /dev/null and b/sound/effects/clockcult_gateway_closing.ogg differ
diff --git a/sound/effects/clockcult_gateway_disrupted.ogg b/sound/effects/clockcult_gateway_disrupted.ogg
new file mode 100644
index 00000000000..7ab734dc6c8
Binary files /dev/null and b/sound/effects/clockcult_gateway_disrupted.ogg differ
diff --git a/sound/effects/light_flicker.ogg b/sound/effects/light_flicker.ogg
new file mode 100644
index 00000000000..58be2c6ebda
Binary files /dev/null and b/sound/effects/light_flicker.ogg differ
diff --git a/sound/effects/ratvar_rises.ogg b/sound/effects/ratvar_rises.ogg
new file mode 100644
index 00000000000..6201ce790d6
Binary files /dev/null and b/sound/effects/ratvar_rises.ogg differ
diff --git a/sound/hallucinations/im_here1.ogg b/sound/hallucinations/im_here1.ogg
index b3a7142365e..7a671739b89 100644
Binary files a/sound/hallucinations/im_here1.ogg and b/sound/hallucinations/im_here1.ogg differ
diff --git a/sound/hallucinations/im_here2.ogg b/sound/hallucinations/im_here2.ogg
index bd841bcdb14..1e289d53f87 100644
Binary files a/sound/hallucinations/im_here2.ogg and b/sound/hallucinations/im_here2.ogg differ
diff --git a/sound/hallucinations/turn_around1.ogg b/sound/hallucinations/turn_around1.ogg
index 7a83755a93f..ce54f1944e4 100644
Binary files a/sound/hallucinations/turn_around1.ogg and b/sound/hallucinations/turn_around1.ogg differ
diff --git a/sound/hallucinations/turn_around2.ogg b/sound/hallucinations/turn_around2.ogg
index f4328458dd9..2c3c49466d5 100644
Binary files a/sound/hallucinations/turn_around2.ogg and b/sound/hallucinations/turn_around2.ogg differ
diff --git a/sound/magic/clockwork/anima_fragment_attack.ogg b/sound/magic/clockwork/anima_fragment_attack.ogg
new file mode 100644
index 00000000000..2c539292cba
Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_attack.ogg differ
diff --git a/sound/magic/clockwork/anima_fragment_death.ogg b/sound/magic/clockwork/anima_fragment_death.ogg
new file mode 100644
index 00000000000..d209bff5a28
Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_death.ogg differ
diff --git a/sound/magic/clockwork/fellowship_armory.ogg b/sound/magic/clockwork/fellowship_armory.ogg
new file mode 100644
index 00000000000..c108d4621c6
Binary files /dev/null and b/sound/magic/clockwork/fellowship_armory.ogg differ
diff --git a/sound/magic/clockwork/invoke_general.ogg b/sound/magic/clockwork/invoke_general.ogg
new file mode 100644
index 00000000000..6f0c0dd097a
Binary files /dev/null and b/sound/magic/clockwork/invoke_general.ogg differ
diff --git a/sound/magic/clockwork/narsie_attack.ogg b/sound/magic/clockwork/narsie_attack.ogg
new file mode 100644
index 00000000000..89fac778058
Binary files /dev/null and b/sound/magic/clockwork/narsie_attack.ogg differ
diff --git a/sound/magic/clockwork/ratvar_attack.ogg b/sound/magic/clockwork/ratvar_attack.ogg
new file mode 100644
index 00000000000..1c17fe10510
Binary files /dev/null and b/sound/magic/clockwork/ratvar_attack.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index d4c6a074bfa..8de9ad7be8a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -258,7 +258,7 @@
#include "code\game\sound.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
-#include "code\game\area\Space Station 13 areas.dm"
+#include "code\game\area\Space_Station_13_areas.dm"
#include "code\game\gamemodes\antag_hud.dm"
#include "code\game\gamemodes\antag_spawner.dm"
#include "code\game\gamemodes\events.dm"
@@ -307,6 +307,13 @@
#include "code\game\gamemodes\changeling\powers\strained_muscles.dm"
#include "code\game\gamemodes\changeling\powers\tiny_prick.dm"
#include "code\game\gamemodes\changeling\powers\transform.dm"
+#include "code\game\gamemodes\clock_cult\__clock_defines.dm"
+#include "code\game\gamemodes\clock_cult\clock_cult.dm"
+#include "code\game\gamemodes\clock_cult\clock_mobs.dm"
+#include "code\game\gamemodes\clock_cult\clock_objects.dm"
+#include "code\game\gamemodes\clock_cult\clock_ratvar.dm"
+#include "code\game\gamemodes\clock_cult\clock_scripture.dm"
+#include "code\game\gamemodes\clock_cult\clock_unsorted.dm"
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\cult\cult_comms.dm"
#include "code\game\gamemodes\cult\cult_items.dm"
@@ -820,7 +827,7 @@
#include "code\modules\admin\stickyban.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\watchlist.dm"
-#include "code\modules\admin\DB ban\functions.dm"
+#include "code\modules\admin\DB_ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
@@ -957,9 +964,9 @@
#include "code\modules\cargo\exports\weapons.dm"
#include "code\modules\chatter\chatter.dm"
#include "code\modules\client\asset_cache.dm"
-#include "code\modules\client\client defines.dm"
-#include "code\modules\client\client procs.dm"
#include "code\modules\client\client_colour.dm"
+#include "code\modules\client\client_defines.dm"
+#include "code\modules\client\client_procs.dm"
#include "code\modules\client\message.dm"
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_savefile.dm"
@@ -1080,53 +1087,53 @@
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
-#include "code\modules\food&drinks\food.dm"
-#include "code\modules\food&drinks\pizzabox.dm"
-#include "code\modules\food&drinks\drinks\drinks.dm"
-#include "code\modules\food&drinks\drinks\drinks\bottle.dm"
-#include "code\modules\food&drinks\drinks\drinks\drinkingglass.dm"
-#include "code\modules\food&drinks\food\condiment.dm"
-#include "code\modules\food&drinks\food\customizables.dm"
-#include "code\modules\food&drinks\food\snacks.dm"
-#include "code\modules\food&drinks\food\snacks_bread.dm"
-#include "code\modules\food&drinks\food\snacks_burgers.dm"
-#include "code\modules\food&drinks\food\snacks_cake.dm"
-#include "code\modules\food&drinks\food\snacks_egg.dm"
-#include "code\modules\food&drinks\food\snacks_meat.dm"
-#include "code\modules\food&drinks\food\snacks_other.dm"
-#include "code\modules\food&drinks\food\snacks_pastry.dm"
-#include "code\modules\food&drinks\food\snacks_pie.dm"
-#include "code\modules\food&drinks\food\snacks_pizza.dm"
-#include "code\modules\food&drinks\food\snacks_salad.dm"
-#include "code\modules\food&drinks\food\snacks_sandwichtoast.dm"
-#include "code\modules\food&drinks\food\snacks_soup.dm"
-#include "code\modules\food&drinks\food\snacks_spaghetti.dm"
-#include "code\modules\food&drinks\food\snacks_vend.dm"
-#include "code\modules\food&drinks\food\snacks\dough.dm"
-#include "code\modules\food&drinks\food\snacks\meat.dm"
-#include "code\modules\food&drinks\kitchen machinery\food_cart.dm"
-#include "code\modules\food&drinks\kitchen machinery\gibber.dm"
-#include "code\modules\food&drinks\kitchen machinery\icecream_vat.dm"
-#include "code\modules\food&drinks\kitchen machinery\juicer.dm"
-#include "code\modules\food&drinks\kitchen machinery\microwave.dm"
-#include "code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm"
-#include "code\modules\food&drinks\kitchen machinery\processor.dm"
-#include "code\modules\food&drinks\kitchen machinery\smartfridge.dm"
-#include "code\modules\food&drinks\recipes\drinks_recipes.dm"
-#include "code\modules\food&drinks\recipes\food_mixtures.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_bread.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_burger.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_cake.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_egg.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_meat.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_misc.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pastry.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pie.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pizza.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_salad.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_sandwich.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_soup.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_spaghetti.dm"
+#include "code\modules\food_and_drinks\food.dm"
+#include "code\modules\food_and_drinks\pizzabox.dm"
+#include "code\modules\food_and_drinks\drinks\drinks.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
+#include "code\modules\food_and_drinks\food\condiment.dm"
+#include "code\modules\food_and_drinks\food\customizables.dm"
+#include "code\modules\food_and_drinks\food\snacks.dm"
+#include "code\modules\food_and_drinks\food\snacks_bread.dm"
+#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
+#include "code\modules\food_and_drinks\food\snacks_cake.dm"
+#include "code\modules\food_and_drinks\food\snacks_egg.dm"
+#include "code\modules\food_and_drinks\food\snacks_meat.dm"
+#include "code\modules\food_and_drinks\food\snacks_other.dm"
+#include "code\modules\food_and_drinks\food\snacks_pastry.dm"
+#include "code\modules\food_and_drinks\food\snacks_pie.dm"
+#include "code\modules\food_and_drinks\food\snacks_pizza.dm"
+#include "code\modules\food_and_drinks\food\snacks_salad.dm"
+#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
+#include "code\modules\food_and_drinks\food\snacks_soup.dm"
+#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
+#include "code\modules\food_and_drinks\food\snacks_vend.dm"
+#include "code\modules\food_and_drinks\food\snacks\dough.dm"
+#include "code\modules\food_and_drinks\food\snacks\meat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm"
+#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm"
+#include "code\modules\food_and_drinks\recipes\food_mixtures.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\holiday\easter.dm"
@@ -1222,6 +1229,7 @@
#include "code\modules\mining\lavaland\necropolis_chests.dm"
#include "code\modules\mining\lavaland\weather.dm"
#include "code\modules\mining\lavaland\weather_types.dm"
+#include "code\modules\mining\lavaland\ruins\gym.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\interactive.dm"
#include "code\modules\mob\inventory.dm"
@@ -1436,7 +1444,6 @@
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
-#include "code\modules\mob\living\simple_animal\hostile\reenactors.dm"
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
@@ -1539,18 +1546,18 @@
#include "code\modules\power\tesla\coil.dm"
#include "code\modules\power\tesla\energy_ball.dm"
#include "code\modules\power\tesla\generator.dm"
-#include "code\modules\procedural mapping\mapGenerator.dm"
-#include "code\modules\procedural mapping\mapGeneratorModule.dm"
-#include "code\modules\procedural mapping\mapGeneratorObj.dm"
-#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
-#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
-#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
-#include "code\modules\procedural mapping\mapGenerators\asteroid.dm"
-#include "code\modules\procedural mapping\mapGenerators\cellular.dm"
-#include "code\modules\procedural mapping\mapGenerators\lava_river.dm"
-#include "code\modules\procedural mapping\mapGenerators\nature.dm"
-#include "code\modules\procedural mapping\mapGenerators\shuttle.dm"
-#include "code\modules\procedural mapping\mapGenerators\syndicate.dm"
+#include "code\modules\procedural_mapping\mapGenerator.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModule.dm"
+#include "code\modules\procedural_mapping\mapGeneratorObj.dm"
+#include "code\modules\procedural_mapping\mapGeneratorReadme.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm"
+#include "code\modules\procedural_mapping\mapGenerators\cellular.dm"
+#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm"
+#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
+#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"
#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
@@ -1660,8 +1667,8 @@
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\ruin_areas.dm"
-#include "code\modules\security levels\keycard authentication.dm"
-#include "code\modules\security levels\security levels.dm"
+#include "code\modules\security_levels\keycard_authentication.dm"
+#include "code\modules\security_levels\security_levels.dm"
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\computer.dm"
#include "code\modules\shuttle\emergency.dm"
@@ -1671,7 +1678,7 @@
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
#include "code\modules\shuttle\white_ship.dm"
-#include "code\modules\space transition\space_transition.dm"
+#include "code\modules\space_transition\space_transition.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"
#include "code\modules\spells\spell_types\barnyard.dm"
@@ -1720,7 +1727,7 @@
#include "code\modules\surgery\generic_steps.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
-#include "code\modules\surgery\limb augmentation.dm"
+#include "code\modules\surgery\limb_augmentation.dm"
#include "code\modules\surgery\lipoplasty.dm"
#include "code\modules\surgery\organ_manipulation.dm"
#include "code\modules\surgery\plastic_surgery.dm"
@@ -1769,10 +1776,10 @@
#include "code\modules\vehicles\secway.dm"
#include "code\modules\vehicles\speedbike.dm"
#include "code\modules\vehicles\vehicle.dm"
-#include "code\orphaned procs\AStar.dm"
-#include "code\orphaned procs\dbcore.dm"
-#include "code\orphaned procs\priority_announce.dm"
-#include "code\orphaned procs\statistics.dm"
+#include "code\orphaned_procs\AStar.dm"
+#include "code\orphaned_procs\dbcore.dm"
+#include "code\orphaned_procs\priority_announce.dm"
+#include "code\orphaned_procs\statistics.dm"
#include "interface\interface.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index 35e16349ab3..325fe771db0 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1 @@
-@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
+@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index 47e399aed09..6c55fae1b3b 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,12 +1,12 @@
-require=function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o2?c[2]:void 0,p=Math.min((void 0===l?o:i(l,o))-u,o-s),f=1;for(s>u&&u+p>s&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),i=t(76),a=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=a(e.length),o=arguments,s=o.length,u=i(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,l=void 0===c?n:i(c,n);l>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),i=t(79),a=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=i(u.length),l=a(o,c);if(t&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),i=t(34),a=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,l=6==t,p=5==t||l;return function(f,d,h){for(var m,v,g=a(f),y=i(g),b=r(d,h,3),x=o(y.length),w=0,_=e?s(f,x):n?s(f,0):void 0;x>w;w++)if((p||w in y)&&(m=y[w],v=b(m,w,g),t))if(e)_[w]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return w;case 2:_.push(m)}else if(c)return!1;return l?-1:u||c?c:_}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),i=t(36),a=t(83)("species");e.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&(n=n[a],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),i=t(83)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[i])?n:a?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),i=t(31),a=t(60),o=t(17),s=t(69),u=t(18),c=t(27),l=t(42),p=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,y=v?"_s":"size",b=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";i(t,f,++b)}return"O"+t[f]},w=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,i){var l=t(function(t,a){s(t,l,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[y]=0,void 0!=a&&c(a,n,t[i],t)});return a(l.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[y]=0},"delete":function(t){var e=this,n=w(e,t);if(n){var r=n.n,i=n.p;delete e._i[n.i],n.r=!0,i&&(i.n=r),r&&(r.p=i),e._f==n&&(e._f=r),e._l==n&&(e._l=i),e[y]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!w(this,t)}}),v&&r.setDesc(l.prototype,"size",{get:function(){return u(this[y])}}),l},def:function(t,e,n){var r,i,a=w(t,e);return a?a.v=n:(t._l=a={i:i=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=a),r&&(r.n=a),t[y]++,"F"!==i&&(t._i[i]=a)),t},getEntry:w,setStrong:function(t,e,n){l(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?p(0,n.k):"values"==e?p(0,n.v):p(0,[n.k,n.v]):(t._t=void 0,p(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),i=t(10);e.exports=function(t){return function(){if(i(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),i=t(60),a=t(4),o=t(38),s=t(69),u=t(27),c=t(8),l=t(30),p=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=y(this,t);return e?e[1]:void 0},has:function(t){return!!y(this,t)},set:function(t,e){var n=y(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var a=t(function(t,i){s(t,a,e),t._i=m++,t._l=void 0,void 0!=i&&u(i,n,t[r],t)});return i(a.prototype,{"delete":function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i)&&delete t[p][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i):v(this).has(t):!1}}),a},def:function(t,e,n){return f(a(e))?(l(e,p)||r(e,p,{}),e[p][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:p}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),i=t(22),a=t(61),o=t(60),s=t(27),u=t(69),c=t(38),l=t(24),p=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,y=h?"set":"add",b=g&&g.prototype,x={},w=function(t){var e=b[t];a(b,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||b.forEach&&!l(function(){(new g).entries().next()}))){var _,k=new g,E=k[y](m?{}:-0,1)!=k,S=l(function(){k.has(1)}),O=p(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[y],r),r}),g.prototype=b,b.constructor=g),m||k.forEach(function(t,e){_=1/e===-(1/0)}),(S||_)&&(w("delete"),w("has"),h&&w("get")),(_||E)&&w(y),m&&b.clear&&delete b.clear}else g=d.getConstructor(e,t,h,y),o(g.prototype,n);return f(g,t),x[t]=g,i(i.G+i.W+i.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),i=t(29).document,a=r(i)&&r(i.createElement);e.exports=function(t){return a?i.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var i,a=n(t),o=r.isEnum,s=0;a.length>s;)o.call(t,i=a[s++])&&e.push(i);return e}},{46:46}],22:[function(t,e,n){var r=t(29),i=t(16),a=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var l,p,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,b=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?i:i[e]||(i[e]={}),w=x[u]||(x[u]={});m&&(n=e);for(l in n)p=!h&&b&&l in b,f=(p?b:n)[l],d=y&&p?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,b&&!p&&o(b,l,f),x[l]!=f&&a(x,l,d),g&&w[l]!=f&&(w[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),i=t(61),a=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];a(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),i=t(40),a=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var l,p,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(a(d))for(l=s(t.length);l>m;m++)e?h(o(p=t[m])[0],p[1]):h(t[m]);else for(f=d.call(t);!(p=f.next()).done;)i(f,h,p.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),i=t(46).getNames,a={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==a.call(t)?s(t):i(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),i=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),i=t(83)("iterator"),a=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||a[i]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),i=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),i=t(11),a=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(a){var o=t["return"];throw void 0!==o&&r(o.call(t)),a}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),i=t(59),a=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:i(1,n)}),a(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),i=t(22),a=t(61),o=t(31),s=t(30),u=t(45),c=t(41),l=t(66),p=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,y,b,x,w){c(n,e,y);var _,k,E=function(t){if(!d&&t in C)return C[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=b==v,A=!1,C=t.prototype,P=C[f]||C[h]||b&&C[b],j=P||E(b);if(P){var T=p(j.call(new t));l(T,S,!0),!r&&s(C,h)&&o(T,f,g),O&&P.name!==v&&(A=!0,j=function(){return P.call(this)})}if(r&&!w||!d&&!A&&C[f]||o(C,f,j),u[e]=j,u[S]=g,b)if(_={values:O?j:E(v),keys:x?j:E(m),entries:O?E("entries"):j},w)for(k in _)k in C||a(C,k,_[k]);else i(i.P+i.F*(d||A),e,_);return _}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),i=!1;try{var a=[7][r]();a["return"]=function(){i=!0},Array.from(a,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){n=!0},a[r]=function(){return o},t(a)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),i=t(78);e.exports=function(t,e){for(var n,a=i(t),o=r.getKeys(a),s=o.length,u=0;s>u;)if(a[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,i,a,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,l=o.Promise,p="process"==t(11)(c),f=function(){var t,e,n;for(p&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;i=void 0,t&&t.enter()};if(p)a=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),a=function(){h.data=d=-d}}else a=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:p&&c.domain};i&&(i.next=e),r||(r=e,a()),i=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),i=t(80),a=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=i})?function(t,e){for(var n=i(t),o=arguments,s=o.length,u=1,c=r.getKeys,l=r.getSymbols,p=r.isEnum;s>u;)for(var f,d=a(o[u++]),h=l?c(d).concat(l(d)):c(d),m=h.length,v=0;m>v;)p.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),i=t(16),a=t(24);e.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),i=t(78),a=r.isEnum;e.exports=function(t){return function(e){for(var n,o=i(e),s=r.getKeys(o),u=s.length,c=0,l=[];u>c;)a.call(o,n=s[c++])&&l.push(t?[n,o[n]]:o[n]);return l}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),i=t(4),a=t(29).Reflect;e.exports=a&&a.ownKeys||function(t){var e=r.getNames(i(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),i=t(33),a=t(2);e.exports=function(){for(var t=a(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,a=this,o=arguments,c=o.length,l=0,p=0;if(!u&&!c)return i(t,n,a);if(r=n.slice(),u)for(;e>l;l++)r[l]===s&&(r[l]=o[p++]);for(;c>p;)r.push(o[p++]);return i(t,r,a)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),i=t(31),a=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(a)||i(n,a,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||i(n,"name",e)),t===r?t[e]=n:(o||delete t[e],i(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[a]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,i=t(38),a=t(4),o=function(t,e){if(a(t),!i(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,i){try{i=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),i(e,[]),n=!(e instanceof Array)}catch(a){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:i(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),i=t(46),a=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];a&&e&&!e[o]&&i.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,i=t(30),a=t(83)("toStringTag");e.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,a)&&r(t,a,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),i="__core-js_shared__",a=r[i]||(r[i]={});e.exports=function(t){return a[t]||(a[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),i=t(2),a=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[a])?e:i(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),i=t(18);e.exports=function(t){return function(e,n){var a,o,s=i(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(a=s.charCodeAt(u),55296>a||a>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):a:t?s.slice(u,u+2):(a-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),i=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return i(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),i=t(73),a=t(18);e.exports=function(t,e,n,o){var s=a(t)+"",u=s.length,c=void 0===n?" ":n+"",l=r(e);if(u>=l)return s;""==c&&(c=" ");var p=l-u,f=i.call(c,Math.ceil(p/c.length));return f.length>p&&(f=f.slice(0,p)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),i=t(18);e.exports=function(t){var e=i(this)+"",n="",a=r(t);if(0>a||a==1/0)throw RangeError("Count can't be negative");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),i=t(18),a=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u="
",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),p=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*a(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=p.trim=function(t,e){return t=i(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(l,"")),t};e.exports=p},{18:18,22:22,24:24}],75:[function(t,e,n){var r,i,a,o=t(17),s=t(33),u=t(32),c=t(20),l=t(29),p=l.process,f=l.setImmediate,d=l.clearImmediate,h=l.MessageChannel,m=0,v={},g="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){y.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(p)?r=function(t){p.nextTick(o(y,t,1))}:h?(i=new h,a=i.port2,i.port1.onmessage=b,r=o(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),i=Math.max,a=Math.min;e.exports=function(t,e){return t=r(t),0>t?i(t+e,0):a(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,i=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?i:r)(t)}},{}],78:[function(t,e,n){var r=t(34),i=t(18);e.exports=function(t){return r(i(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),i=Math.min;e.exports=function(t){return t>0?i(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,i=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+i).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),i=t(82),a=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=a&&a[t]||(a||i)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),i=t(83)("iterator"),a=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[i]||t["@@iterator"]||a[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,i=t(46),a=t(22),o=t(19),s=t(59),u=t(32),c=t(20),l=t(30),p=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),y=t(78),b=t(77),x=t(76),w=t(79),_=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,A=Array.prototype,C=A.slice,P=A.join,j=i.setDesc,T=i.getDesc,M=i.setDescs,L={};o||(r=!d(function(){return 7!=j(c("div"),"a",{get:function(){return 7}}).a}),i.setDesc=function(t,e,n){if(r)try{return j(t,e,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},i.getDesc=function(t,e){if(r)try{return T(t,e)}catch(n){}return l(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},i.setDescs=M=function(t,e){h(t);for(var n,r=i.getKeys(e),a=r.length,o=0;a>o;)i.setDesc(t,n=r[o++],e[n]);return t}),a(a.S+a.F*!o,"Object",{getOwnPropertyDescriptor:i.getDesc,defineProperty:i.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("a;)l(i,r=t[a++])&&(~S(o,r)||o.push(r));return o}},q=function(){};a(a.S,"Object",{getPrototypeOf:i.getProto=i.getProto||function(t){return t=g(t),l(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?O:null},getOwnPropertyNames:i.getNames=i.getNames||I(N,N.length,!0),create:i.create=i.create||function(t,e){var n;return null!==t?(q.prototype=h(t),n=new q,q.prototype=null,n[k]=t):n=D(),void 0===e?n:M(n,e)},keys:i.getKeys=i.getKeys||I(F,R,!1)});var V=function(t,e,n){if(!(e in L)){for(var r=[],i=0;e>i;i++)r[i]="a["+i+"]";L[e]=Function("F,a","return new F("+r.join(",")+")")}return L[e](t,n)};a(a.P,"Function",{bind:function(t){var e=m(this),n=C.call(arguments,1),r=function(){var i=n.concat(C.call(arguments));return this instanceof r?V(e,i.length,i):f(e,i,t)};return v(e.prototype)&&(r.prototype=e.prototype),r}}),a(a.P+a.F*d(function(){u&&C.call(u)}),"Array",{slice:function(t,e){var n=w(this.length),r=p(this);if(e=void 0===e?n:e,"Array"==r)return C.call(this,t,e);for(var i=x(t,n),a=x(e,n),o=w(a-i),s=Array(o),u=0;o>u;u++)s[u]="String"==r?this.charAt(i+u):this[i+u];return s}}),a(a.P+a.F*(_!=Object),"Array",{join:function(t){return P.call(_(this),void 0===t?",":t)}}),a(a.S,"Array",{isArray:t(36)});var U=function(t){return function(e,n){m(e);var r=_(this),i=w(r.length),a=t?i-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(a in r){n=r[a],a+=o;break}if(a+=o,t?0>a:a>=i)throw TypeError("Reduce of empty array with no initial value")}for(;t?a>=0:i>a;a+=o)a in r&&(n=e(n,r[a],a,this));return n}},B=function(t){return function(e){return t(this,e,arguments[1])}};a(a.P,"Array",{forEach:i.each=i.each||B(E(0)),map:B(E(1)),filter:B(E(2)),some:B(E(3)),every:B(E(4)),reduce:U(!1),reduceRight:U(!0),indexOf:B(S),lastIndexOf:function(t,e){var n=y(this),r=w(n.length),i=r-1;for(arguments.length>1&&(i=Math.min(i,b(e))),0>i&&(i=w(r+i));i>=0;i--)if(i in n&&n[i]===t)return i;return-1}}),a(a.S,"Date",{now:function(){return+new Date}});var W=function(t){return t>9?t:"0"+t};a(a.P+a.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),r=0>e?"-":e>9999?"+":"";return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+W(t.getUTCMonth()+1)+"-"+W(t.getUTCDate())+"T"+W(t.getUTCHours())+":"+W(t.getUTCMinutes())+":"+W(t.getUTCSeconds())+"."+(n>99?n:"0"+W(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var r=t(22);r(r.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var r=t(22);r(r.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var r=t(22),i=t(8)(6),a="findIndex",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var r=t(22),i=t(8)(5),a="find",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var r=t(17),i=t(22),a=t(80),o=t(40),s=t(35),u=t(79),c=t(84);i(i.S+i.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,l,p=a(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,y=c(p);if(v&&(m=r(m,h>2?d[2]:void 0,2)),void 0==y||f==Array&&s(y))for(e=u(p.length),n=new f(e);e>g;g++)n[g]=v?m(p[g],g):p[g];else for(l=y.call(p),n=new f;!(i=l.next()).done;g++)n[g]=v?o(l,m,[i.value,g],!0):i.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var r=t(3),i=t(44),a=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,i(1)):"keys"==e?i(0,n):"values"==e?i(0,t[n]):i(0,[n,t[n]])},"values"),a.Arguments=a.Array,r("keys"),r("values"),r("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var r=t(22);r(r.S+r.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,r=new("function"==typeof this?this:Array)(n);n>t;)r[t]=e[t++];return r.length=n,r}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var r=t(46),i=t(38),a=t(83)("hasInstance"),o=Function.prototype;a in o||r.setDesc(o,a,{value:function(t){if("function"!=typeof this||!i(t))return!1;if(!i(this.prototype))return t instanceof this;for(;t=r.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var r=t(46).setDesc,i=t(59),a=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&r(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return a(this,u)||r(this,u,i(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var r=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(this,t);return e&&e.v},set:function(t,e){return r.def(this,0===t?0:t,e)}},r,!0)},{12:12,15:15}],97:[function(t,e,n){var r=t(22),i=t(50),a=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+a(t-1)*a(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?0>t?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=t(22);i(i.S,"Math",{asinh:r})},{22:22}],99:[function(t,e,n){var r=t(22);r(r.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var r=t(22),i=t(51);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var r=t(22);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var r=t(22),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},{22:22}],103:[function(t,e,n){var r=t(22);r(r.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var r=t(22),i=t(51),a=Math.pow,o=a(2,-52),s=a(2,-23),u=a(2,127)*(2-s),c=a(2,-126),l=function(t){return t+1/o-1/o};r(r.S,"Math",{fround:function(t){var e,n,r=Math.abs(t),a=i(t);return c>r?a*l(r/c/s)*c*s:(e=(1+s/o)*r,n=e-(e-r),n>u||n!=n?a*(1/0):a*n)}})},{22:22,51:51}],105:[function(t,e,n){var r=t(22),i=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,a=0,o=0,s=arguments,u=s.length,c=0;u>o;)n=i(s[o++]),n>c?(r=c/n,a=a*r*r+1,c=n):n>0?(r=n/c,a+=r*r):a+=n;return c===1/0?1/0:c*Math.sqrt(a)}})},{22:22}],106:[function(t,e,n){var r=t(22),i=Math.imul;r(r.S+r.F*t(24)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function(t,e){var n=65535,r=+t,i=+e,a=n&r,o=n&i;return 0|a*o+((n&r>>>16)*o+a*(n&i>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var r=t(22);r(r.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var r=t(22);r(r.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var r=t(22);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var r=t(22);r(r.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S+r.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(a(t-1)-a(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S,"Math",{tanh:function(t){var e=i(t=+t),n=i(-t);return e==1/0?1:n==1/0?-1:(e-n)/(a(t)+a(-t))}})},{22:22,49:49}],113:[function(t,e,n){var r=t(22);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var r=t(46),i=t(29),a=t(30),o=t(11),s=t(81),u=t(24),c=t(74).trim,l="Number",p=i[l],f=p,d=p.prototype,h=o(r.create(d))==l,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():c(e,3);var n,r,i,a=e.charCodeAt(0);if(43===a||45===a){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===a){switch(e.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+e}for(var o,u=e.slice(2),l=0,p=u.length;p>l;l++)if(o=u.charCodeAt(l),48>o||o>i)return NaN;return parseInt(u,r)}}return+e};p(" 0o1")&&p("0b1")&&!p("+0x1")||(p=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof p&&(h?u(function(){d.valueOf.call(n)}):o(n)!=l)?new f(v(e)):v(e)},r.each.call(t(19)?r.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){a(f,t)&&!a(p,t)&&r.setDesc(p,t,r.getDesc(f,t))}),p.prototype=d,d.constructor=p,t(61)(i,l,p))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var r=t(22);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var r=t(22),i=t(29).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},{22:22,29:29}],117:[function(t,e,n){var r=t(22);r(r.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var r=t(22);r(r.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var r=t(22),i=t(37),a=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&a(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var r=t(22);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var r=t(22);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var r=t(22);r(r.S+r.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var r=t(38);t(54)("freeze",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var r=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(r(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var r=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],129:[function(t,e,n){var r=t(38);t(54)("isExtensible",function(t){return function(e){return r(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var r=t(38);t(54)("isFrozen",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var r=t(38);t(54)("isSealed",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var r=t(22);r(r.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var r=t(80);t(54)("keys",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],134:[function(t,e,n){var r=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var r=t(38);t(54)("seal",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var r=t(22);r(r.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var r=t(10),i={};i[t(83)("toStringTag")]="z",i+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var r,i=t(46),a=t(48),o=t(29),s=t(17),u=t(10),c=t(22),l=t(38),p=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),y=t(68),b=t(52),x="Promise",w=o.process,_="process"==u(w),k=o[x],E=function(t){var e=new k(function(){});return t&&(e.constructor=Object),k.resolve(e)===e},S=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&E(),m(e,k),e.prototype=i.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var r=!1;k.resolve(i.setDesc({},"then",{get:function(){r=!0}})),n=r}}catch(a){n=!1}return n}(),O=function(t,e){return a&&t===k&&e===r?!0:v(t,e)},A=function(t){var e=p(t)[g];return void 0!=e?e:t},C=function(t){var e;return l(t)&&"function"==typeof(e=t.then)?e:!1},P=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=f(e),this.reject=f(n)},j=function(t){try{t()}catch(e){return{error:e}}},T=function(t,e){if(!t.n){t.n=!0;var n=t.c;b(function(){for(var r=t.v,i=1==t.s,a=0,s=function(e){var n,a,o=i?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(i||(t.h=!0),n=o===!0?r:o(r),n===e.promise?u(TypeError("Promise-chain cycle")):(a=C(n))?a.call(n,s,u):s(n)):u(r)}catch(c){u(c)}};n.length>a;)s(n[a++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,i=t.p;M(i)&&(_?w.emit("unhandledRejection",r,i):(e=o.onunhandledrejection)?e({promise:i,reason:r}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",r)),t.a=void 0},1)})}},M=function(t){var e,n=t._d,r=n.a||n.c,i=0;if(n.h)return!1;for(;r.length>i;)if(e=r[i++],e.fail||!M(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),T(e,!0))},F=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=C(t))?b(function(){var r={r:n,d:!1};try{e.call(t,s(F,r,1),s(L,r,1))}catch(i){L.call(r,i)}}):(n.v=t,n.s=1,T(n,!1))}catch(r){L.call({r:n,d:!1},r)}}};S||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(F,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new P(y(this,k)),r=n.promise,i=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,i.c.push(n),i.a&&i.a.push(n),i.s&&T(i,!1),r},"catch":function(t){return this.then(void 0,t)}})),c(c.G+c.W+c.F*!S,{Promise:k}),t(66)(k,x),t(65)(x),r=t(16)[x],c(c.S+c.F*!S,x,{reject:function(t){var e=new P(this),n=e.reject;return n(t),e.promise}}),c(c.S+c.F*(!S||E(!0)),x,{resolve:function(t){if(t instanceof k&&O(t.constructor,this))return t;var e=new P(this),n=e.resolve;return n(t),e.promise}}),c(c.S+c.F*!(S&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new P(e),r=n.resolve,a=n.reject,o=[],s=j(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?i.each.call(o,function(t,i){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[i]=t,--n||r(s))},a)}):r(s)});return s&&a(s.error),n.promise},race:function(t){var e=A(this),n=new P(e),r=n.reject,i=j(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var r=t(22),i=Function.apply;r(r.S,"Reflect",{apply:function(t,e,n){return i.call(t,e,n)}})},{22:22}],140:[function(t,e,n){var r=t(46),i=t(22),a=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;i(i.S+i.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){a(t);var n=arguments.length<3?t:a(arguments[2]);if(t==n){if(void 0!=e)switch(o(e).length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var i=[null];return i.push.apply(i,e),new(u.apply(t,i))}var c=n.prototype,l=r.create(s(c)?c:Object.prototype),p=Function.apply.call(t,l,e);return s(p)?p:l}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S+i.F*t(24)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){a(t);try{return r.setDesc(t,e,n),!0}catch(i){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var r=t(22),i=t(46).getDesc,a=t(4);r(r.S,"Reflect",{deleteProperty:function(t,e){var n=i(a(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var r=t(22),i=t(4),a=function(t){this._t=i(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(a,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),r(r.S,"Reflect",{enumerate:function(t){return new a(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.getDesc(a(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var r=t(22),i=t(46).getProto,a=t(4);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(a(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function r(t,e){var n,o,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=i.getDesc(t,e))?a(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:s(o=i.getProto(t))?r(o,e,c):void 0}var i=t(46),a=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:r})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var r=t(22),i=t(4),a=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),a?a(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var r=t(22),i=t(4),a=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return a&&a(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var r=t(22),i=t(64);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function r(t,e,n){var o,l,p=arguments.length<4?t:arguments[3],f=i.getDesc(u(t),e);if(!f){if(c(l=i.getProto(t)))return r(l,e,n,p);f=s(0)}return a(f,"value")?f.writable!==!1&&c(p)?(o=i.getDesc(p,e)||s(0),o.value=n,i.setDesc(p,e,o),!0):!1:void 0===f.set?!1:(f.set.call(p,n),!0)}var i=t(46),a=t(30),o=t(22),s=t(59),u=t(4),c=t(38);o(o.S,"Reflect",{set:r})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var r=t(46),i=t(29),a=t(39),o=t(26),s=i.RegExp,u=s,c=s.prototype,l=/a/g,p=/a/g,f=new s(l)!==l;!t(19)||f&&!t(24)(function(){return p[t(83)("match")]=!1,s(l)!=l||s(p)==p||"/a/i"!=s(l,"i")})||(s=function(t,e){var n=a(t),r=void 0===e;return this instanceof s||!n||t.constructor!==s||!r?f?new u(n&&!r?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&r?o.call(t):e):t},r.each.call(r.getNames(u),function(t){t in s||r.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),c.constructor=s,s.prototype=c,t(61)(i,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var r=t(46);t(19)&&"g"!=/./g.flags&&r.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],159:[function(t,e,n){"use strict";var r=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t=0===t?0:t,t)}},r)},{12:12,15:15}],160:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="endsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{endsWith:function(t){var e=a(this,t,o),n=arguments,r=n.length>1?n[1]:void 0,u=i(e.length),c=void 0===r?u:Math.min(i(r),u),l=t+"";return s?s.call(e,l,c):e.slice(c-l.length,c)===l}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var r=t(22),i=t(76),a=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments,o=r.length,s=0;o>s;){if(e=+r[s++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?a(e):a(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var r=t(22),i=t(71),a="includes";r(r.P+r.F*t(23)(a),"String",{includes:function(t){return!!~i(this,t,a).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var r=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var r=t(22),i=t(78),a=t(79);r(r.S,"String",{raw:function(t){for(var e=i(t.raw),n=a(e.length),r=arguments,o=r.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(r[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var r=t(22);r(r.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="startsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{startsWith:function(t){var e=a(this,t,o),n=arguments,r=i(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,r):e.slice(r,r+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var r=t(46),i=t(29),a=t(30),o=t(19),s=t(22),u=t(61),c=t(24),l=t(67),p=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),y=t(4),b=t(78),x=t(59),w=r.getDesc,_=r.setDesc,k=r.create,E=m.get,S=i.Symbol,O=i.JSON,A=O&&O.stringify,C=!1,P=d("_hidden"),j=r.isEnum,T=l("symbol-registry"),M=l("symbols"),L="function"==typeof S,F=Object.prototype,N=o&&c(function(){return 7!=k(_({},"a",{get:function(){return _(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=w(F,e);r&&delete F[e],_(t,e,n),r&&t!==F&&_(F,e,r)}:_,R=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&C&&N(F,t,{configurable:!0,set:function(e){a(this,P)&&a(this[P],t)&&(this[P][t]=!1),N(this,t,x(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&a(M,e)?(n.enumerable?(a(t,P)&&t[P][e]&&(t[P][e]=!1),n=k(n,{enumerable:x(0,!1)})):(a(t,P)||_(t,P,x(1,{})),t[P][e]=!0),N(t,e,n)):_(t,e,n)},q=function(t,e){y(t);for(var n,r=v(e=b(e)),i=0,a=r.length;a>i;)I(t,n=r[i++],e[n]);return t},V=function(t,e){return void 0===e?k(t):q(k(t),e)},U=function(t){var e=j.call(this,t);return e||!a(this,t)||!a(M,t)||a(this,P)&&this[P][t]?e:!0},B=function(t,e){var n=w(t=b(t),e);return!n||!a(M,e)||a(t,P)&&t[P][e]||(n.enumerable=!0),n},W=function(t){for(var e,n=E(b(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])||e==P||r.push(e);return r},z=function(t){for(var e,n=E(b(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])&&r.push(M[e]);return r},H=function(t){if(void 0!==t&&!D(t)){for(var e,n,r=[t],i=1,a=arguments;a.length>i;)r.push(a[i++]);return e=r[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),r[1]=e,A.apply(O,r)}},G=c(function(){var t=S();return"[null]"!=A([t])||"{}"!=A({a:t})||"{}"!=A(Object(t))});L||(S=function(){if(D(this))throw TypeError("Symbol is not a constructor");return R(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof S},r.create=V,r.isEnum=U,r.getDesc=B,r.setDesc=I,r.setDescs=q,r.getNames=m.get=W,r.getSymbols=z,o&&!t(48)&&u(F,"propertyIsEnumerable",U,!0));var K={"for":function(t){return a(T,t+="")?T[t]:T[t]=S(t)},keyFor:function(t){return h(T,t)},useSetter:function(){C=!0},useSimple:function(){C=!1}};r.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:R(e)}),C=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:V,defineProperty:I,defineProperties:q,getOwnPropertyDescriptor:B,getOwnPropertyNames:W,getOwnPropertySymbols:z}),O&&s(s.S+s.F*(!L||G),"JSON",{stringify:H}),p(S,"Symbol"),p(Math,"Math",!0),p(i.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var r=t(46),i=t(61),a=t(14),o=t(38),s=t(30),u=a.frozenStore,c=a.WEAK,l=Object.isExtensible||o,p={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!l(t))return u(this).get(t);if(s(t,c))return t[c][this._i]}},set:function(t,e){return a.def(this,t,e)}},a,!0,!0);7!=(new f).set((Object.freeze||Object)(p),7).get(p)&&r.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];i(e,t,function(e,r){if(o(e)&&!l(e)){var i=u(this)[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var r=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t,!0)}},r,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var r=t(22),i=t(7)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var r=t(22);r(r.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var r=t(22),i=t(55)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},{22:22,55:55}],175:[function(t,e,n){var r=t(46),i=t(22),a=t(56),o=t(78),s=t(59);i(i.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,i=o(t),u=r.setDesc,c=r.getDesc,l=a(i),p={},f=0;l.length>f;)n=c(i,e=l[f++]),e in p?u(p,e,s(0,n)):p[e]=n;return p}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var r=t(22),i=t(55)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},{22:22,55:55}],177:[function(t,e,n){var r=t(22),i=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return i(t)}})},{22:22,62:62}],178:[function(t,e,n){var r=t(22);r(r.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!0);r(r.P,"String",{at:function(t){return i(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padLeft:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padRight:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var r=t(46),i=t(22),a=t(17),o=t(16).Array||Array,s={},u=function(t,e){r.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=a(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),i(i.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var r=t(29),i=t(31),a=t(45),o=t(83)("iterator"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,l=u&&u.prototype,p=a.NodeList=a.HTMLCollection=a.Array;c&&!c[o]&&i(c,o,p),l&&!l[o]&&i(l,o,p)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var r=t(22),i=t(75);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},{22:22,75:75}],187:[function(t,e,n){var r=t(29),i=t(22),a=t(33),o=t(57),s=r.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),c=function(t){return u?function(e,n){return t(a(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};i(i.G+i.B+i.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function r(t,e,n,r){var i=Object.create((e||a).prototype),o=new h(r||[]);return i._invoke=p(t,n,o),i}function i(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(r){return{type:"throw",arg:r}}}function a(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function l(e){function n(t,n){var r=e[t](n),i=r.value;return i instanceof c?Promise.resolve(i.arg).then(a,o):Promise.resolve(i).then(function(t){return r.value=t,r})}function r(t,e){function r(){return n(t,e)}return i=i?i.then(r,r):new Promise(function(t){t(r())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var i,a=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=r}function p(t,e,n){var r=_;return function(a,o){if(r===E)throw Error("Generator is already running");if(r===S){if("throw"===a)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===a||"throw"===a&&s.iterator[a]===g){n.delegate=null;var u=s.iterator["return"];if(u){var c=i(u,s.iterator,o);if("throw"===c.type){a="throw",o=c.arg;continue}}if("return"===a)continue}var c=i(s.iterator[a],s.iterator,o);if("throw"===c.type){n.delegate=null,a="throw",o=c.arg;continue}a="next",o=g;var l=c.arg;if(!l.done)return r=k,l;n[s.resultName]=l.value,n.next=s.nextLoc,n.delegate=null}if("next"===a)n._sent=o,r===k?n.sent=o:n.sent=g;else if("throw"===a){if(r===_)throw r=S,o;n.dispatchException(o)&&(a="next",o=g)}else"return"===a&&n.abrupt("return",o);r=E;var c=i(t,e,n);if("normal"===c.type){r=n.done?S:k;var l={value:c.arg,done:n.done};if(c.arg!==O)return l;n.delegate&&"next"===a&&(o=g)}else"throw"===c.type&&(r=S,a="throw",o=c.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[b];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function i(){for(;++n=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=y.call(i,"catchLoc"),s=y.call(i,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&y.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;d(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return l.createDocumentFragment()}function n(t){return l.createElement(t)}function r(t){if(1===t.length)return i(t[0]);for(var n=e(),r=q.call(t),a=0;a-1}}([].indexOf||function(t){for(V=this.length;V--&&this[V]!==t;);return V}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(a):document.fonts.load(c(a,a.family),s).then(function(e){1<=e.length?t(a):setTimeout(f,25)},function(){e(a)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=y||-1!=g&&-1!=y)&&((e=v!=g&&v!=y&&g!=y)||(null===p&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),p=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=p&&(v==b&&g==b&&y==b||v==x&&g==x&&y==x||v==w&&g==w&&y==w)),e=!e),e&&(null!==_.parentNode&&_.parentNode.removeChild(_),clearTimeout(k),t(a))}function f(){if((new Date).getTime()-l>=u)null!==_.parentNode&&_.parentNode.removeChild(_),e(a);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,y=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new r(s),h=new r(s),m=new r(s),v=-1,g=-1,y=-1,b=-1,x=-1,w=-1,_=document.createElement("div"),k=0;_.dir="ltr",i(d,c(a,"sans-serif")),i(h,c(a,"serif")),i(m,c(a,"monospace")),_.appendChild(d.a),_.appendChild(h.a),_.appendChild(m.a),document.body.appendChild(_),b=d.a.offsetWidth,x=h.a.offsetWidth,w=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),i(d,c(a,'"'+a.family+'",sans-serif')),o(h,function(t){g=t,n()}),i(h,c(a,'"'+a.family+'",serif')),o(m,function(t){y=t,n()}),i(m,c(a,'"'+a.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function i(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function a(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,l(e)}function o(t){var e=b[t[g]];return e||(e={},y++,t[g]=y,b[y]=e),e}function s(t,e,r){if(e||(e=n),f)return e.createElement(t);r||(r=o(e));var i;return i=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!i.canHaveChildren||m.test(t)||i.tagUrn?i:r.frag.appendChild(i)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),a=0,s=i(),u=s.length;u>a;a++)r.createElement(s[a]);return r}function c(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function l(t){t||(t=n);var e=o(t);return!x.shivCSS||p||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||c(t,e),t}var p,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",y=0,b={};!function(){try{var t=n.createElement("a");t.innerHTML="",p="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){p=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:l,createElement:s,createDocumentFragment:u,addElements:a};t.html5=x,l(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,r){for(var a,o=n.slice(),s=i(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return a=!s.stoppedPropagation,r&&a&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var i=y(e||t,r);v(t,"textContent",n(function(){return i.get.call(this)},function(t){i.set.call(this,t)}))}function i(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function a(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var p=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var r in n)if(b.call(n,r))try{v(e,r,n[r])}catch(i){t.console&&console.log(r+" failed on object:",e,i.message)}},y=Object.getOwnPropertyDescriptor,b=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,_=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),O=document.documentElement,A=O.removeAttribute,C=O.setAttribute;r(t.HTMLCommentElement.prototype,x,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(w,null,"nodeValue"),r(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(y(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,r){if("function"==typeof n||"object"==typeof n){var i,o,u=this,c="on"+t,p=u[m]||v(u,m,{value:{}})[m],f=p[c]||(p[c]={}),d=f.h||(f.h=[]);if(!b.call(f,"w")){if(f.w=function(t){return t[m]||e(u,l(u,t),d,!1)},!b.call(E,c))if(_.test(t)){try{i=document.createEventObject(),i[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(c))&&A.call(u,c)),u.fireEvent(c,i),E[c]=!0}catch(i){for(E[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&C.call(u,c,o)}else E[c]=!1;(f.n=E[c])&&u.attachEvent(c,f.w)}a(d,n)<0&&d[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,r=this,i="on"+t.type,a=r[m],o=a&&a[i],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(i,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var r=this,i="on"+t,o=r[m],s=o&&o[i],u=s&&s.h,c=u?a(u,e):-1;c>-1&&u.splice(c,1)}}}}),g(w,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,i="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[i]||(o[i]={}),u=s.h||(s.h=[]);a(u,e)<0&&(r[i]||(r[i]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,i=n[m],a=i&&i[r],o=!!a;return o&&(a.n?n.fireEvent(r,t):e(n,t,a.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var i=this;x.addEventListener.call(i,e,n,r),p&&e===h&&!k.test(i.readyState)&&(p=!1,i.attachEvent(d,u),t==top&&!function a(t){try{i.documentElement.doScroll("left"),u()}catch(e){setTimeout(a,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,r=/^(top|right|bottom|left)$/,i=/\-([a-z])/g,a=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,l=u.currentStyle,p=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(i,a),e=l?l[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=p&&p.left,s&&(p.left=l.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(p.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,i){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,l(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),a(o,r)<0&&o[i?"unshift":"push"](r)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,r){var i="on"+e,o=(t[i]||Object)[m],s=o?a(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var p=1;s-1>=p;p++)a.push((0,c.times)(r,(0,c.minus)(n[p],n[p-1])));for(var f=[(0,c.plus)(n[0],l(a[0],a[1]))],p=1;s-2>=p;p++)f.push((0,c.minus)(n[p],(0,c.average)([a[p],a[p-1]])));f.push((0,c.minus)(n[s-1],l(a[s-2],a[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,i(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,c.range)(2,s).reduce(function(t,e){var r=f[e],i=n[e];return t.smoothcurveto(r[0],r[1],i[0],i[1])},g),centroid:(0,c.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var i=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),a=t(197),o=r(a),s=t(198),u=1e-5,c=function(t,e){var n=t.map(e),r=n.sort(function(t,e){var n=i(t,2),r=n[0],a=(n[1],i(e,2)),o=a[0];a[1];return r-o}),a=r.length,o=r[0][0],c=r[a-1][0],l=(0,s.minBy)(r,function(t){return t[1]}),p=(0,s.maxBy)(r,function(t){return t[1]});return o==c&&(c+=u),l==p&&(p+=u),{points:r,xmin:o,xmax:c,ymin:l,ymax:p}};n["default"]=function(t){var e=t.data,n=t.xaccessor,r=t.yaccessor,a=t.width,u=t.height,l=t.closed,p=t.min,f=t.max;n||(n=function(t){var e=i(t,2),n=e[0];e[1];return n}),r||(r=function(t){var e=i(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),r(t)]},h=e.map(function(t){return c(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==p?(0,s.minBy)(h,function(t){return t.ymin}):p,y=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;l&&(g=Math.min(g,0),y=Math.max(y,0));var b=l?0:g,x=(0,o["default"])([m,v],[0,a]),w=(0,o["default"])([g,y],[u,0]),_=function(t){var e=i(t,2),n=e[0],r=e[1];return[x(n),w(r)]};return{arranged:h,scale:_,xscale:x,yscale:w,base:b}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function a(t,e){var n=r(t,2),i=n[0],o=n[1],s=r(e,2),u=s[0],c=s[1],l=function(t){return u+(c-u)*(t-i)/(o-i)};return l.inverse=function(){return a([u,c],[i,o])},l};n["default"]=i,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function(t){return t.reduce(function(t,e){return t+e},0)},a=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},c=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},l=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i+s,a+u]},p=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i-s,a-u]},f=function(t,e){var n=r(e,2),i=n[0],a=n[1];return[t*i,t*a]},d=function(t){var e=r(t,2),n=e[0],i=e[1];return Math.sqrt(n*n+i*i)},h=function(t){return t.reduce(l,[0,0])},m=function(t){return f(1/t.length,t.reduce(l))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var r in n){var i=n[r];e[r]=i(e.index,e.item,e.group)}return e},y=function(t,e,n){for(var r=[],i=t;e>i;i++)r.push(i);return n&&r.push(e),r},b=function(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,c=t[u];n.push(e(u,c))}}catch(l){i=!0,a=l}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return n},x=function(t){return b(t,function(t,e){return[t,e]})},w=function(t){return t};n.sum=i,n.min=a,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=c,n.plus=l,n.minus=p,n.times=f,n.id=w,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=y,n.mapObject=b,n.pairs=x,n["default"]={sum:i,min:a,max:o,sumBy:s,minBy:u,maxBy:c,plus:l,minus:p,times:f,id:w,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:y,mapObject:b,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function a(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},i=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return i===s&&a===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,r=n.map(function(t){return s(t,6)});return e+" "+r.join(" ")},c=function(t,e){var n=t.command,i=t.params,a=r(e,2),o=a[0],s=a[1];switch(n){case"M":return[i[0],i[1]];case"L":return[i[0],i[1]];case"H":return[i[0],s];case"V":return[o,i[0]];case"Z":return null;case"C":return[i[4],i[5]];case"S":return[i[2],i[3]];case"Q":return[i[2],i[3]];case"T":return[i[0],i[1]];case"A":return[i[5],i[6]]}},l=function(t,e){return function(n){var r="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,r)}},p=function(t){return a(n(e,t))};return{moveto:l(["x","y"],function(t,e){return p({command:"M",params:[t,e]})}),lineto:l(["x","y"],function(t,e){return p({command:"L",params:[t,e]})}),hlineto:l(["x"],function(t){return p({command:"H",params:[t]})}),vlineto:l(["y"],function(t){return p({command:"V",params:[t]})}),closepath:function(){return p({command:"Z",params:[]})},curveto:l(["x1","y1","x2","y2","x","y"],function(t,e,n,r,i,a){return p({command:"C",params:[t,e,n,r,i,a]})}),smoothcurveto:l(["x2","y2","x","y"],function(t,e,n,r){return p({command:"S",params:[t,e,n,r]})}),qcurveto:l(["x1","y1","x","y"],function(t,e,n,r){return p({command:"Q",params:[t,e,n,r]})}),smoothqcurveto:l(["x","y"],function(t,e){return p({command:"T",params:[t,e]})}),arc:l(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,r,i,a,o){return p({command:"A",params:[t,e,n,r,i,a,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,l=c(u,n);n=l,l&&t.push(l)}}catch(p){i=!0,a=p}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],r=t.points()[0],o=t.instructions().slice(1);return i(n,r)||o.unshift({command:"L",params:r}),a(this.instructions().concat(o))}}};n["default"]=function(){return i()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var i,a;a=n.shift();)for(i in a)Mo.call(a,i)&&(t[i]=a[i]);return t}function i(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function a(t){return"[object Array]"===Lo.call(t)}function o(t){return Fo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function c(t){return t&&"[object Object]"===Lo.call(t)}function l(t,e){return t.replace(/%s/g,function(){return e.shift()})}function p(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];throw t=l(t,n),Error(t)}function f(){Mv.DEBUG&&Po.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),jo(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),No[t]||(No[t]=!0,jo(t,n))}function m(){Mv.DEBUG&&d.apply(null,arguments)}function v(){Mv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var r=y(t,e,n);return r?r[t][n]:null}function y(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function b(t){return function(){return t}}function x(t){var e,n,r,i,a,o;for(e=t.split("."),(n=zo[e.length])||(n=w(e.length)),a=[],r=function(t,n){return t?"*":e[n]},i=n.length;i--;)o=n[i].map(r).join("."),a.hasOwnProperty(o)||(a.push(o),a[o]=!0);return a}function w(t){var e,n,r,i,a,o,s,u,c="";if(!zo[t]){for(r=[];c.length=a;a+=1){for(n=a.toString(2);n.lengtho;o++)u.push(i(n[o]));r[a]=u}zo[t]=r}return zo[t]}function _(t,e,n,r){var i=t[e];if(!i||!i.equalsOrStartsWith(r)&&i.equalsOrStartsWith(n))return t[e]=i?i.replace(n,r):r,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new $o(t)),Ko[t])}function S(t,e){function n(e,n){var r,i,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],i=r?r.get():t.viewmodel.get(n),o=i?Object.keys(i):null),o&&o.forEach(function(t){"_ractive"===t&&a(i)||e.push(n.join(t))}),e}var r,i,o;for(r=e.str.split("."),o=[Yo];i=r.shift();)"*"===i?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(i):o=o.map(O(i));return o}function O(t){return function(e){return e.join(t)}}function A(t){return t?t.replace(Ho,".$1"):""}function C(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,i=void 0;if(/\*/.test(e))return i={},S(t,E(A(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Xo);i[e.str]=r+n}),t.set(i);if(r=t.get(e),!u(r))throw Error(Xo);return t.set(e,+r+n)}function P(t,e){return Jo(this,t,void 0===e?1:+e)}function j(t){this.event=t,this.method="on"+t,this.deprecate=rs[t]}function T(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!a(t)||!a(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function F(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function R(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function q(t,e){return function(){for(var n;n=t.shift();)n(e)}}function V(t,e,n,r){var i;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");
-if(e instanceof is)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{i=e.then}catch(a){return void r(a)}if("function"==typeof i){var o,s,u;s=function(e){o||(o=!0,V(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{i.call(e,s,u)}catch(a){if(!o)return r(a),void(o=!0)}}else n(e)}}function U(t,e,n){var r;return e=A(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),z(t,r.firstKey,n)):"."===e[0]?(r=B(ls(n),e),r&&z(t,r.firstKey,n)):r=W(t,E(e),n),r}function B(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function W(t,e,n,r){var i,a,o,s,u;if(e.isRoot)return e;for(a=e.firstKey;n;)if(i=n.context,n=n.parent,i&&(s=!0,o=t.viewmodel.get(i),o&&("object"==typeof o||"function"==typeof o)&&a in o))return i.join(e.str);return H(t.viewmodel,a)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,a=E(a),u=W(t.parent,a,n,!0))?(t.viewmodel.map(a,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||H(t.viewmodel,e)||(e=E(e),(n=W(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function H(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function G(t){t.teardown()}function K(t){t.unbind()}function $(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;a--)i=t._subs[e[a]],i&&(s=gt(t,i,n,r)&&s);if(Ws.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,r)}}function gt(t,e,n,r){var i=null,a=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(a=!0);return n&&!n._noArg&&a&&(i=n.original)&&(i.preventDefault&&i.preventDefault(),i.stopPropagation&&i.stopPropagation()),!a}function yt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function bt(t){var e;return t=E(A(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ps(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,wt(this)}function wt(t){Qs.fire(t),t.findAllComponents("*").forEach(function(t){wt(t.instance)})}function _t(t,e,n){var r,i;return t=E(A(t)),r=this.viewmodel.get(t),a(r)&&a(e)?(i=ys.start(this,!0),this.viewmodel.merge(t,r,e,n),ys.end(),i):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=S(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var i,a,o;e=E(A(e)),r=r||lu,e.isPattern?(i=new uu(t,e,n,r),t.viewmodel.patternObservers.push(i),a=!0):i=new Zs(t,e,n,r),i.init(r.init),t.viewmodel.register(e,i,a?"patternObservers":"observers"),i.ready=!0;var s={cancel:function(){var n;o||(a?(n=t.viewmodel.patternObservers.indexOf(i),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,i,"patternObservers")):t.viewmodel.unregister(e,i,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var r,i,a,o;if(c(t)){n=e,i=t,r=[];for(t in i)i.hasOwnProperty(t)&&(e=i[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",cu(this,t,e,n);if(a=t.split(" "),1===a.length)return cu(this,t,e,n);for(r=[],o=a.length;o--;)t=a[o],t&&r.push(cu(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ot(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function At(t,e){var n,r=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,i;(n=r._subs[t])&&(e?(i=n.indexOf(e),-1!==i&&n.splice(i,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function Ct(t,e){var n,r,i,a=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return i=t.split(" ").map(du).filter(hu),i.forEach(function(t){(a._subs[t]||(a._subs[t]=[])).push(e)}),{cancel:function(){return a.off(t,e)}}}function Pt(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function jt(t,e,n){var r,i,a,o,s,u,c=[];if(r=Tt(t,e,n),!r)return null;for(i=t.length,s=r.length-2-r[1],a=Math.min(i,r[0]),o=a+r[1],u=0;a>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;i>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function Tt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var r,i,a,o=this;if(a=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=ys.start(this,!0),ys.scheduleTask(function(){return Tu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Pu.apply(),e&&((i=e.__ractive_instances__)?i.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),ys.end(),this.transitionsEnabled=a,r.then(function(){return Mu.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(G)}function Ft(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Nt(t,e){var n,r,i;return r='[data-ractive-css~="{'+e+'}"]',i=function(t){var e,n,i,a,o,s,u,c=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(a=e.map(Dt),u=e.length;u--;)s=a.slice(),i=e[u],s[u]=i.base+r+i.modifiers||"",o=a.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=Vu.test(t)?t.replace(Vu,r):t.replace(Du,"").replace(Ru,function(t,e){var n,r;return qu.test(e)?t:(n=e.split(",").map(Rt),r=n.map(i).join(", ")+" ",t.replace(e,r))})}function Rt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?p("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function qt(t,e){It(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var i=r?Vt(e,this):e,a=n?Vt(t,this):t;return Ut(i,a)}:Ut(e,t)}function Vt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&p("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Ut(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Bt(t){var e=Eo($u);return e.parse=function(e,n){return Wt(e,n||t)},e}function Wt(t,e){if(!Gu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Gu(t,e||this.options)}function zt(t,e){var n;if(!Xa){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Ht(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a a;)l(i,r=t[a++])&&(~S(o,r)||o.push(r));return o}},B=function(){};a(a.S,"Object",{getPrototypeOf:i.getProto=i.getProto||function(t){return t=g(t),l(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?O:null},getOwnPropertyNames:i.getNames=i.getNames||I(N,N.length,!0),create:i.create=i.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=D(),void 0===e?n:M(n,e)},keys:i.getKeys=i.getKeys||I(F,R,!1)});var q=function(t,e,n){if(!(e in L)){for(var r=[],i=0;e>i;i++)r[i]="a["+i+"]";L[e]=Function("F,a","return new F("+r.join(",")+")")}return L[e](t,n)};a(a.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),r=function(){var i=n.concat(A.call(arguments));return this instanceof r?q(e,i.length,i):f(e,i,t)};return v(e.prototype)&&(r.prototype=e.prototype),r}}),a(a.P+a.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=w(this.length),r=p(this);if(e=void 0===e?n:e,"Array"==r)return A.call(this,t,e);for(var i=x(t,n),a=x(e,n),o=w(a-i),s=Array(o),u=0;o>u;u++)s[u]="String"==r?this.charAt(i+u):this[i+u];return s}}),a(a.P+a.F*(_!=Object),"Array",{join:function(t){return P.call(_(this),void 0===t?",":t)}}),a(a.S,"Array",{isArray:t(36)});var V=function(t){return function(e,n){m(e);var r=_(this),i=w(r.length),a=t?i-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(a in r){n=r[a],a+=o;break}if(a+=o,t?0>a:a>=i)throw TypeError("Reduce of empty array with no initial value")}for(;t?a>=0:i>a;a+=o)a in r&&(n=e(n,r[a],a,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};a(a.P,"Array",{forEach:i.each=i.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:V(!1),reduceRight:V(!0),indexOf:U(S),lastIndexOf:function(t,e){var n=y(this),r=w(n.length),i=r-1;for(arguments.length>1&&(i=Math.min(i,b(e))),0>i&&(i=w(r+i));i>=0;i--)if(i in n&&n[i]===t)return i;return-1}}),a(a.S,"Date",{now:function(){return+new Date}});var z=function(t){return t>9?t:"0"+t};a(a.P+a.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),r=0>e?"-":e>9999?"+":"";return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+z(t.getUTCMonth()+1)+"-"+z(t.getUTCDate())+"T"+z(t.getUTCHours())+":"+z(t.getUTCMinutes())+":"+z(t.getUTCSeconds())+"."+(n>99?n:"0"+z(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var r=t(22);r(r.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var r=t(22);r(r.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var r=t(22),i=t(8)(6),a="findIndex",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var r=t(22),i=t(8)(5),a="find",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var r=t(17),i=t(22),a=t(80),o=t(40),s=t(35),u=t(79),c=t(84);i(i.S+i.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,l,p=a(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,y=c(p);if(v&&(m=r(m,h>2?d[2]:void 0,2)),void 0==y||f==Array&&s(y))for(e=u(p.length),n=new f(e);e>g;g++)n[g]=v?m(p[g],g):p[g];else for(l=y.call(p),n=new f;!(i=l.next()).done;g++)n[g]=v?o(l,m,[i.value,g],!0):i.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var r=t(3),i=t(44),a=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,i(1)):"keys"==e?i(0,n):"values"==e?i(0,t[n]):i(0,[n,t[n]])},"values"),a.Arguments=a.Array,r("keys"),r("values"),r("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var r=t(22);r(r.S+r.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,r=new("function"==typeof this?this:Array)(n);n>t;)r[t]=e[t++];return r.length=n,r}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var r=t(46),i=t(38),a=t(83)("hasInstance"),o=Function.prototype;a in o||r.setDesc(o,a,{value:function(t){if("function"!=typeof this||!i(t))return!1;if(!i(this.prototype))return t instanceof this;for(;t=r.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var r=t(46).setDesc,i=t(59),a=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&r(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return a(this,u)||r(this,u,i(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var r=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(this,t);return e&&e.v},set:function(t,e){return r.def(this,0===t?0:t,e)}},r,!0)},{12:12,15:15}],97:[function(t,e,n){var r=t(22),i=t(50),a=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+a(t-1)*a(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?0>t?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=t(22);i(i.S,"Math",{asinh:r})},{22:22}],99:[function(t,e,n){var r=t(22);r(r.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var r=t(22),i=t(51);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var r=t(22);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var r=t(22),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},{22:22}],103:[function(t,e,n){var r=t(22);r(r.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var r=t(22),i=t(51),a=Math.pow,o=a(2,-52),s=a(2,-23),u=a(2,127)*(2-s),c=a(2,-126),l=function(t){return t+1/o-1/o};r(r.S,"Math",{fround:function(t){var e,n,r=Math.abs(t),a=i(t);return c>r?a*l(r/c/s)*c*s:(e=(1+s/o)*r,n=e-(e-r),n>u||n!=n?a*(1/0):a*n)}})},{22:22,51:51}],105:[function(t,e,n){var r=t(22),i=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,a=0,o=0,s=arguments,u=s.length,c=0;u>o;)n=i(s[o++]),n>c?(r=c/n,a=a*r*r+1,c=n):n>0?(r=n/c,a+=r*r):a+=n;return c===1/0?1/0:c*Math.sqrt(a)}})},{22:22}],106:[function(t,e,n){var r=t(22),i=Math.imul;r(r.S+r.F*t(24)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function(t,e){var n=65535,r=+t,i=+e,a=n&r,o=n&i;return 0|a*o+((n&r>>>16)*o+a*(n&i>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var r=t(22);r(r.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var r=t(22);r(r.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var r=t(22);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var r=t(22);r(r.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S+r.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(a(t-1)-a(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S,"Math",{tanh:function(t){var e=i(t=+t),n=i(-t);return e==1/0?1:n==1/0?-1:(e-n)/(a(t)+a(-t))}})},{22:22,49:49}],113:[function(t,e,n){var r=t(22);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var r=t(46),i=t(29),a=t(30),o=t(11),s=t(81),u=t(24),c=t(74).trim,l="Number",p=i[l],f=p,d=p.prototype,h=o(r.create(d))==l,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():c(e,3);var n,r,i,a=e.charCodeAt(0);if(43===a||45===a){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===a){switch(e.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+e}for(var o,u=e.slice(2),l=0,p=u.length;p>l;l++)if(o=u.charCodeAt(l),48>o||o>i)return NaN;return parseInt(u,r)}}return+e};p(" 0o1")&&p("0b1")&&!p("+0x1")||(p=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof p&&(h?u(function(){d.valueOf.call(n)}):o(n)!=l)?new f(v(e)):v(e)},r.each.call(t(19)?r.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){a(f,t)&&!a(p,t)&&r.setDesc(p,t,r.getDesc(f,t))}),p.prototype=d,d.constructor=p,t(61)(i,l,p))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var r=t(22);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var r=t(22),i=t(29).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},{22:22,29:29}],117:[function(t,e,n){var r=t(22);r(r.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var r=t(22);r(r.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var r=t(22),i=t(37),a=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&a(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var r=t(22);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var r=t(22);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var r=t(22);r(r.S+r.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var r=t(38);t(54)("freeze",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var r=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(r(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var r=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],129:[function(t,e,n){var r=t(38);t(54)("isExtensible",function(t){return function(e){return r(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var r=t(38);t(54)("isFrozen",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var r=t(38);t(54)("isSealed",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var r=t(22);r(r.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var r=t(80);t(54)("keys",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],134:[function(t,e,n){var r=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var r=t(38);t(54)("seal",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var r=t(22);r(r.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var r=t(10),i={};i[t(83)("toStringTag")]="z",i+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var r,i=t(46),a=t(48),o=t(29),s=t(17),u=t(10),c=t(22),l=t(38),p=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),y=t(68),b=t(52),x="Promise",w=o.process,_="process"==u(w),k=o[x],E=function(t){var e=new k(function(){});return t&&(e.constructor=Object),k.resolve(e)===e},S=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&E(),m(e,k),e.prototype=i.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var r=!1;k.resolve(i.setDesc({},"then",{get:function(){r=!0}})),n=r}}catch(a){n=!1}return n}(),O=function(t,e){return a&&t===k&&e===r?!0:v(t,e)},C=function(t){var e=p(t)[g];return void 0!=e?e:t},A=function(t){var e;return l(t)&&"function"==typeof(e=t.then)?e:!1},P=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=f(e),this.reject=f(n)},T=function(t){try{t()}catch(e){return{error:e}}},j=function(t,e){if(!t.n){t.n=!0;var n=t.c;b(function(){for(var r=t.v,i=1==t.s,a=0,s=function(e){var n,a,o=i?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(i||(t.h=!0),n=o===!0?r:o(r),n===e.promise?u(TypeError("Promise-chain cycle")):(a=A(n))?a.call(n,s,u):s(n)):u(r)}catch(c){u(c)}};n.length>a;)s(n[a++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,i=t.p;M(i)&&(_?w.emit("unhandledRejection",r,i):(e=o.onunhandledrejection)?e({promise:i,reason:r}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",r)),t.a=void 0},1)})}},M=function(t){var e,n=t._d,r=n.a||n.c,i=0;if(n.h)return!1;for(;r.length>i;)if(e=r[i++],e.fail||!M(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),j(e,!0))},F=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=A(t))?b(function(){var r={r:n,d:!1};try{e.call(t,s(F,r,1),s(L,r,1))}catch(i){L.call(r,i)}}):(n.v=t,n.s=1,j(n,!1))}catch(r){L.call({r:n,d:!1},r)}}};S||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(F,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new P(y(this,k)),r=n.promise,i=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,i.c.push(n),i.a&&i.a.push(n),i.s&&j(i,!1),r},"catch":function(t){return this.then(void 0,t)}})),c(c.G+c.W+c.F*!S,{Promise:k}),t(66)(k,x),t(65)(x),r=t(16)[x],c(c.S+c.F*!S,x,{reject:function(t){var e=new P(this),n=e.reject;return n(t),e.promise}}),c(c.S+c.F*(!S||E(!0)),x,{resolve:function(t){if(t instanceof k&&O(t.constructor,this))return t;var e=new P(this),n=e.resolve;return n(t),e.promise}}),c(c.S+c.F*!(S&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=C(this),n=new P(e),r=n.resolve,a=n.reject,o=[],s=T(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?i.each.call(o,function(t,i){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[i]=t,--n||r(s))},a)}):r(s)});return s&&a(s.error),n.promise},race:function(t){var e=C(this),n=new P(e),r=n.reject,i=T(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var r=t(22),i=Function.apply;r(r.S,"Reflect",{apply:function(t,e,n){return i.call(t,e,n)}})},{22:22}],140:[function(t,e,n){var r=t(46),i=t(22),a=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;i(i.S+i.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){a(t);var n=arguments.length<3?t:a(arguments[2]);if(t==n){if(void 0!=e)switch(o(e).length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var i=[null];return i.push.apply(i,e),new(u.apply(t,i))}var c=n.prototype,l=r.create(s(c)?c:Object.prototype),p=Function.apply.call(t,l,e);return s(p)?p:l}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S+i.F*t(24)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){a(t);try{return r.setDesc(t,e,n),!0}catch(i){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var r=t(22),i=t(46).getDesc,a=t(4);r(r.S,"Reflect",{deleteProperty:function(t,e){var n=i(a(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var r=t(22),i=t(4),a=function(t){this._t=i(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(a,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),r(r.S,"Reflect",{enumerate:function(t){return new a(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.getDesc(a(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var r=t(22),i=t(46).getProto,a=t(4);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(a(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function r(t,e){var n,o,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=i.getDesc(t,e))?a(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:s(o=i.getProto(t))?r(o,e,c):void 0}var i=t(46),a=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:r})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var r=t(22),i=t(4),a=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),a?a(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var r=t(22),i=t(4),a=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return a&&a(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var r=t(22),i=t(64);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function r(t,e,n){var o,l,p=arguments.length<4?t:arguments[3],f=i.getDesc(u(t),e);if(!f){if(c(l=i.getProto(t)))return r(l,e,n,p);f=s(0)}return a(f,"value")?f.writable!==!1&&c(p)?(o=i.getDesc(p,e)||s(0),o.value=n,i.setDesc(p,e,o),!0):!1:void 0===f.set?!1:(f.set.call(p,n),!0)}var i=t(46),a=t(30),o=t(22),s=t(59),u=t(4),c=t(38);o(o.S,"Reflect",{set:r})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var r=t(46),i=t(29),a=t(39),o=t(26),s=i.RegExp,u=s,c=s.prototype,l=/a/g,p=/a/g,f=new s(l)!==l;!t(19)||f&&!t(24)(function(){return p[t(83)("match")]=!1,s(l)!=l||s(p)==p||"/a/i"!=s(l,"i")})||(s=function(t,e){var n=a(t),r=void 0===e;return this instanceof s||!n||t.constructor!==s||!r?f?new u(n&&!r?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&r?o.call(t):e):t},r.each.call(r.getNames(u),function(t){t in s||r.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),c.constructor=s,s.prototype=c,t(61)(i,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var r=t(46);t(19)&&"g"!=/./g.flags&&r.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],159:[function(t,e,n){"use strict";var r=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t=0===t?0:t,t)}},r)},{12:12,15:15}],160:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="endsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{endsWith:function(t){var e=a(this,t,o),n=arguments,r=n.length>1?n[1]:void 0,u=i(e.length),c=void 0===r?u:Math.min(i(r),u),l=t+"";return s?s.call(e,l,c):e.slice(c-l.length,c)===l}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var r=t(22),i=t(76),a=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments,o=r.length,s=0;o>s;){if(e=+r[s++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?a(e):a(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var r=t(22),i=t(71),a="includes";r(r.P+r.F*t(23)(a),"String",{includes:function(t){return!!~i(this,t,a).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var r=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var r=t(22),i=t(78),a=t(79);r(r.S,"String",{raw:function(t){for(var e=i(t.raw),n=a(e.length),r=arguments,o=r.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(r[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var r=t(22);r(r.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="startsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{startsWith:function(t){var e=a(this,t,o),n=arguments,r=i(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,r):e.slice(r,r+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var r=t(46),i=t(29),a=t(30),o=t(19),s=t(22),u=t(61),c=t(24),l=t(67),p=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),y=t(4),b=t(78),x=t(59),w=r.getDesc,_=r.setDesc,k=r.create,E=m.get,S=i.Symbol,O=i.JSON,C=O&&O.stringify,A=!1,P=d("_hidden"),T=r.isEnum,j=l("symbol-registry"),M=l("symbols"),L="function"==typeof S,F=Object.prototype,N=o&&c(function(){return 7!=k(_({},"a",{get:function(){return _(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=w(F,e);r&&delete F[e],_(t,e,n),r&&t!==F&&_(F,e,r)}:_,R=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&A&&N(F,t,{configurable:!0,set:function(e){a(this,P)&&a(this[P],t)&&(this[P][t]=!1),N(this,t,x(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&a(M,e)?(n.enumerable?(a(t,P)&&t[P][e]&&(t[P][e]=!1),n=k(n,{enumerable:x(0,!1)})):(a(t,P)||_(t,P,x(1,{})),t[P][e]=!0),N(t,e,n)):_(t,e,n)},B=function(t,e){y(t);for(var n,r=v(e=b(e)),i=0,a=r.length;a>i;)I(t,n=r[i++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},V=function(t){var e=T.call(this,t);return e||!a(this,t)||!a(M,t)||a(this,P)&&this[P][t]?e:!0},U=function(t,e){var n=w(t=b(t),e);return!n||!a(M,e)||a(t,P)&&t[P][e]||(n.enumerable=!0),n},z=function(t){for(var e,n=E(b(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])||e==P||r.push(e);return r},W=function(t){for(var e,n=E(b(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])&&r.push(M[e]);return r},H=function(t){if(void 0!==t&&!D(t)){for(var e,n,r=[t],i=1,a=arguments;a.length>i;)r.push(a[i++]);return e=r[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),r[1]=e,C.apply(O,r)}},G=c(function(){var t=S();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))});L||(S=function(){if(D(this))throw TypeError("Symbol is not a constructor");return R(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof S},r.create=q,r.isEnum=V,r.getDesc=U,r.setDesc=I,r.setDescs=B,r.getNames=m.get=z,r.getSymbols=W,o&&!t(48)&&u(F,"propertyIsEnumerable",V,!0));var K={"for":function(t){return a(j,t+="")?j[t]:j[t]=S(t)},keyFor:function(t){return h(j,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};r.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:R(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:z,getOwnPropertySymbols:W}),O&&s(s.S+s.F*(!L||G),"JSON",{stringify:H}),p(S,"Symbol"),p(Math,"Math",!0),p(i.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var r=t(46),i=t(61),a=t(14),o=t(38),s=t(30),u=a.frozenStore,c=a.WEAK,l=Object.isExtensible||o,p={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!l(t))return u(this).get(t);if(s(t,c))return t[c][this._i]}},set:function(t,e){return a.def(this,t,e)}},a,!0,!0);7!=(new f).set((Object.freeze||Object)(p),7).get(p)&&r.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];i(e,t,function(e,r){if(o(e)&&!l(e)){var i=u(this)[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var r=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t,!0)}},r,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var r=t(22),i=t(7)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var r=t(22);r(r.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var r=t(22),i=t(55)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},{22:22,55:55}],175:[function(t,e,n){var r=t(46),i=t(22),a=t(56),o=t(78),s=t(59);i(i.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,i=o(t),u=r.setDesc,c=r.getDesc,l=a(i),p={},f=0;l.length>f;)n=c(i,e=l[f++]),e in p?u(p,e,s(0,n)):p[e]=n;return p}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var r=t(22),i=t(55)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},{22:22,55:55}],177:[function(t,e,n){var r=t(22),i=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return i(t)}})},{22:22,62:62}],178:[function(t,e,n){var r=t(22);r(r.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!0);r(r.P,"String",{at:function(t){return i(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padLeft:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padRight:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var r=t(46),i=t(22),a=t(17),o=t(16).Array||Array,s={},u=function(t,e){r.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=a(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),i(i.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var r=t(29),i=t(31),a=t(45),o=t(83)("iterator"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,l=u&&u.prototype,p=a.NodeList=a.HTMLCollection=a.Array;c&&!c[o]&&i(c,o,p),l&&!l[o]&&i(l,o,p)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var r=t(22),i=t(75);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},{22:22,75:75}],187:[function(t,e,n){var r=t(29),i=t(22),a=t(33),o=t(57),s=r.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),c=function(t){return u?function(e,n){return t(a(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};i(i.G+i.B+i.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function r(t,e,n,r){var i=Object.create((e||a).prototype),o=new h(r||[]);return i._invoke=p(t,n,o),i}function i(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(r){return{type:"throw",arg:r}}}function a(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function l(e){function n(t,n){var r=e[t](n),i=r.value;return i instanceof c?Promise.resolve(i.arg).then(a,o):Promise.resolve(i).then(function(t){return r.value=t,r})}function r(t,e){function r(){return n(t,e)}return i=i?i.then(r,r):new Promise(function(t){t(r())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var i,a=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=r}function p(t,e,n){var r=_;return function(a,o){if(r===E)throw Error("Generator is already running");if(r===S){if("throw"===a)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===a||"throw"===a&&s.iterator[a]===g){n.delegate=null;var u=s.iterator["return"];if(u){var c=i(u,s.iterator,o);if("throw"===c.type){a="throw",o=c.arg;continue}}if("return"===a)continue}var c=i(s.iterator[a],s.iterator,o);if("throw"===c.type){n.delegate=null,a="throw",o=c.arg;continue}a="next",o=g;var l=c.arg;if(!l.done)return r=k,l;n[s.resultName]=l.value,n.next=s.nextLoc,n.delegate=null}if("next"===a)n._sent=o,r===k?n.sent=o:n.sent=g;else if("throw"===a){if(r===_)throw r=S,o;n.dispatchException(o)&&(a="next",o=g)}else"return"===a&&n.abrupt("return",o);r=E;var c=i(t,e,n);if("normal"===c.type){r=n.done?S:k;var l={value:c.arg,done:n.done};if(c.arg!==O)return l;n.delegate&&"next"===a&&(o=g)}else"throw"===c.type&&(r=S,a="throw",o=c.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[b];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function i(){for(;++n=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=y.call(i,"catchLoc"),s=y.call(i,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&y.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;d(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return l.createDocumentFragment()}function n(t){return l.createElement(t)}function r(t){if(1===t.length)return i(t[0]);for(var n=e(),r=B.call(t),a=0;a-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(a):document.fonts.load(c(a,a.family),s).then(function(e){1<=e.length?t(a):setTimeout(f,25)},function(){e(a)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=y||-1!=g&&-1!=y)&&((e=v!=g&&v!=y&&g!=y)||(null===p&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),p=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=p&&(v==b&&g==b&&y==b||v==x&&g==x&&y==x||v==w&&g==w&&y==w)),e=!e),e&&(null!==_.parentNode&&_.parentNode.removeChild(_),clearTimeout(k),t(a))}function f(){if((new Date).getTime()-l>=u)null!==_.parentNode&&_.parentNode.removeChild(_),e(a);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,y=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new r(s),h=new r(s),m=new r(s),v=-1,g=-1,y=-1,b=-1,x=-1,w=-1,_=document.createElement("div"),k=0;_.dir="ltr",i(d,c(a,"sans-serif")),i(h,c(a,"serif")),i(m,c(a,"monospace")),_.appendChild(d.a),_.appendChild(h.a),_.appendChild(m.a),document.body.appendChild(_),b=d.a.offsetWidth,x=h.a.offsetWidth,w=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),i(d,c(a,'"'+a.family+'",sans-serif')),o(h,function(t){g=t,n()}),i(h,c(a,'"'+a.family+'",serif')),o(m,function(t){y=t,n()}),i(m,c(a,'"'+a.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function i(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function a(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,l(e)}function o(t){var e=b[t[g]];return e||(e={},y++,t[g]=y,b[y]=e),e}function s(t,e,r){if(e||(e=n),f)return e.createElement(t);r||(r=o(e));var i;return i=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!i.canHaveChildren||m.test(t)||i.tagUrn?i:r.frag.appendChild(i)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),a=0,s=i(),u=s.length;u>a;a++)r.createElement(s[a]);return r}function c(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function l(t){t||(t=n);var e=o(t);return!x.shivCSS||p||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||c(t,e),t}var p,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",y=0,b={};!function(){try{var t=n.createElement("a");t.innerHTML="",p="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){p=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:l,createElement:s,createDocumentFragment:u,addElements:a};t.html5=x,l(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,r){for(var a,o=n.slice(),s=i(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return a=!s.stoppedPropagation,r&&a&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var i=y(e||t,r);v(t,"textContent",n(function(){return i.get.call(this)},function(t){i.set.call(this,t)}))}function i(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function a(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var p=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var r in n)if(b.call(n,r))try{v(e,r,n[r])}catch(i){t.console&&console.log(r+" failed on object:",e,i.message)}},y=Object.getOwnPropertyDescriptor,b=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,_=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),O=document.documentElement,C=O.removeAttribute,A=O.setAttribute;r(t.HTMLCommentElement.prototype,x,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(w,null,"nodeValue"),r(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(y(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,r){if("function"==typeof n||"object"==typeof n){var i,o,u=this,c="on"+t,p=u[m]||v(u,m,{value:{}})[m],f=p[c]||(p[c]={}),d=f.h||(f.h=[]);if(!b.call(f,"w")){if(f.w=function(t){return t[m]||e(u,l(u,t),d,!1)},!b.call(E,c))if(_.test(t)){try{i=document.createEventObject(),i[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(c))&&C.call(u,c)),u.fireEvent(c,i),E[c]=!0}catch(i){for(E[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,c,o)}else E[c]=!1;(f.n=E[c])&&u.attachEvent(c,f.w)}a(d,n)<0&&d[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,r=this,i="on"+t.type,a=r[m],o=a&&a[i],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(i,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var r=this,i="on"+t,o=r[m],s=o&&o[i],u=s&&s.h,c=u?a(u,e):-1;c>-1&&u.splice(c,1)}}}}),g(w,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,i="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[i]||(o[i]={}),u=s.h||(s.h=[]);a(u,e)<0&&(r[i]||(r[i]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,i=n[m],a=i&&i[r],o=!!a;return o&&(a.n?n.fireEvent(r,t):e(n,t,a.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var i=this;x.addEventListener.call(i,e,n,r),p&&e===h&&!k.test(i.readyState)&&(p=!1,i.attachEvent(d,u),t==top&&!function a(t){try{i.documentElement.doScroll("left"),u()}catch(e){setTimeout(a,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,r=/^(top|right|bottom|left)$/,i=/\-([a-z])/g,a=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,l=u.currentStyle,p=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(i,a),e=l?l[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=p&&p.left,s&&(p.left=l.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(p.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,i){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,l(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),a(o,r)<0&&o[i?"unshift":"push"](r)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,r){var i="on"+e,o=(t[i]||Object)[m],s=o?a(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var p=1;s-1>=p;p++)a.push((0,c.times)(r,(0,c.minus)(n[p],n[p-1])));for(var f=[(0,c.plus)(n[0],l(a[0],a[1]))],p=1;s-2>=p;p++)f.push((0,c.minus)(n[p],(0,c.average)([a[p],a[p-1]])));f.push((0,c.minus)(n[s-1],l(a[s-2],a[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,i(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,c.range)(2,s).reduce(function(t,e){var r=f[e],i=n[e];return t.smoothcurveto(r[0],r[1],i[0],i[1])},g),centroid:(0,c.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var i=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),a=t(197),o=r(a),s=t(198),u=1e-5,c=function(t,e){var n=t.map(e),r=n.sort(function(t,e){var n=i(t,2),r=n[0],a=(n[1],i(e,2)),o=a[0];a[1];return r-o}),a=r.length,o=r[0][0],c=r[a-1][0],l=(0,s.minBy)(r,function(t){return t[1]}),p=(0,s.maxBy)(r,function(t){return t[1]});return o==c&&(c+=u),l==p&&(p+=u),{points:r,xmin:o,xmax:c,ymin:l,ymax:p}};n["default"]=function(t){var e=t.data,n=t.xaccessor,r=t.yaccessor,a=t.width,u=t.height,l=t.closed,p=t.min,f=t.max;n||(n=function(t){var e=i(t,2),n=e[0];e[1];return n}),r||(r=function(t){var e=i(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),r(t)]},h=e.map(function(t){return c(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==p?(0,s.minBy)(h,function(t){return t.ymin}):p,y=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;l&&(g=Math.min(g,0),y=Math.max(y,0));var b=l?0:g,x=(0,o["default"])([m,v],[0,a]),w=(0,o["default"])([g,y],[u,0]),_=function(t){var e=i(t,2),n=e[0],r=e[1];return[x(n),w(r)]};return{arranged:h,scale:_,xscale:x,yscale:w,base:b}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function a(t,e){var n=r(t,2),i=n[0],o=n[1],s=r(e,2),u=s[0],c=s[1],l=function(t){return u+(c-u)*(t-i)/(o-i)};return l.inverse=function(){return a([u,c],[i,o])},l};n["default"]=i,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function(t){return t.reduce(function(t,e){return t+e},0)},a=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},c=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},l=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i+s,a+u]},p=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i-s,a-u]},f=function(t,e){var n=r(e,2),i=n[0],a=n[1];return[t*i,t*a]},d=function(t){var e=r(t,2),n=e[0],i=e[1];return Math.sqrt(n*n+i*i)},h=function(t){return t.reduce(l,[0,0])},m=function(t){return f(1/t.length,t.reduce(l))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var r in n){var i=n[r];e[r]=i(e.index,e.item,e.group)}return e},y=function(t,e,n){for(var r=[],i=t;e>i;i++)r.push(i);return n&&r.push(e),r},b=function(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,c=t[u];n.push(e(u,c))}}catch(l){i=!0,a=l}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return n},x=function(t){return b(t,function(t,e){return[t,e]})},w=function(t){return t};n.sum=i,n.min=a,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=c,n.plus=l,n.minus=p,n.times=f,n.id=w,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=y,n.mapObject=b,n.pairs=x,n["default"]={sum:i,min:a,max:o,sumBy:s,minBy:u,maxBy:c,plus:l,minus:p,times:f,id:w,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:y,mapObject:b,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),i=function a(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},i=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return i===s&&a===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,r=n.map(function(t){return s(t,6)});return e+" "+r.join(" ")},c=function(t,e){var n=t.command,i=t.params,a=r(e,2),o=a[0],s=a[1];switch(n){case"M":return[i[0],i[1]];case"L":return[i[0],i[1]];case"H":return[i[0],s];case"V":return[o,i[0]];case"Z":return null;case"C":return[i[4],i[5]];case"S":return[i[2],i[3]];case"Q":return[i[2],i[3]];case"T":return[i[0],i[1]];case"A":return[i[5],i[6]]}},l=function(t,e){return function(n){var r="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,r)}},p=function(t){return a(n(e,t))};return{moveto:l(["x","y"],function(t,e){return p({command:"M",params:[t,e]})}),lineto:l(["x","y"],function(t,e){return p({command:"L",params:[t,e]})}),hlineto:l(["x"],function(t){return p({command:"H",params:[t]})}),vlineto:l(["y"],function(t){return p({command:"V",params:[t]})}),closepath:function(){return p({command:"Z",params:[]})},curveto:l(["x1","y1","x2","y2","x","y"],function(t,e,n,r,i,a){return p({command:"C",params:[t,e,n,r,i,a]})}),smoothcurveto:l(["x2","y2","x","y"],function(t,e,n,r){return p({command:"S",params:[t,e,n,r]})}),qcurveto:l(["x1","y1","x","y"],function(t,e,n,r){return p({command:"Q",params:[t,e,n,r]})}),smoothqcurveto:l(["x","y"],function(t,e){return p({command:"T",params:[t,e]})}),arc:l(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,r,i,a,o){return p({command:"A",params:[t,e,n,r,i,a,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,l=c(u,n);n=l,l&&t.push(l)}}catch(p){i=!0,a=p}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],r=t.points()[0],o=t.instructions().slice(1);return i(n,r)||o.unshift({command:"L",params:r}),a(this.instructions().concat(o))}}};n["default"]=function(){return i()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var i,a;a=n.shift();)for(i in a)Mo.call(a,i)&&(t[i]=a[i]);return t}function i(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function a(t){return"[object Array]"===Lo.call(t)}function o(t){return Fo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function c(t){return t&&"[object Object]"===Lo.call(t)}function l(t,e){return t.replace(/%s/g,function(){return e.shift()})}function p(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];throw t=l(t,n),Error(t)}function f(){Mv.DEBUG&&Po.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Mv.DEBUG&&d.apply(null,arguments)}function v(){Mv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var r=y(t,e,n);return r?r[t][n]:null}function y(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function b(t){return function(){return t}}function x(t){var e,n,r,i,a,o;for(e=t.split("."),(n=Wo[e.length])||(n=w(e.length)),a=[],r=function(t,n){return t?"*":e[n]},i=n.length;i--;)o=n[i].map(r).join("."),a.hasOwnProperty(o)||(a.push(o),a[o]=!0);return a}function w(t){var e,n,r,i,a,o,s,u,c="";if(!Wo[t]){for(r=[];c.length=a;a+=1){for(n=a.toString(2);n.lengtho;o++)u.push(i(n[o]));r[a]=u}Wo[t]=r}return Wo[t]}function _(t,e,n,r){var i=t[e];if(!i||!i.equalsOrStartsWith(r)&&i.equalsOrStartsWith(n))return t[e]=i?i.replace(n,r):r,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new $o(t)),Ko[t])}function S(t,e){function n(e,n){var r,i,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],i=r?r.get():t.viewmodel.get(n),o=i?Object.keys(i):null),o&&o.forEach(function(t){"_ractive"===t&&a(i)||e.push(n.join(t))}),e}var r,i,o;for(r=e.str.split("."),o=[Yo];i=r.shift();)"*"===i?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(i):o=o.map(O(i));return o}function O(t){return function(e){return e.join(t)}}function C(t){return t?t.replace(Ho,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,i=void 0;if(/\*/.test(e))return i={},S(t,E(C(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Xo);i[e.str]=r+n}),t.set(i);if(r=t.get(e),!u(r))throw Error(Xo);return t.set(e,+r+n)}function P(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=rs[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!a(t)||!a(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function F(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function R(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,r){var i;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");
+if(e instanceof is)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{i=e.then}catch(a){return void r(a)}if("function"==typeof i){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{i.call(e,s,u)}catch(a){if(!o)return r(a),void(o=!0)}}else n(e)}}function V(t,e,n){var r;return e=C(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),W(t,r.firstKey,n)):"."===e[0]?(r=U(ls(n),e),r&&W(t,r.firstKey,n)):r=z(t,E(e),n),r}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function z(t,e,n,r){var i,a,o,s,u;if(e.isRoot)return e;for(a=e.firstKey;n;)if(i=n.context,n=n.parent,i&&(s=!0,o=t.viewmodel.get(i),o&&("object"==typeof o||"function"==typeof o)&&a in o))return i.join(e.str);return H(t.viewmodel,a)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,a=E(a),u=z(t.parent,a,n,!0))?(t.viewmodel.map(a,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function W(t,e){var n;!t.parent||t.isolated||H(t.viewmodel,e)||(e=E(e),(n=z(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function H(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function G(t){t.teardown()}function K(t){t.unbind()}function $(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;a--)i=t._subs[e[a]],i&&(s=gt(t,i,n,r)&&s);if(zs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,r)}}function gt(t,e,n,r){var i=null,a=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(a=!0);return n&&!n._noArg&&a&&(i=n.original)&&(i.preventDefault&&i.preventDefault(),i.stopPropagation&&i.stopPropagation()),!a}function yt(t){var e={args:Array.prototype.slice.call(arguments,1)};Ws(this,t,e)}function bt(t){var e;return t=E(C(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ps(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,wt(this)}function wt(t){Qs.fire(t),t.findAllComponents("*").forEach(function(t){wt(t.instance)})}function _t(t,e,n){var r,i;return t=E(C(t)),r=this.viewmodel.get(t),a(r)&&a(e)?(i=ys.start(this,!0),this.viewmodel.merge(t,r,e,n),ys.end(),i):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=S(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var i,a,o;e=E(C(e)),r=r||lu,e.isPattern?(i=new uu(t,e,n,r),t.viewmodel.patternObservers.push(i),a=!0):i=new Zs(t,e,n,r),i.init(r.init),t.viewmodel.register(e,i,a?"patternObservers":"observers"),i.ready=!0;var s={cancel:function(){var n;o||(a?(n=t.viewmodel.patternObservers.indexOf(i),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,i,"patternObservers")):t.viewmodel.unregister(e,i,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var r,i,a,o;if(c(t)){n=e,i=t,r=[];for(t in i)i.hasOwnProperty(t)&&(e=i[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",cu(this,t,e,n);if(a=t.split(" "),1===a.length)return cu(this,t,e,n);for(r=[],o=a.length;o--;)t=a[o],t&&r.push(cu(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ot(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function Ct(t,e){var n,r=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,i;(n=r._subs[t])&&(e?(i=n.indexOf(e),-1!==i&&n.splice(i,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,r,i,a=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return i=t.split(" ").map(du).filter(hu),i.forEach(function(t){(a._subs[t]||(a._subs[t]=[])).push(e)}),{cancel:function(){return a.off(t,e)}}}function Pt(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var r,i,a,o,s,u,c=[];if(r=jt(t,e,n),!r)return null;for(i=t.length,s=r.length-2-r[1],a=Math.min(i,r[0]),o=a+r[1],u=0;a>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;i>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function jt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var r,i,a,o=this;if(a=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=ys.start(this,!0),ys.scheduleTask(function(){return ju.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Pu.apply(),e&&((i=e.__ractive_instances__)?i.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),ys.end(),this.transitionsEnabled=a,r.then(function(){return Mu.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(G)}function Ft(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Nt(t,e){var n,r,i;return r='[data-ractive-css~="{'+e+'}"]',i=function(t){var e,n,i,a,o,s,u,c=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(a=e.map(Dt),u=e.length;u--;)s=a.slice(),i=e[u],s[u]=i.base+r+i.modifiers||"",o=a.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=qu.test(t)?t.replace(qu,r):t.replace(Du,"").replace(Ru,function(t,e){var n,r;return Bu.test(e)?t:(n=e.split(",").map(Rt),r=n.map(i).join(", ")+" ",t.replace(e,r))})}function Rt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?p("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var i=r?qt(e,this):e,a=n?qt(t,this):t;return Vt(i,a)}:Vt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&p("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Vt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Eo($u);return e.parse=function(e,n){return zt(e,n||t)},e}function zt(t,e){if(!Gu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Gu(t,e||this.options)}function Wt(t,e){var n;if(!Xa){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Ht(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a