diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index e413e2ddba..4b50904ea2 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -12,6 +12,10 @@
/turf/closed/wall/mineral/plastitanium,
/area/ruin/powered/syndicate_lava_base)
"ae" = (
+/obj/item/weapon/bombcore/large/underwall,
+/turf/closed/wall/mineral/plastitanium,
+/area/ruin/powered/syndicate_lava_base)
+"af" = (
/obj/structure/closet/secure_closet/bar{
req_access = null;
req_access_txt = "150"
@@ -20,7 +24,7 @@
dir = 10
},
/area/ruin/powered/syndicate_lava_base)
-"af" = (
+"ag" = (
/obj/structure/table/wood,
/obj/item/weapon/reagent_containers/food/snacks/syndicake,
/obj/item/weapon/reagent_containers/food/snacks/syndicake,
@@ -32,7 +36,7 @@
},
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"ag" = (
+"ah" = (
/obj/structure/table/wood,
/obj/item/weapon/reagent_containers/food/snacks/salad/validsalad,
/turf/open/floor/plasteel/podhatch{
@@ -41,7 +45,7 @@
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"ah" = (
+"ai" = (
/obj/structure/rack{
icon = 'icons/obj/stationobjs.dmi';
icon_state = "minibar_left";
@@ -50,7 +54,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"ai" = (
+"aj" = (
/obj/structure/rack{
icon = 'icons/obj/stationobjs.dmi';
icon_state = "minibar_right";
@@ -59,7 +63,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aj" = (
+"ak" = (
/obj/structure/dresser,
/obj/structure/mirror{
desc = "Mirror mirror on the wall, who is the most robust of them all?";
@@ -67,40 +71,40 @@
},
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"ak" = (
+"al" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1
},
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"al" = (
+"am" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"am" = (
+"an" = (
/obj/structure/table/wood,
/obj/item/weapon/clipboard,
/obj/item/toy/figure/syndie,
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"an" = (
+"ao" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plasteel/podhatch{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"ao" = (
+"ap" = (
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"ap" = (
+"aq" = (
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"aq" = (
+"ar" = (
/obj/item/stack/sheet/mineral/plastitanium{
amount = 30
},
@@ -112,10 +116,10 @@
dir = 9
},
/area/ruin/powered/syndicate_lava_base)
-"ar" = (
+"as" = (
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"as" = (
+"at" = (
/obj/effect/mob_spawn/human/lavaland_syndicate{
tag = "icon-sleeper_s (EAST)";
icon_state = "sleeper_s";
@@ -123,10 +127,10 @@
},
/turf/open/floor/plasteel/grimy,
/area/ruin/powered/syndicate_lava_base)
-"at" = (
+"au" = (
/turf/open/floor/plasteel/grimy,
/area/ruin/powered/syndicate_lava_base)
-"au" = (
+"av" = (
/obj/effect/mob_spawn/human/lavaland_syndicate{
tag = "icon-sleeper_s (WEST)";
icon_state = "sleeper_s";
@@ -134,7 +138,7 @@
},
/turf/open/floor/plasteel/grimy,
/area/ruin/powered/syndicate_lava_base)
-"av" = (
+"aw" = (
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (EAST)";
@@ -142,7 +146,7 @@
dir = 4
},
/area/ruin/powered/syndicate_lava_base)
-"aw" = (
+"ax" = (
/obj/item/stack/cable_coil/white,
/obj/item/stack/cable_coil/white,
/obj/item/stack/packageWrap,
@@ -152,17 +156,6 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"ax" = (
-/obj/structure/table/wood,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/m10mm,
-/obj/item/ammo_box/magazine/sniper_rounds,
-/obj/item/ammo_box/magazine/sniper_rounds,
-/obj/item/ammo_box/magazine/sniper_rounds,
-/turf/open/floor/plasteel/grimy,
-/area/ruin/powered/syndicate_lava_base)
"ay" = (
/obj/structure/table/wood,
/obj/item/ammo_box/magazine/m10mm,
@@ -172,12 +165,23 @@
/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/ammo_box/magazine/sniper_rounds,
+/turf/open/floor/plasteel/grimy,
+/area/ruin/powered/syndicate_lava_base)
+"az" = (
+/obj/structure/table/wood,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/ammo_box/magazine/sniper_rounds,
+/obj/item/ammo_box/magazine/sniper_rounds,
+/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/ammo_box/magazine/sniper_rounds,
/turf/open/floor/plasteel/grimy,
/area/ruin/powered/syndicate_lava_base)
-"az" = (
+"aA" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (SOUTHEAST)";
@@ -185,7 +189,7 @@
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"aA" = (
+"aB" = (
/obj/item/stack/sheet/metal{
amount = 50
},
@@ -198,7 +202,7 @@
dir = 10
},
/area/ruin/powered/syndicate_lava_base)
-"aB" = (
+"aC" = (
/obj/structure/table/wood,
/obj/item/weapon/paper_bin,
/obj/item/weapon/pen,
@@ -206,18 +210,18 @@
icon_state = "wood-broken4"
},
/area/ruin/powered/syndicate_lava_base)
-"aC" = (
+"aD" = (
/obj/structure/table/wood,
/obj/item/weapon/storage/box/drinkingglasses,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aD" = (
+"aE" = (
/obj/structure/table/wood,
/obj/item/toy/nuke,
/obj/item/weapon/book/manual/nuclear,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aE" = (
+"aF" = (
/obj/structure/table/wood,
/obj/item/weapon/lighter{
pixel_y = 3
@@ -225,18 +229,18 @@
/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aF" = (
+"aG" = (
/obj/structure/table/wood,
/obj/item/weapon/storage/fancy/donut_box,
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aG" = (
+"aH" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 26
},
/turf/open/floor/wood,
/area/ruin/powered/syndicate_lava_base)
-"aH" = (
+"aI" = (
/obj/effect/mob_spawn/human/lavaland_syndicate/comms{
tag = "icon-sleeper_s (EAST)";
icon_state = "sleeper_s";
@@ -244,26 +248,26 @@
},
/turf/open/floor/plasteel/grimy,
/area/ruin/powered/syndicate_lava_base)
-"aI" = (
+"aJ" = (
/obj/structure/sign/nosmoking_2,
/turf/closed/wall/mineral/plastitanium,
/area/ruin/powered/syndicate_lava_base)
-"aJ" = (
+"aK" = (
/obj/structure/closet/crate/bin,
/obj/item/trash/syndi_cakes,
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"aK" = (
+"aL" = (
/obj/structure/chair/stool/bar,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"aL" = (
+"aM" = (
/obj/structure/chair/stool/bar,
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"aM" = (
+"aN" = (
/obj/structure/table/wood,
/obj/item/weapon/lipstick/random{
pixel_x = 3;
@@ -279,12 +283,12 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"aN" = (
+"aO" = (
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"aO" = (
+"aP" = (
/obj/structure/dresser,
/obj/structure/mirror{
desc = "Mirror mirror on the wall, who is the most robust of them all?";
@@ -294,13 +298,13 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"aP" = (
+"aQ" = (
/obj/item/target,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"aQ" = (
+"aR" = (
/obj/structure/closet/emcloset{
anchored = 1
},
@@ -311,7 +315,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"aR" = (
+"aS" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1
@@ -320,9 +324,6 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"aS" = (
-/turf/open/floor/plasteel/black,
-/area/ruin/powered/syndicate_lava_base)
"aT" = (
/obj/machinery/door/airlock/hatch{
name = "Dormitories";
@@ -402,11 +403,6 @@
},
/area/ruin/powered/syndicate_lava_base)
"bb" = (
-/turf/open/floor/plasteel/vault{
- dir = 5
- },
-/area/ruin/powered/syndicate_lava_base)
-"bc" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
@@ -414,24 +410,24 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bd" = (
+"bc" = (
/obj/structure/bookcase/random,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"be" = (
+"bd" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1
},
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"bf" = (
+"be" = (
/obj/structure/bookcase/random,
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"bg" = (
+"bf" = (
/obj/structure/toilet{
tag = "icon-toilet00 (WEST)";
icon_state = "toilet00";
@@ -441,7 +437,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bh" = (
+"bg" = (
/obj/machinery/door/airlock/hatch{
name = "Lounge";
req_access_txt = "150"
@@ -450,13 +446,13 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bi" = (
+"bh" = (
/obj/machinery/chem_dispenser,
/turf/open/floor/plasteel/podhatch{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bj" = (
+"bi" = (
/obj/structure/table/reinforced,
/obj/item/weapon/reagent_containers/glass/beaker/large,
/obj/item/weapon/reagent_containers/glass/beaker,
@@ -474,7 +470,7 @@
dir = 1
},
/area/ruin/powered/syndicate_lava_base)
-"bk" = (
+"bj" = (
/obj/machinery/chem_master,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (EAST)";
@@ -482,7 +478,7 @@
dir = 4
},
/area/ruin/powered/syndicate_lava_base)
-"bl" = (
+"bk" = (
/obj/structure/noticeboard{
pixel_y = 32
},
@@ -495,7 +491,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bm" = (
+"bl" = (
/obj/structure/table/reinforced,
/obj/item/weapon/clipboard,
/obj/item/weapon/folder/white,
@@ -509,7 +505,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bn" = (
+"bm" = (
/obj/structure/table/reinforced,
/obj/item/weapon/storage/box/beakers{
pixel_x = 3;
@@ -522,17 +518,17 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bo" = (
+"bn" = (
/turf/open/floor/plasteel/podhatch{
dir = 9
},
/area/ruin/powered/syndicate_lava_base)
-"bp" = (
+"bo" = (
/turf/open/floor/plasteel/podhatch{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bq" = (
+"bp" = (
/obj/structure/table/reinforced,
/obj/machinery/reagentgrinder{
desc = "Used to grind things up into raw materials and liquids.";
@@ -543,7 +539,7 @@
},
/turf/open/floor/plasteel/podhatch/corner,
/area/ruin/powered/syndicate_lava_base)
-"br" = (
+"bq" = (
/obj/structure/reagent_dispensers/virusfood{
pixel_y = 32
},
@@ -555,7 +551,7 @@
},
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"bs" = (
+"br" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 0;
pixel_y = 32
@@ -563,7 +559,7 @@
/obj/machinery/computer/pandemic,
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"bt" = (
+"bs" = (
/obj/structure/table/reinforced,
/obj/item/weapon/storage/box/beakers{
pixel_x = 3;
@@ -572,7 +568,7 @@
/obj/item/weapon/storage/box/syringes,
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"bu" = (
+"bt" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/item/weapon/reagent_containers/blood/random,
@@ -582,49 +578,49 @@
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"bv" = (
+"bu" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/turf/open/floor/plating,
/area/ruin/powered/syndicate_lava_base)
-"bw" = (
+"bv" = (
/mob/living/carbon/monkey,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bx" = (
+"bw" = (
/obj/structure/bed/roller,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"by" = (
+"bx" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bz" = (
+"by" = (
/mob/living/carbon/monkey,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bA" = (
+"bz" = (
/obj/structure/window/reinforced,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bB" = (
+"bA" = (
/obj/machinery/door/window/brigdoor,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bC" = (
+"bB" = (
/obj/machinery/chem_heater,
/obj/structure/extinguisher_cabinet{
pixel_x = -26
@@ -633,13 +629,13 @@
dir = 10
},
/area/ruin/powered/syndicate_lava_base)
-"bD" = (
+"bC" = (
/obj/structure/chair/office/dark{
dir = 1
},
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"bE" = (
+"bD" = (
/obj/structure/closet/crate/bin,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (SOUTHEAST)";
@@ -647,10 +643,10 @@
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"bF" = (
+"bE" = (
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"bG" = (
+"bF" = (
/obj/item/device/assembly/igniter,
/obj/item/device/assembly/igniter,
/obj/item/device/assembly/igniter,
@@ -671,7 +667,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bH" = (
+"bG" = (
/obj/structure/table/reinforced,
/obj/item/weapon/book/manual/wiki/infections,
/obj/item/stack/sheet/mineral/silver{
@@ -683,7 +679,7 @@
dir = 4
},
/area/ruin/powered/syndicate_lava_base)
-"bI" = (
+"bH" = (
/obj/structure/chair/office/dark{
dir = 8
},
@@ -691,14 +687,14 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"bJ" = (
+"bI" = (
/obj/machinery/door/airlock/hatch{
name = "Monkey Pen";
req_access_txt = "150"
},
/turf/open/floor/plasteel/black,
/area/ruin/powered/syndicate_lava_base)
-"bK" = (
+"bJ" = (
/obj/structure/table/reinforced,
/obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted,
/obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted,
@@ -706,7 +702,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bL" = (
+"bK" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1
@@ -715,7 +711,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bM" = (
+"bL" = (
/obj/structure/table/reinforced,
/obj/item/clothing/gloves/color/latex,
/obj/item/clothing/gloves/color/latex,
@@ -729,14 +725,22 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"bN" = (
-/obj/machinery/smartfridge/chemistry/virology/preloaded,
+"bM" = (
+/obj/machinery/smartfridge/chemistry/virology,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (EAST)";
icon_state = "podhatch";
dir = 4
},
/area/ruin/powered/syndicate_lava_base)
+"bN" = (
+/obj/machinery/vending/toyliberationstation{
+ req_access_txt = "150"
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/ruin/powered/syndicate_lava_base)
"bO" = (
/obj/machinery/iv_drip,
/obj/item/weapon/reagent_containers/blood/random,
@@ -925,15 +929,10 @@
/turf/closed/wall/mineral/plastitanium,
/area/ruin/powered/syndicate_lava_base)
"cj" = (
-/turf/open/floor/plasteel/podhatch{
- dir = 8
- },
-/area/ruin/powered/syndicate_lava_base)
-"ck" = (
/obj/structure/sign/biohazard,
/turf/closed/wall/mineral/plastitanium,
/area/ruin/powered/syndicate_lava_base)
-"cl" = (
+"ck" = (
/obj/machinery/door/airlock/hatch{
name = "Virology Lab";
req_access_txt = "150"
@@ -942,7 +941,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cm" = (
+"cl" = (
/obj/structure/rack,
/obj/item/ammo_box/foambox{
pixel_x = -3;
@@ -957,7 +956,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cn" = (
+"cm" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
@@ -965,28 +964,28 @@
dir = 9
},
/area/ruin/powered/syndicate_lava_base)
-"co" = (
+"cn" = (
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (NORTH)";
icon_state = "podhatch";
dir = 1
},
/area/ruin/powered/syndicate_lava_base)
-"cp" = (
+"co" = (
/turf/open/floor/plasteel/podhatch/corner{
tag = "icon-podhatchcorner (EAST)";
icon_state = "podhatchcorner";
dir = 4
},
/area/ruin/powered/syndicate_lava_base)
-"cq" = (
+"cp" = (
/turf/open/floor/plasteel/podhatch/corner{
tag = "icon-podhatchcorner (WEST)";
icon_state = "podhatchcorner";
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cr" = (
+"cq" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1
@@ -995,13 +994,13 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cs" = (
+"cr" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/structure/sign/bluecross_2,
/turf/open/floor/plating,
/area/ruin/powered/syndicate_lava_base)
-"ct" = (
+"cs" = (
/obj/structure/table,
/obj/item/weapon/storage/firstaid/regular{
pixel_x = 3;
@@ -1014,7 +1013,7 @@
},
/turf/open/floor/plasteel/vault,
/area/ruin/powered/syndicate_lava_base)
-"cu" = (
+"ct" = (
/obj/machinery/sleeper/syndie{
dir = 8
},
@@ -1022,7 +1021,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cv" = (
+"cu" = (
/obj/structure/closet/crate/secure,
/obj/item/target,
/obj/item/target,
@@ -1036,41 +1035,38 @@
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"cw" = (
+"cv" = (
/turf/open/floor/plasteel/podhatch{
dir = 10
},
/area/ruin/powered/syndicate_lava_base)
-"cx" = (
+"cw" = (
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"cy" = (
+"cx" = (
/obj/structure/extinguisher_cabinet{
pixel_y = -32
},
/turf/open/floor/plasteel/podhatch,
/area/ruin/powered/syndicate_lava_base)
-"cz" = (
-/turf/open/floor/plasteel/podhatch,
-/area/ruin/powered/syndicate_lava_base)
-"cA" = (
+"cy" = (
/turf/open/floor/plasteel/podhatch/corner{
tag = "icon-podhatchcorner (NORTH)";
icon_state = "podhatchcorner";
dir = 1
},
/area/ruin/powered/syndicate_lava_base)
-"cB" = (
+"cz" = (
/turf/open/floor/plasteel/podhatch/corner,
/area/ruin/powered/syndicate_lava_base)
-"cC" = (
+"cA" = (
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (SOUTHEAST)";
icon_state = "podhatch";
dir = 6
},
/area/ruin/powered/syndicate_lava_base)
-"cD" = (
+"cB" = (
/obj/machinery/door/airlock/hatch{
name = "Infirmary";
req_access_txt = "150"
@@ -1079,7 +1075,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cE" = (
+"cC" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/item/weapon/reagent_containers/blood/random,
@@ -1087,7 +1083,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cF" = (
+"cD" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor/preopen{
@@ -1096,7 +1092,7 @@
},
/turf/open/floor/plating,
/area/ruin/powered/syndicate_lava_base)
-"cG" = (
+"cE" = (
/obj/machinery/door/airlock/hatch{
name = "Experimentation Room";
req_access_txt = "150"
@@ -1105,7 +1101,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cH" = (
+"cF" = (
/obj/machinery/door/airlock/hatch{
name = "Telecommunications Control";
req_access_txt = "150"
@@ -1114,10 +1110,10 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cI" = (
+"cG" = (
/turf/open/floor/engine,
/area/ruin/powered/syndicate_lava_base)
-"cJ" = (
+"cH" = (
/obj/structure/noticeboard{
pixel_y = 32
},
@@ -1125,7 +1121,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cK" = (
+"cI" = (
/obj/structure/table,
/obj/item/weapon/storage/toolbox/syndicate,
/obj/item/device/multitool,
@@ -1133,7 +1129,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cL" = (
+"cJ" = (
/obj/item/weapon/surgicaldrill,
/obj/item/weapon/circular_saw,
/obj/structure/table/reinforced,
@@ -1141,7 +1137,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cM" = (
+"cK" = (
/obj/structure/sink{
dir = 4;
icon_state = "sink";
@@ -1155,7 +1151,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cN" = (
+"cL" = (
/obj/item/stack/cable_coil/white{
pixel_x = 3;
pixel_y = 3
@@ -1167,14 +1163,14 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cO" = (
+"cM" = (
/obj/structure/table/reinforced,
/obj/item/device/flashlight/lamp,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cP" = (
+"cN" = (
/obj/structure/table/reinforced,
/obj/item/device/radio/intercom{
broadcasting = 0;
@@ -1188,19 +1184,19 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cQ" = (
+"cO" = (
/obj/machinery/computer/camera_advanced,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cR" = (
+"cP" = (
/obj/structure/filingcabinet/chestdrawer,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cS" = (
+"cQ" = (
/obj/item/weapon/cautery,
/obj/item/weapon/scalpel,
/obj/structure/table/reinforced,
@@ -1208,14 +1204,14 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cT" = (
+"cR" = (
/obj/structure/table/optable,
/obj/item/weapon/surgical_drapes,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cU" = (
+"cS" = (
/obj/item/weapon/retractor,
/obj/item/weapon/hemostat,
/obj/structure/table/reinforced,
@@ -1223,7 +1219,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cV" = (
+"cT" = (
/obj/structure/sign/nosmoking_2{
pixel_x = 32
},
@@ -1231,7 +1227,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cW" = (
+"cU" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
@@ -1242,7 +1238,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"cX" = (
+"cV" = (
/obj/structure/table/reinforced,
/obj/item/device/radio/intercom{
broadcasting = 1;
@@ -1256,13 +1252,13 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"cY" = (
+"cW" = (
/obj/structure/sign/fire{
pixel_x = -32
},
/turf/open/floor/engine,
/area/ruin/powered/syndicate_lava_base)
-"cZ" = (
+"cX" = (
/obj/structure/table/reinforced,
/obj/item/device/assembly/signaler,
/obj/item/device/assembly/signaler,
@@ -1273,7 +1269,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"da" = (
+"cY" = (
/obj/structure/table/reinforced,
/obj/item/stack/sheet/plasteel{
amount = 15
@@ -1284,13 +1280,13 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"db" = (
+"cZ" = (
/obj/structure/filingcabinet/security,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"dc" = (
+"da" = (
/obj/structure/table/reinforced,
/obj/item/weapon/paper_bin,
/obj/item/weapon/pen,
@@ -1298,27 +1294,27 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"dd" = (
+"db" = (
/obj/machinery/computer/message_monitor,
/obj/item/weapon/paper/monitorkey,
/turf/open/floor/plasteel/vault{
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"de" = (
+"dc" = (
/turf/open/floor/plasteel/vault{
tag = "icon-vault (NORTHEAST)";
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"df" = (
+"dd" = (
/obj/effect/baseturf_helper,
/turf/open/floor/plasteel/vault{
tag = "icon-vault (NORTHEAST)";
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"dg" = (
+"de" = (
/obj/machinery/button/door{
id = "lavalandsyndi";
name = "Syndicate Experimentor Lockdown Control";
@@ -1327,7 +1323,7 @@
},
/turf/open/floor/engine,
/area/ruin/powered/syndicate_lava_base)
-"dh" = (
+"df" = (
/obj/machinery/button/door{
id = "lavalandsyndi";
name = "Syndicate Experimentor Lockdown Control";
@@ -1338,7 +1334,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"di" = (
+"dg" = (
/obj/item/stack/sheet/mineral/plastitanium{
amount = 30
},
@@ -1350,16 +1346,16 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"dj" = (
+"dh" = (
/obj/structure/filingcabinet/medical,
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"dk" = (
+"di" = (
/turf/open/floor/circuit/green,
/area/ruin/powered/syndicate_lava_base)
-"dl" = (
+"dj" = (
/obj/machinery/door/poddoor/preopen{
id = "lavalandsyndi";
name = "Syndicate Research Experimentor Shutters"
@@ -1372,7 +1368,7 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"dm" = (
+"dk" = (
/obj/item/stack/sheet/metal{
amount = 50
},
@@ -1389,7 +1385,16 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"dn" = (
+"dl" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Self Destruct Control";
+ req_access_txt = "150"
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 8
+ },
+/area/ruin/powered/syndicate_lava_base)
+"dm" = (
/obj/machinery/telecomms/relay/preset/ruskie{
use_power = 0
},
@@ -1398,7 +1403,7 @@
dir = 5
},
/area/ruin/powered/syndicate_lava_base)
-"do" = (
+"dn" = (
/obj/machinery/door/airlock/hatch{
name = "Syndicate Recon Outpost";
req_access_txt = "150"
@@ -1408,6 +1413,9 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
+"do" = (
+/turf/open/floor/circuit/red,
+/area/ruin/powered/syndicate_lava_base)
"dp" = (
/obj/machinery/door/airlock/hatch{
name = "Monkey Pen";
@@ -1434,6 +1442,10 @@
},
/area/ruin/powered/syndicate_lava_base)
"ds" = (
+/obj/machinery/syndicatebomb/self_destruct,
+/turf/open/floor/circuit/red,
+/area/ruin/powered/syndicate_lava_base)
+"dt" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/mob/living/carbon/monkey,
@@ -1441,85 +1453,12 @@
dir = 8
},
/area/ruin/powered/syndicate_lava_base)
-"dt" = (
+"du" = (
/obj/structure/sign/securearea{
pixel_y = 32
},
/turf/open/floor/plating/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
-"du" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dv" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dw" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dx" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dy" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dz" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dA" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dB" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dC" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dD" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dE" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dF" = (
-/obj/machinery/door/airlock/hatch{
- name = "Self Destruct Control";
- req_access_txt = "150"
- },
-/turf/open/floor/plasteel/vault{
- dir = 8
- },
-/area/ruin/powered/syndicate_lava_base)
-"dG" = (
-/turf/open/floor/circuit/red,
-/area/ruin/powered/syndicate_lava_base)
-"dH" = (
-/obj/item/weapon/bombcore/large/underwall,
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/powered/syndicate_lava_base)
-"dI" = (
-/turf/open/floor/circuit/red,
-/area/ruin/powered/syndicate_lava_base)
-"dJ" = (
-/obj/machinery/syndicatebomb/self_destruct,
-/turf/open/floor/circuit/red,
-/area/ruin/powered/syndicate_lava_base)
-"dK" = (
-/turf/open/floor/circuit/red,
-/area/ruin/powered/syndicate_lava_base)
-"dL" = (
-/turf/open/floor/circuit/red,
-/area/ruin/powered/syndicate_lava_base)
(1,1,1) = {"
aa
@@ -1831,7 +1770,7 @@ ad
ad
ad
ad
-dD
+ae
ad
ad
ac
@@ -1856,23 +1795,23 @@ ad
ad
ad
ad
-dw
+ae
ad
ad
ad
ad
ad
ad
-dA
+ae
ad
ad
-cI
-cI
-cI
-cY
-cI
-cI
-cI
+cG
+cG
+cG
+cW
+cG
+cG
+cG
ad
ac
ab
@@ -1892,27 +1831,27 @@ ab
ab
ab
ad
-ap
-ap
-ap
+aq
+aq
+aq
aY
-ap
+aq
aY
-bA
-bK
-ap
+bz
+bJ
+bN
bV
cf
-cm
-cv
+cl
+cu
ad
-cI
-cI
-cI
-cI
-cI
-cI
-cI
+cG
+cG
+cG
+cG
+cG
+cG
+cG
ad
ab
ab
@@ -1932,27 +1871,27 @@ ab
ab
ab
ad
-ap
-aP
-aN
-aN
-aN
-aN
-bB
-aN
-ap
-ap
+aq
+aQ
+aO
+aO
+aO
+aO
+bA
+aO
+aq
+aq
cg
-ap
-ap
-cF
-cI
-cI
-cI
-cI
-cI
-cI
-cI
+aq
+aq
+cD
+cG
+cG
+cG
+cG
+cG
+cG
+cG
ad
ab
ab
@@ -1972,27 +1911,27 @@ ab
ac
ac
ad
-ap
-ap
-ap
+aq
+aq
+aq
aZ
-ap
+aq
aZ
-bA
-bL
-ap
+bz
+bK
+aq
bW
ad
-aR
-ap
+aS
+aq
ad
-cI
-cI
-cI
-cI
-cI
-cI
-cI
+cG
+cG
+cG
+cG
+cG
+cG
+cG
ad
ab
ab
@@ -2023,16 +1962,16 @@ ad
ad
ad
ad
-bv
+bu
cg
ad
-cI
-cI
-cI
-cI
-cI
-cI
-cI
+cG
+cG
+cG
+cG
+cG
+cG
+cG
ad
ac
ab
@@ -2049,30 +1988,30 @@ ab
ab
ab
ad
-an
-av
-az
-aI
-aQ
+ao
+aw
+aA
+aJ
+aR
aU
ba
ad
-bi
-bC
-aR
+bh
+bB
+aS
bO
bO
cf
-cn
-cw
+cm
+cv
ad
-cI
-cI
-cI
-cI
-cI
-cI
-cI
+cG
+cG
+cG
+cG
+cG
+cG
+cG
ad
ac
ab
@@ -2089,30 +2028,30 @@ ab
ab
ab
ad
-ao
ap
-ao
+aq
ap
+aq
+aq
ap
-ao
-ap
+aq
ad
-bj
-bD
-ap
-ao
+bi
+bC
+aq
ap
+aq
ch
-co
-cz
+cn
+cw
ad
-cI
-cI
-cI
-cI
-dg
-cI
-cI
+cG
+cG
+cG
+cG
+de
+cG
+cG
ad
ac
ac
@@ -2129,31 +2068,31 @@ ab
ab
ac
ad
+aq
ap
-ao
+aq
ap
-ao
-ao
ap
-ao
+aq
+ap
ad
-bk
-bE
-ap
-ap
-ap
+bj
+bD
+aq
+aq
+aq
ci
-co
-cy
+cn
+cx
ad
cf
-cF
-cF
-cF
+cD
+cD
+cD
ad
-dl
+dj
ad
-dH
+ae
ad
ad
ab
@@ -2169,32 +2108,32 @@ ab
ab
ac
ad
+ar
+ax
+aB
+ad
+aS
aq
-aw
-aA
+bb
ad
-aR
-ap
-bc
-ad
-bl
-bF
-ap
+bk
+bE
+aq
bP
bX
ad
-co
-cz
-dB
-aR
-cN
-bG
-cZ
-dh
-ap
-cW
-bv
-ds
+cn
+cw
+ae
+aS
+cL
+bF
+cX
+df
+aq
+cU
+bu
+dt
ad
ab
ab
@@ -2216,25 +2155,25 @@ ad
ad
aV
ad
-dx
-bm
-bF
-ap
+ae
+bl
+bE
+aq
bQ
bY
-bv
-co
-cz
-cG
-ap
-ap
-ap
-ap
-ap
-ap
-ap
+bu
+cn
+cw
+cE
+aq
+aq
+aq
+aq
+aq
+aq
+aq
dp
-aN
+aO
ad
ab
ab
@@ -2248,33 +2187,33 @@ ab
ab
ab
ad
-ae
-ar
-ar
-aB
-aJ
+af
+as
+as
+aC
+aK
+aq
ap
-ao
-bd
+bc
ad
-bn
-bG
-bM
+bm
+bF
+bL
bR
bZ
ad
-co
-cz
+cn
+cw
cf
-ap
-ap
-cV
-da
-di
-dm
-aR
-bv
-ds
+aq
+aq
+cT
+cY
+dg
+dk
+aS
+bu
+dt
ad
ab
ab
@@ -2288,23 +2227,23 @@ ab
ab
ab
ad
-af
-ar
-ar
-aC
-aK
-ao
+ag
+as
+as
+aD
+aL
ap
-be
+aq
+bd
ad
ad
-bv
-bv
-bv
+bu
+bu
+bu
ad
ad
-co
-cz
+cn
+cw
ad
ad
ad
@@ -2316,7 +2255,7 @@ ad
ad
ad
ad
-dt
+du
ab
ab
ab
@@ -2328,34 +2267,34 @@ ab
ab
ab
ad
-ag
-ar
-ar
-aD
-aL
+ah
+as
+as
+aE
+aM
+aq
ap
-ao
-ap
-bh
-bo
+aq
+bg
+bn
aY
aY
aY
aY
aY
-cp
-cA
+co
+cy
aY
aY
aY
aY
aY
aY
-cw
-do
+cv
+dn
dq
-aN
-do
+aO
+dn
ab
ab
ab
@@ -2367,35 +2306,35 @@ ab
ab
ab
ab
-du
+ae
ad
-ar
-ar
-aE
-aK
-ao
+as
+as
+aF
+aL
ap
-ao
-bh
-bp
+aq
+ap
+bg
+bo
aZ
aZ
aZ
aZ
aZ
-cq
-cB
+cp
+cz
aZ
aZ
aZ
aZ
aZ
aZ
-cC
-do
+cA
+dn
dr
-aN
-do
+aO
+dn
ab
ab
ab
@@ -2408,23 +2347,23 @@ ab
ab
ab
ad
-ah
-ar
-ar
-aF
-ao
+ai
+as
+as
+aG
ap
-ao
-bc
+aq
+ap
+bb
ad
ad
-bv
-bv
-bv
+bu
+bu
+bu
ad
ad
-co
-cz
+cn
+cw
ad
ad
ad
@@ -2436,7 +2375,7 @@ ad
ad
ad
ad
-dt
+du
ab
ab
ab
@@ -2448,30 +2387,30 @@ ab
ab
ab
ad
-ai
-ar
-ar
-aG
+aj
+as
+as
+aH
+aq
ap
-ao
-ap
-bf
+aq
+be
ad
-bq
-bH
-bN
+bp
+bG
+bM
bS
ca
-ck
-co
-cz
-dC
-aR
-ap
-cW
-db
-dj
-dE
+cj
+cn
+cw
+ae
+aS
+aq
+cU
+cZ
+dh
+ae
ac
ac
ac
@@ -2497,20 +2436,20 @@ ad
aT
ad
ad
-br
-bI
-ap
-ap
+bq
+bH
+aq
+aq
cb
-cl
-co
-cz
-cH
+ck
+cn
+cw
+cF
+aq
ap
-ao
-ao
-ao
ap
+ap
+aq
ad
ac
ac
@@ -2528,29 +2467,29 @@ ab
ab
ab
ad
-aj
-as
-ax
-aH
-aM
+ak
+at
+ay
+aI
+aN
ad
-ap
-aR
+aq
+aS
ad
-bs
-ap
-ao
+br
+aq
ap
+aq
bP
ad
-co
-cz
+cn
+cw
cf
-ap
-cO
-cX
-dc
-ap
+aq
+cM
+cV
+da
+aq
ad
ad
ad
@@ -2568,33 +2507,33 @@ ab
ab
ab
ad
-ak
-at
-at
-at
-aN
+al
+au
+au
+au
+aO
aT
-ap
-ap
+aq
+aq
ad
-bt
-ap
-ao
+bs
+aq
ap
+aq
cc
-bv
-co
-cz
+bu
+cn
+cw
ad
-cJ
-cP
-bI
-dd
-ap
+cH
+cN
+bH
+db
+aq
ad
-ap
-dI
-ap
+aq
+do
+aq
ad
ab
ab
@@ -2610,31 +2549,31 @@ ab
ad
ad
ad
-dv
+ae
ad
ad
ad
+aq
+aq
+ad
+bt
+aq
ap
-ap
-ad
-bu
-ap
-ao
bT
cd
-bv
-co
-cz
+bu
+cn
+cw
ad
-ap
-cQ
-ap
-ap
-ap
-dF
-dG
-dJ
-dL
+aq
+cO
+aq
+aq
+aq
+dl
+do
+ds
+do
ad
ab
ab
@@ -2648,33 +2587,33 @@ ab
ab
ab
ad
-al
-at
-at
-at
-aN
+am
+au
+au
+au
+aO
aT
+aq
+aq
+ae
+bu
+bu
ap
-ap
-dy
-bv
-bv
-ao
-by
-by
-dz
-cr
-cC
+bx
+bx
+ae
+cq
+cA
ad
-cK
-cR
-aN
-aN
-bL
+cI
+cP
+aO
+aO
+bK
ad
-ap
-dK
-ap
+aq
+do
+aq
ad
ab
ab
@@ -2688,28 +2627,28 @@ ab
ab
ab
ad
-am
-au
-ay
-au
+an
+av
+az
+av
+aP
+ad
+aq
+aS
+ad
+bv
+bI
+ap
+bI
aO
ad
-ap
-aR
-ad
-bw
-bJ
-ao
-bJ
-aN
-ad
-cs
-cD
+cr
+cB
ad
ad
ad
ad
-cH
+cF
ad
ad
ad
@@ -2737,21 +2676,21 @@ ad
aW
ad
ad
+bw
+bx
+ap
bx
-by
-ao
-by
ce
ad
-ct
-ap
-ap
-cL
-cS
+cs
+aq
+aq
+cJ
+cQ
ad
-de
-dk
-dk
+dc
+di
+di
ad
ab
ab
@@ -2775,23 +2714,23 @@ ab
ac
ad
aX
-bg
+bf
ad
-by
-by
-ao
-by
-by
+bx
+bx
+ap
+bx
+bx
ad
-ap
-ap
-ap
-ap
-cT
+aq
+aq
+aq
+aq
+cR
ad
-df
-dk
-dn
+dd
+di
+dm
ad
ab
ab
@@ -2817,21 +2756,21 @@ ad
ad
ad
ad
-bx
-bJ
-ao
+bw
+bI
+ap
bU
-aN
+aO
ad
-cu
-cE
-cu
-cM
-cU
+ct
+cC
+ct
+cK
+cS
ad
-de
-dk
-dk
+dc
+di
+di
ad
ac
ab
@@ -2857,10 +2796,10 @@ ab
ab
ac
ad
-bz
-by
-ao
by
+bx
+ap
+bx
ce
ad
ad
diff --git a/_maps/basemap.dm b/_maps/basemap.dm
index 1268d3a630..6d5747fa5c 100644
--- a/_maps/basemap.dm
+++ b/_maps/basemap.dm
@@ -1,7 +1,30 @@
-#ifndef ALL_MAPS
-#include "map_files\generic\SpaceStation.dmm"
-#include "map_files\generic\Centcomm.dmm"
-#include "map_files\generic\Space.dmm"
-#include "map_files\generic\SpaceDock.dmm"
+#ifndef ALL_MAPS
+
+#include "map_files\generic\SpaceStation.dmm"
+#include "map_files\generic\Centcomm.dmm"
+#include "map_files\generic\Space.dmm"
+#include "map_files\generic\SpaceDock.dmm"
+#include "map_files\Mining\lavaland.dmm"
+
+#else
+
+#include "map_files\debug\runtimestation.dmm"
+#include "map_files\Deltastation\DeltaStation2.dmm"
+#include "map_files\MetaStation\MetaStation.dmm"
+#include "map_files\OmegaStation\OmegaStation.dmm"
+#include "map_files\PubbyStation\PubbyStation.dmm"
+#include "map_files\TgStation\tgstation.2.1.3.dmm"
+#include "map_files\Cerestation\cerestation.dmm"
+
+#include "map_files\generic\Centcomm.dmm"
+#include "map_files\generic\SpaceStation.dmm"
+#include "map_files\generic\Space.dmm"
+#include "map_files\generic\SpaceDock.dmm"
+
#include "map_files\Mining\Lavaland.dmm"
+
+#ifdef TRAVISBUILDING
+#include "templates.dm"
+#endif
+
#endif
\ No newline at end of file
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index b00c11274b..229d5755a1 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1142,6 +1142,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1338,6 +1342,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1356,6 +1367,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -53772,6 +53790,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -112232,11 +112254,11 @@ btp
cbv
ccq
bns
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
@@ -112489,13 +112511,13 @@ ckS
bky
ccq
cds
-cjD
+aof
ckt
cly
cmw
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113003,13 +113025,13 @@ cbg
bTr
cct
cdu
-cjG
+aqx
cku
clz
cmx
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113260,11 +113282,11 @@ bky
bky
bky
bky
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index c33543ac4e..f5879c52b1 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -1,12 +1,12 @@
-#define MC_TICK_CHECK ( ( world.tick_usage > GLOB.CURRENT_TICKLIMIT || src.state != SS_RUNNING ) ? pause() : 0 )
+#define MC_TICK_CHECK ( ( world.tick_usage > Master.current_ticklimit || src.state != SS_RUNNING ) ? pause() : 0 )
-#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = GLOB.CURRENT_TICKLIMIT; var/split_tick_phases = ##phase_count
+#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count
#define MC_SPLIT_TICK \
if(split_tick_phases > 1){\
- GLOB.CURRENT_TICKLIMIT = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\
+ Master.current_ticklimit = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\
--split_tick_phases;\
} else {\
- GLOB.CURRENT_TICKLIMIT = original_tick_limit;\
+ Master.current_ticklimit = original_tick_limit;\
}
// Used to smooth out costs to try and avoid oscillation.
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index a3570d840d..49e03bdbdf 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -80,6 +80,15 @@
#define AI_IDLE 2
#define AI_OFF 3
+#define ENVIRONMENT_SMASH_NONE 0
+
+#define ENVIRONMENT_SMASH_STRUCTURES 1
+
+#define ENVIRONMENT_SMASH_WALLS 2
+
+#define ENVIRONMENT_SMASH_RWALLS 3
+
+
//SNPCs
//AI defines
#define INTERACTING 2
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 69bc163234..834097bd44 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -39,4 +39,5 @@
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
-#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
\ No newline at end of file
+#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
+#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 66f5960d98..8c8b360497 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -41,6 +41,7 @@
// Subsystem init_order, from highest priority to lowest priority
// The numbers just define the ordering, they are meaningless otherwise.
+#define INIT_ORDER_SERVER_MAINT 16
#define INIT_ORDER_JOBS 15
#define INIT_ORDER_EVENTS 14
#define INIT_ORDER_TICKER 13
diff --git a/code/__DEFINES/tick.dm b/code/__DEFINES/tick.dm
index 0c8c17da6f..4c88fd643e 100644
--- a/code/__DEFINES/tick.dm
+++ b/code/__DEFINES/tick.dm
@@ -3,5 +3,5 @@
#define TICK_LIMIT_MC 70
#define TICK_LIMIT_MC_INIT_DEFAULT 98
-#define TICK_CHECK ( world.tick_usage > GLOB.CURRENT_TICKLIMIT )
+#define TICK_CHECK ( world.tick_usage > Master.current_ticklimit )
#define CHECK_TICK if TICK_CHECK stoplag()
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 43b657dd9c..6a4ec3456e 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -340,20 +340,20 @@ Proc for attack log creation, because really why not
qdel(progbar)
-//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
-/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
- if(check_clicks && next_move > world.time)
- return FALSE
- return TRUE
-
-//pass a list in the format list("health" = mob's health var) to check health during this
-/mob/living/break_do_after_checks(list/checked_health, check_clicks)
- if(islist(checked_health))
- if(health < checked_health["health"])
- return FALSE
- checked_health["health"] = health
- return ..()
-
+//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
+/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
+ if(check_clicks && next_move > world.time)
+ return FALSE
+ return TRUE
+
+//pass a list in the format list("health" = mob's health var) to check health during this
+/mob/living/break_do_after_checks(list/checked_health, check_clicks)
+ if(islist(checked_health))
+ if(health < checked_health["health"])
+ return FALSE
+ checked_health["health"] = health
+ return ..()
+
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null)
if(!user)
return 0
diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm
index c26126c0a6..7da17da503 100644
--- a/code/__HELPERS/sorts/__main.dm
+++ b/code/__HELPERS/sorts/__main.dm
@@ -626,14 +626,13 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new())
var/val2 = fetchElement(L,cursor2)
while(1)
- if(call(cmp)(val1,val2) < 0)
+ if(call(cmp)(val1,val2) <= 0)
if(++cursor1 >= end1)
break
val1 = fetchElement(L,cursor1)
else
moveElement(L,cursor2,cursor1)
- ++cursor2
if(++cursor2 >= end2)
break
++end1
@@ -653,4 +652,4 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new())
#undef MIN_GALLOP
#undef MIN_MERGE
-#undef fetchElement
\ No newline at end of file
+#undef fetchElement
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index f35a6eaa15..ea3811085b 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -723,7 +723,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Irregular objects
var/icon/AMicon = icon(AM.icon, AM.icon_state)
var/icon/AMiconheight = AMicon.Height()
- var/icon/AMiconwidth = AMicon.Width()
+ var/icon/AMiconwidth = AMicon.Width()
if(AMiconheight != world.icon_size || AMiconwidth != world.icon_size)
pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5)
pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5)
@@ -1215,7 +1215,7 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types())
. += round(i*DELTA_CALC)
sleep(i*world.tick_lag*DELTA_CALC)
i *= 2
- while (world.tick_usage > min(TICK_LIMIT_TO_RUN, GLOB.CURRENT_TICKLIMIT))
+ while (world.tick_usage > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit))
#undef DELTA_CALC
diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm
index 806ac576d4..f5b0d8a041 100644
--- a/code/_globalvars/game_modes.dm
+++ b/code/_globalvars/game_modes.dm
@@ -1,4 +1,4 @@
-GLOBAL_VAR_INIT(master_mode, "traitor") //"extended"
+GLOBAL_VAR_INIT(master_mode, "traitor") //"extended"
GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode
GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 1241708b5c..bb41c82ddb 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -161,3 +161,4 @@ GLOBAL_LIST_INIT(numbers_as_words, list("One", "Two", "Three", "Four",
return L
GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings())
+GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!"))
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 285746cbd7..fbe9584262 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(fileaccess_timer, 0)
GLOBAL_VAR_INIT(TAB, " ")
-GLOBAL_DATUM(data_core, /datum/datacore)
+GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm
index 1ceeb182ed..7b6e2f108a 100644
--- a/code/_onclick/autoclick.dm
+++ b/code/_onclick/autoclick.dm
@@ -14,7 +14,7 @@
selected_target[1] = null
/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
- if(selected_target[1] && over_object.IsAutoclickable())
+ if(selected_target[1] && over_object && over_object.IsAutoclickable())
selected_target[1] = over_object
selected_target[2] = params
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index ad4a84529b..a9f76f7f9d 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -1,149 +1,149 @@
-/*
- Click code cleanup
- ~Sayu
-*/
-
-// 1 decisecond click delay (above and beyond mob/next_move)
-//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move()
-/mob/var/next_click = 0
-
-// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or -
-/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by
-
-
-//Delays the mob's next click/action by num deciseconds
-// eg: 10-3 = 7 deciseconds of delay
-// eg: 10*0.5 = 5 deciseconds of delay
-// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-
-/mob/proc/changeNext_move(num)
- next_move = world.time + ((num+next_move_adjust)*next_move_modifier)
-
-
-/*
- Before anything else, defer these calls to a per-mobtype handler. This allows us to
- remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
-
- Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however,
- that's a lot of code duplication and is hard to maintain.
-
- Note that this proc can be overridden, and is in the case of screen objects.
-*/
-/atom/Click(location,control,params)
- if(initialized)
- usr.ClickOn(src, params)
-
-/atom/DblClick(location,control,params)
- if(initialized)
- usr.DblClickOn(src,params)
-
-/atom/MouseWheel(delta_x,delta_y,location,control,params)
- if(initialized)
- usr.MouseWheelOn(src, delta_x, delta_y, params)
-
-/*
- Standard mob ClickOn()
- Handles exceptions: Buildmode, middle click, modified clicks, mech actions
-
- After that, mostly just check your state, check whether you're holding an item,
- check whether you're adjacent to the target, then pass off the click to whoever
- is recieving it.
- The most common are:
- * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves
- * atom/attackby(item,user) - used only when adjacent
- * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
- * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
-*/
-/mob/proc/ClickOn( atom/A, params )
- if(world.time <= next_click)
- return
- next_click = world.time + 1
-
- if(client && client.click_intercept)
- if(call(client.click_intercept, "InterceptClickOn")(src, params, A))
- return
-
- var/list/modifiers = params2list(params)
- if(modifiers["shift"] && modifiers["middle"])
- ShiftMiddleClickOn(A)
- return
- if(modifiers["shift"] && modifiers["ctrl"])
- CtrlShiftClickOn(A)
- return
- if(modifiers["middle"])
- MiddleClickOn(A)
- return
- if(modifiers["shift"])
- ShiftClickOn(A)
- return
- if(modifiers["alt"]) // alt and alt-gr (rightalt)
- AltClickOn(A)
- return
- if(modifiers["ctrl"])
- CtrlClickOn(A)
- return
-
- if(incapacitated(ignore_restraints = 1))
- return
-
- face_atom(A)
-
- if(next_move > world.time) // in the year 2000...
- return
-
+/*
+ Click code cleanup
+ ~Sayu
+*/
+
+// 1 decisecond click delay (above and beyond mob/next_move)
+//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move()
+/mob/var/next_click = 0
+
+// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
+/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or -
+/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by
+
+
+//Delays the mob's next click/action by num deciseconds
+// eg: 10-3 = 7 deciseconds of delay
+// eg: 10*0.5 = 5 deciseconds of delay
+// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
+
+/mob/proc/changeNext_move(num)
+ next_move = world.time + ((num+next_move_adjust)*next_move_modifier)
+
+
+/*
+ Before anything else, defer these calls to a per-mobtype handler. This allows us to
+ remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
+
+ Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however,
+ that's a lot of code duplication and is hard to maintain.
+
+ Note that this proc can be overridden, and is in the case of screen objects.
+*/
+/atom/Click(location,control,params)
+ if(initialized)
+ usr.ClickOn(src, params)
+
+/atom/DblClick(location,control,params)
+ if(initialized)
+ usr.DblClickOn(src,params)
+
+/atom/MouseWheel(delta_x,delta_y,location,control,params)
+ if(initialized)
+ usr.MouseWheelOn(src, delta_x, delta_y, params)
+
+/*
+ Standard mob ClickOn()
+ Handles exceptions: Buildmode, middle click, modified clicks, mech actions
+
+ After that, mostly just check your state, check whether you're holding an item,
+ check whether you're adjacent to the target, then pass off the click to whoever
+ is recieving it.
+ The most common are:
+ * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves
+ * atom/attackby(item,user) - used only when adjacent
+ * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
+ * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
+*/
+/mob/proc/ClickOn( atom/A, params )
+ if(world.time <= next_click)
+ return
+ next_click = world.time + 1
+
+ if(client && client.click_intercept)
+ if(call(client.click_intercept, "InterceptClickOn")(src, params, A))
+ return
+
+ var/list/modifiers = params2list(params)
+ if(modifiers["shift"] && modifiers["middle"])
+ ShiftMiddleClickOn(A)
+ return
+ if(modifiers["shift"] && modifiers["ctrl"])
+ CtrlShiftClickOn(A)
+ return
+ if(modifiers["middle"])
+ MiddleClickOn(A)
+ return
+ if(modifiers["shift"])
+ ShiftClickOn(A)
+ return
+ if(modifiers["alt"]) // alt and alt-gr (rightalt)
+ AltClickOn(A)
+ return
+ if(modifiers["ctrl"])
+ CtrlClickOn(A)
+ return
+
+ if(incapacitated(ignore_restraints = 1))
+ return
+
+ face_atom(A)
+
+ if(next_move > world.time) // in the year 2000...
+ return
+
if(A.IsObscured())
return
- if(istype(loc,/obj/mecha))
- var/obj/mecha/M = loc
- return M.click_action(A,src,params)
-
- if(restrained())
- changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
- RestrainedClickOn(A)
- return
-
- if(in_throw_mode)
- throw_item(A)
- return
-
- var/obj/item/W = get_active_held_item()
-
- if(W == A)
- W.attack_self(src)
- update_inv_hands()
- return
-
- //These are always reachable.
- //User itself, current loc, and user inventory
- if(DirectAccess(A))
- if(W)
- melee_item_attack_chain(src,W,A,params)
- else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A)
- return
-
- //Can't reach anything else in lockers or other weirdness
- if(!loc.AllowClick())
- return
-
- //Standard reach turf to turf or reaching inside storage
- if(CanReach(A,W))
- if(W)
- melee_item_attack_chain(src,W,A,params)
- else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A,1)
- else
- if(W)
- W.afterattack(A,src,0,params)
- else
- RangedAttack(A,params)
-
+ if(istype(loc,/obj/mecha))
+ var/obj/mecha/M = loc
+ return M.click_action(A,src,params)
+
+ if(restrained())
+ changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
+ RestrainedClickOn(A)
+ return
+
+ if(in_throw_mode)
+ throw_item(A)
+ return
+
+ var/obj/item/W = get_active_held_item()
+
+ if(W == A)
+ W.attack_self(src)
+ update_inv_hands()
+ return
+
+ //These are always reachable.
+ //User itself, current loc, and user inventory
+ if(DirectAccess(A))
+ if(W)
+ melee_item_attack_chain(src,W,A,params)
+ else
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ UnarmedAttack(A)
+ return
+
+ //Can't reach anything else in lockers or other weirdness
+ if(!loc.AllowClick())
+ return
+
+ //Standard reach turf to turf or reaching inside storage
+ if(CanReach(A,W))
+ if(W)
+ melee_item_attack_chain(src,W,A,params)
+ else
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ UnarmedAttack(A,1)
+ else
+ if(W)
+ W.afterattack(A,src,0,params)
+ else
+ RangedAttack(A,params)
+
//Is the atom obscured by a PREVENT_CLICK_UNDER object above it
/atom/proc/IsObscured()
if(!isturf(loc)) //This only makes sense for things directly on turfs for now
@@ -162,306 +162,308 @@
return TRUE
return FALSE
-/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
- if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
- if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
- return TRUE
- else
- //Things inside storage insde another storage
- //Eg Contents of a box in a backpack
- var/atom/outer_storage = get_atom_on_turf(target)
- if(outer_storage == target) //whatever that is we don't want infinite loop.
- return FALSE
- if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
- return TRUE
- return FALSE
-
-//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
-/atom/proc/CanReachStorage(atom/target,user,depth)
- return FALSE
-
-/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
- while(target && depth > 0)
- target = target.loc
- depth--
- if(target == src)
- return TRUE
- return FALSE
-
-/atom/movable/proc/DirectAccess(atom/target)
- if(target == src)
- return TRUE
- if(target == loc)
- return TRUE
-
-/mob/DirectAccess(atom/target)
- if(..())
- return TRUE
- if(target in contents) //This could probably use moving down and restricting to inventory only
- return TRUE
- return FALSE
-
-/mob/living/DirectAccess(atom/target)
- if(..()) //Lightweight checks first
- return TRUE
- if(target in GetAllContents())
- return TRUE
-
-/atom/proc/AllowClick()
- return FALSE
-
-/turf/AllowClick()
- return TRUE
-
-/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
- if(!here || !there)
- return
- switch(reach)
- if(0)
- return FALSE
- if(1)
- return FALSE //here.Adjacent(there)
- if(2 to INFINITY)
- var/obj/dummy = new(get_turf(here))
- dummy.pass_flags |= PASSTABLE
- dummy.invisibility = INVISIBILITY_ABSTRACT
- for(var/i in 1 to reach) //Limit it to that many tries
- var/turf/T = get_step(dummy, get_dir(dummy, there))
- if(dummy.CanReach(there))
- qdel(dummy)
- return TRUE
- if(!dummy.Move(T)) //we're blocked!
- qdel(dummy)
- return
- qdel(dummy)
-
-// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
-/mob/proc/DblClickOn(atom/A, params)
- return
-
-
-/*
- Translates into attack_hand, etc.
-
- Note: proximity_flag here is used to distinguish between normal usage (flag=1),
- and usage when clicking on things telekinetically (flag=0). This proc will
- not be called at ranged except with telekinesis.
-
- proximity_flag is not currently passed to attack_hand, and is instead used
- in human click code to allow glove touches only at melee range.
-*/
-/mob/proc/UnarmedAttack(atom/A, proximity_flag)
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- return
-
-/*
- Ranged unarmed attack:
-
- This currently is just a default for all mobs, involving
- laser eyes and telekinesis. You could easily add exceptions
- for things like ranged glove touches, spitting alien acid/neurotoxin,
- animals lunging, etc.
-*/
-/mob/proc/RangedAttack(atom/A, params)
-/*
- Restrained ClickOn
-
- Used when you are handcuffed and click things.
- Not currently used by anything but could easily be.
-*/
-/mob/proc/RestrainedClickOn(atom/A)
- return
-
-/*
- Middle click
- Only used for swapping hands
-*/
-/mob/proc/MiddleClickOn(atom/A)
- return
-
-/mob/living/carbon/MiddleClickOn(atom/A)
- if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src))
- next_click = world.time + 5
- mind.changeling.chosen_sting.try_to_sting(src, A)
- else
- swap_hand()
-
-/mob/living/simple_animal/drone/MiddleClickOn(atom/A)
- swap_hand()
-
-// In case of use break glass
-/*
-/atom/proc/MiddleClick(mob/M as mob)
- return
-*/
-
-/*
- Shift click
- For most mobs, examine.
- This is overridden in ai.dm
-*/
-/mob/proc/ShiftClickOn(atom/A)
- A.ShiftClick(src)
- return
-/atom/proc/ShiftClick(mob/user)
- if(user.client && user.client.eye == user || user.client.eye == user.loc)
- user.examinate(src)
- return
-
-/*
- Ctrl click
- For most objects, pull
-*/
-
-/mob/proc/CtrlClickOn(atom/A)
- A.CtrlClick(src)
- return
-
-/atom/proc/CtrlClick(mob/user)
- var/mob/living/ML = user
- if(istype(ML))
- ML.pulled(src)
-
-/mob/living/carbon/human/CtrlClick(mob/user)
- if(ishuman(user) && Adjacent(user))
- var/mob/living/carbon/human/H = user
- H.dna.species.grab(H, src, H.martial_art)
- H.next_click = world.time + CLICK_CD_MELEE
- else
- ..()
-/*
- Alt click
- Unused except for AI
-*/
-/mob/proc/AltClickOn(atom/A)
- A.AltClick(src)
- return
-
-/mob/living/carbon/AltClickOn(atom/A)
- if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src))
- next_click = world.time + 5
- mind.changeling.chosen_sting.try_to_sting(src, A)
- else
- ..()
-
-/atom/proc/AltClick(mob/user)
- var/turf/T = get_turf(src)
- if(T && user.TurfAdjacent(T))
- if(user.listed_turf == T)
- user.listed_turf = null
- else
- user.listed_turf = T
- user.client.statpanel = T.name
- return
-
-/mob/proc/TurfAdjacent(turf/T)
- return T.Adjacent(src)
-
-/*
- Control+Shift click
- Unused except for AI
-*/
-/mob/proc/CtrlShiftClickOn(atom/A)
- A.CtrlShiftClick(src)
- return
-
-/mob/proc/ShiftMiddleClickOn(atom/A)
- src.pointed(A)
- return
-
-/atom/proc/CtrlShiftClick(mob/user)
- return
-
-/*
- Misc helpers
-
- Laser Eyes: as the name implies, handles this since nothing else does currently
- face_atom: turns the mob towards what you clicked on
-*/
-/mob/proc/LaserEyes(atom/A)
- return
-
-/mob/living/LaserEyes(atom/A)
- changeNext_move(CLICK_CD_RANGE)
- var/turf/T = get_turf(src)
- var/turf/U = get_turf(A)
-
- var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
- LE.icon = 'icons/effects/genetics.dmi'
- LE.icon_state = "eyelasers"
- playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
-
- LE.firer = src
- LE.def_zone = get_organ_target()
- LE.original = A
- LE.current = T
- LE.yo = U.y - T.y
- LE.xo = U.x - T.x
- LE.fire()
-
-// Simple helper to face what you clicked on, in case it should be needed in more than one place
-/mob/proc/face_atom(atom/A)
- if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y )
- return
- var/dx = A.x - x
- var/dy = A.y - y
- if(!dx && !dy) // Wall items are graphically shifted but on the floor
- if(A.pixel_y > 16)
- setDir(NORTH)
- else if(A.pixel_y < -16)
- setDir(SOUTH)
- else if(A.pixel_x > 16)
- setDir(EAST)
- else if(A.pixel_x < -16)
- setDir(WEST)
- return
-
- if(abs(dx) < abs(dy))
- if(dy > 0)
- setDir(NORTH)
- else
- setDir(SOUTH)
- else
- if(dx > 0)
- setDir(EAST)
- else
- setDir(WEST)
-
-/obj/screen/click_catcher
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "click_catcher"
- plane = CLICKCATCHER_PLANE
- mouse_opacity = 2
- screen_loc = "CENTER"
-
-/obj/screen/click_catcher/New()
- ..()
- transform = matrix(200, 0, 0, 0, 200, 0)
-
-/obj/screen/click_catcher/Click(location, control, params)
- var/list/modifiers = params2list(params)
- if(modifiers["middle"] && istype(usr, /mob/living/carbon))
- var/mob/living/carbon/C = usr
- C.swap_hand()
- else
- var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr))
- if(T)
- T.Click(location, control, params)
- . = 1
-
-
-/* MouseWheelOn */
-
-/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
- return
-
-/mob/dead/observer/MouseWheelOn(atom/A, delta_x, delta_y, params)
- var/list/modifier = params2list(params)
- if(modifier["shift"])
- var/view = 0
- if(delta_y > 0)
- view = -1
- else
- view = 1
- add_view_range(view)
+/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
+ if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
+ if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
+ return TRUE
+ else
+ //Things inside storage insde another storage
+ //Eg Contents of a box in a backpack
+ var/atom/outer_storage = get_atom_on_turf(target)
+ if(outer_storage == target) //whatever that is we don't want infinite loop.
+ return FALSE
+ if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
+ return TRUE
+ return FALSE
+
+//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
+/atom/proc/CanReachStorage(atom/target,user,depth)
+ return FALSE
+
+/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
+ while(target && depth > 0)
+ target = target.loc
+ depth--
+ if(target == src)
+ return TRUE
+ return FALSE
+
+/atom/movable/proc/DirectAccess(atom/target)
+ if(target == src)
+ return TRUE
+ if(target == loc)
+ return TRUE
+
+/mob/DirectAccess(atom/target)
+ if(..())
+ return TRUE
+ if(target in contents) //This could probably use moving down and restricting to inventory only
+ return TRUE
+ return FALSE
+
+/mob/living/DirectAccess(atom/target)
+ if(..()) //Lightweight checks first
+ return TRUE
+ if(target in GetAllContents())
+ return TRUE
+
+/atom/proc/AllowClick()
+ return FALSE
+
+/turf/AllowClick()
+ return TRUE
+
+/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
+ if(!here || !there)
+ return
+ switch(reach)
+ if(0)
+ return FALSE
+ if(1)
+ return FALSE //here.Adjacent(there)
+ if(2 to INFINITY)
+ var/obj/dummy = new(get_turf(here))
+ dummy.pass_flags |= PASSTABLE
+ dummy.invisibility = INVISIBILITY_ABSTRACT
+ for(var/i in 1 to reach) //Limit it to that many tries
+ var/turf/T = get_step(dummy, get_dir(dummy, there))
+ if(dummy.CanReach(there))
+ qdel(dummy)
+ return TRUE
+ if(!dummy.Move(T)) //we're blocked!
+ qdel(dummy)
+ return
+ qdel(dummy)
+
+// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
+/mob/proc/DblClickOn(atom/A, params)
+ return
+
+
+/*
+ Translates into attack_hand, etc.
+
+ Note: proximity_flag here is used to distinguish between normal usage (flag=1),
+ and usage when clicking on things telekinetically (flag=0). This proc will
+ not be called at ranged except with telekinesis.
+
+ proximity_flag is not currently passed to attack_hand, and is instead used
+ in human click code to allow glove touches only at melee range.
+*/
+/mob/proc/UnarmedAttack(atom/A, proximity_flag)
+ if(ismob(A))
+ changeNext_move(CLICK_CD_MELEE)
+ return
+
+/*
+ Ranged unarmed attack:
+
+ This currently is just a default for all mobs, involving
+ laser eyes and telekinesis. You could easily add exceptions
+ for things like ranged glove touches, spitting alien acid/neurotoxin,
+ animals lunging, etc.
+*/
+/mob/proc/RangedAttack(atom/A, params)
+/*
+ Restrained ClickOn
+
+ Used when you are handcuffed and click things.
+ Not currently used by anything but could easily be.
+*/
+/mob/proc/RestrainedClickOn(atom/A)
+ return
+
+/*
+ Middle click
+ Only used for swapping hands
+*/
+/mob/proc/MiddleClickOn(atom/A)
+ return
+
+/mob/living/carbon/MiddleClickOn(atom/A)
+ if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src))
+ next_click = world.time + 5
+ mind.changeling.chosen_sting.try_to_sting(src, A)
+ else
+ swap_hand()
+
+/mob/living/simple_animal/drone/MiddleClickOn(atom/A)
+ swap_hand()
+
+// In case of use break glass
+/*
+/atom/proc/MiddleClick(mob/M as mob)
+ return
+*/
+
+/*
+ Shift click
+ For most mobs, examine.
+ This is overridden in ai.dm
+*/
+/mob/proc/ShiftClickOn(atom/A)
+ A.ShiftClick(src)
+ return
+/atom/proc/ShiftClick(mob/user)
+ if(user.client && user.client.eye == user || user.client.eye == user.loc)
+ user.examinate(src)
+ return
+
+/*
+ Ctrl click
+ For most objects, pull
+*/
+
+/mob/proc/CtrlClickOn(atom/A)
+ A.CtrlClick(src)
+ return
+
+/atom/proc/CtrlClick(mob/user)
+ var/mob/living/ML = user
+ if(istype(ML))
+ ML.pulled(src)
+
+/mob/living/carbon/human/CtrlClick(mob/user)
+ if(ishuman(user) && Adjacent(user))
+ if(world.time < user.next_move)
+ return FALSE
+ var/mob/living/carbon/human/H = user
+ H.dna.species.grab(H, src, H.mind.martial_art)
+ H.changeNext_move(CLICK_CD_MELEE)
+ else
+ ..()
+/*
+ Alt click
+ Unused except for AI
+*/
+/mob/proc/AltClickOn(atom/A)
+ A.AltClick(src)
+ return
+
+/mob/living/carbon/AltClickOn(atom/A)
+ if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src))
+ next_click = world.time + 5
+ mind.changeling.chosen_sting.try_to_sting(src, A)
+ else
+ ..()
+
+/atom/proc/AltClick(mob/user)
+ var/turf/T = get_turf(src)
+ if(T && user.TurfAdjacent(T))
+ if(user.listed_turf == T)
+ user.listed_turf = null
+ else
+ user.listed_turf = T
+ user.client.statpanel = T.name
+ return
+
+/mob/proc/TurfAdjacent(turf/T)
+ return T.Adjacent(src)
+
+/*
+ Control+Shift click
+ Unused except for AI
+*/
+/mob/proc/CtrlShiftClickOn(atom/A)
+ A.CtrlShiftClick(src)
+ return
+
+/mob/proc/ShiftMiddleClickOn(atom/A)
+ src.pointed(A)
+ return
+
+/atom/proc/CtrlShiftClick(mob/user)
+ return
+
+/*
+ Misc helpers
+
+ Laser Eyes: as the name implies, handles this since nothing else does currently
+ face_atom: turns the mob towards what you clicked on
+*/
+/mob/proc/LaserEyes(atom/A)
+ return
+
+/mob/living/LaserEyes(atom/A)
+ changeNext_move(CLICK_CD_RANGE)
+ var/turf/T = get_turf(src)
+ var/turf/U = get_turf(A)
+
+ var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
+ LE.icon = 'icons/effects/genetics.dmi'
+ LE.icon_state = "eyelasers"
+ playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
+
+ LE.firer = src
+ LE.def_zone = get_organ_target()
+ LE.original = A
+ LE.current = T
+ LE.yo = U.y - T.y
+ LE.xo = U.x - T.x
+ LE.fire()
+
+// Simple helper to face what you clicked on, in case it should be needed in more than one place
+/mob/proc/face_atom(atom/A)
+ if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y )
+ return
+ var/dx = A.x - x
+ var/dy = A.y - y
+ if(!dx && !dy) // Wall items are graphically shifted but on the floor
+ if(A.pixel_y > 16)
+ setDir(NORTH)
+ else if(A.pixel_y < -16)
+ setDir(SOUTH)
+ else if(A.pixel_x > 16)
+ setDir(EAST)
+ else if(A.pixel_x < -16)
+ setDir(WEST)
+ return
+
+ if(abs(dx) < abs(dy))
+ if(dy > 0)
+ setDir(NORTH)
+ else
+ setDir(SOUTH)
+ else
+ if(dx > 0)
+ setDir(EAST)
+ else
+ setDir(WEST)
+
+/obj/screen/click_catcher
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "click_catcher"
+ plane = CLICKCATCHER_PLANE
+ mouse_opacity = 2
+ screen_loc = "CENTER"
+
+/obj/screen/click_catcher/New()
+ ..()
+ transform = matrix(200, 0, 0, 0, 200, 0)
+
+/obj/screen/click_catcher/Click(location, control, params)
+ var/list/modifiers = params2list(params)
+ if(modifiers["middle"] && istype(usr, /mob/living/carbon))
+ var/mob/living/carbon/C = usr
+ C.swap_hand()
+ else
+ var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr))
+ if(T)
+ T.Click(location, control, params)
+ . = 1
+
+
+/* MouseWheelOn */
+
+/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
+ return
+
+/mob/dead/observer/MouseWheelOn(atom/A, delta_x, delta_y, params)
+ var/list/modifier = params2list(params)
+ if(modifier["shift"])
+ var/view = 0
+ if(delta_y > 0)
+ view = -1
+ else
+ view = 1
+ add_view_range(view)
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 90b3983d82..c7ad66440e 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -13,7 +13,7 @@
/atom/proc/attack_tk(mob/user)
if(user.stat)
return
- new /obj/effect/overlay/temp/telekinesis(loc)
+ new /obj/effect/temp_visual/telekinesis(loc)
user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc
return
@@ -163,7 +163,7 @@
/obj/item/tk_grab/proc/apply_focus_overlay()
if(!focus)
return
- new /obj/effect/overlay/temp/telekinesis(get_turf(focus))
+ new /obj/effect/temp_visual/telekinesis(get_turf(focus))
/obj/item/tk_grab/update_icon()
cut_overlays()
diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm
index d0268d0bec..a69411f32b 100644
--- a/code/citadel/cit_arousal.dm
+++ b/code/citadel/cit_arousal.dm
@@ -254,16 +254,34 @@
"You cum into [SC].", \
"You have relieved yourself.")
finished = 1
-
+
+ if(/obj/item/organ/genital/vagina)
+ var/obj/item/organ/genital/vagina/V = SG
+ if(!V.linked_womb)
+ src << "No womb!"
+ return
+ fluid_source = V.linked_womb.reagents
+ total_cum = fluid_source.total_volume
+ if(into_container)//into a glass or beaker or whatever
+ src.visible_message("[src] starts fingering their vagina over [SC].", \
+ "You start fingering over [SC.name].", \
+ "You start masturbating.")
+ if(do_after(src, mb_time, target = src) && in_range(src, SC))
+ fluid_source.trans_to(SC, total_cum)
+ src.visible_message("[src] orgasms, [pick("cumming into", "emptying themself into")] [SC]!", \
+ "You cum into [SC].", \
+ "You have relieved yourself.")
+ finished = 1
+
else//not into a container
- src.visible_message("[src] starts [pick("jerking off","stroking")] their [pick(GLOB.dick_nouns)].", \
- "You start jerking off your [pick(GLOB.dick_nouns)].", \
+ src.visible_message("[src] starts fingering their vagina.", \
+ "You start fingering your vagina.", \
"You start masturbating.")
if(do_after(src, mb_time, target = src))
if(total_cum > 5)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] orgasms, [pick("shooting cum", "draining their balls")][istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
"You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
"You have relieved yourself.")
finished = 1
diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm
index 794a3ad553..8718ebb19f 100644
--- a/code/citadel/cit_reagents.dm
+++ b/code/citadel/cit_reagents.dm
@@ -80,7 +80,7 @@
var/obj/effect/decal/cleanable/femcum/S = locate() in T
if(!S)
S = new(T)
- S.reagents.add_reagent("semen", reac_volume)
+ S.reagents.add_reagent("femcum", reac_volume)
if(data["blood_DNA"])
S.blood_DNA[data["blood_DNA"]] = data["blood_type"]
@@ -219,4 +219,4 @@
results = list("anaphro+" = 1)
required_reagents = list("anaphro" = 5, "acetone" = 1)
required_temp = 300
- mix_message = "The mixture thickens and heats up slighty..."
\ No newline at end of file
+ mix_message = "The mixture thickens and heats up slighty..."
diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm
index 948bc33385..e1ea02a230 100644
--- a/code/citadel/organs/womb.dm
+++ b/code/citadel/organs/womb.dm
@@ -6,8 +6,28 @@
zone = "groin"
slot = "womb"
w_class = 3
+ var/internal = FALSE
fluid_id = "femcum"
+ producing = TRUE
var/obj/item/organ/genital/vagina/linked_vag
+
+/obj/item/organ/genital/womb/Initialize()
+ . = ..()
+ reagents.add_reagent(fluid_id, fluid_max_volume)
+
+/obj/item/organ/genital/womb/on_life()
+ if(QDELETED(src))
+ return
+ if(reagents && producing)
+ generate_femcum()
+
+/obj/item/organ/genital/womb/proc/generate_femcum()
+ reagents.maximum_volume = fluid_max_volume
+ update_link()
+ if(!linked_vag)
+ return FALSE
+ reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally
+ reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
/obj/item/organ/genital/womb/update_link()
if(owner)
@@ -25,4 +45,4 @@
linked_vag = null
/obj/item/organ/genital/womb/Destroy()
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 43e5817db0..0f4ae021ad 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -14,15 +14,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe
//GOT IT MEMORIZED?
-GLOBAL_VAR_INIT(MC_restart_clear, 0)
-GLOBAL_VAR_INIT(MC_restart_timeout, 0)
-GLOBAL_VAR_INIT(MC_restart_count, 0)
-
-
-//current tick limit, assigned by the queue controller before running a subsystem.
-//used by check_tick as well so that the procs subsystems call can obey that SS's tick limits
-GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
-
/datum/controller/master
name = "Master"
@@ -59,6 +50,14 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
var/current_runlevel //for scheduling different subsystems for different stages of the round
+ var/static/restart_clear = 0
+ var/static/restart_timeout = 0
+ var/static/restart_count = 0
+
+ //current tick limit, assigned before running a subsystem.
+ //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits
+ var/static/current_ticklimit = TICK_LIMIT_RUNNING
+
/datum/controller/master/New()
// Highlander-style: there can only be one! Kill off the old and replace it with the new.
subsystems = list()
@@ -83,20 +82,21 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
sortTim(subsystems, /proc/cmp_subsystem_init)
reverseRange(subsystems)
for(var/datum/controller/subsystem/ss in subsystems)
+ testing("Shutdown [ss.name] subsystem")
ss.Shutdown()
// Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart,
// -1 if we encountered a runtime trying to recreate it
/proc/Recreate_MC()
. = -1 //so if we runtime, things know we failed
- if (world.time < GLOB.MC_restart_timeout)
+ if (world.time < Master.restart_timeout)
return 0
- if (world.time < GLOB.MC_restart_clear)
- GLOB.MC_restart_count *= 0.5
+ if (world.time < Master.restart_clear)
+ Master.restart_count *= 0.5
- var/delay = 50 * ++GLOB.MC_restart_count
- GLOB.MC_restart_timeout = world.time + delay
- GLOB.MC_restart_clear = world.time + (delay * 2)
+ var/delay = 50 * ++Master.restart_count
+ Master.restart_timeout = world.time + delay
+ Master.restart_clear = world.time + (delay * 2)
Master.processing = 0 //stop ticking this one
try
new/datum/controller/master()
@@ -164,13 +164,13 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
var/start_timeofday = REALTIMEOFDAY
// Initialize subsystems.
- GLOB.CURRENT_TICKLIMIT = config.tick_limit_mc_init
+ current_ticklimit = config.tick_limit_mc_init
for (var/datum/controller/subsystem/SS in subsystems)
if (SS.flags & SS_NO_INIT)
continue
SS.Initialize(REALTIMEOFDAY)
CHECK_TICK
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
+ current_ticklimit = TICK_LIMIT_RUNNING
var/time = (REALTIMEOFDAY - start_timeofday) / 10
var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!"
@@ -205,6 +205,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
set waitfor = 0
if(delay)
sleep(delay)
+ testing("Master starting processing")
var/rtn = Loop()
if (rtn > 0 || processing < 0)
return //this was suppose to happen.
@@ -275,7 +276,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
while (1)
tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag)))
if (processing <= 0)
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
+ current_ticklimit = TICK_LIMIT_RUNNING
sleep(10)
continue
@@ -283,7 +284,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// because sleeps are processed in the order received, so longer sleeps are more likely to run first
if (world.tick_usage > TICK_LIMIT_MC)
sleep_delta += 2
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING * 0.5
+ current_ticklimit = TICK_LIMIT_RUNNING * 0.5
sleep(world.tick_lag * (processing + sleep_delta))
continue
@@ -321,7 +322,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
if (!error_level)
iteration++
error_level++
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
+ current_ticklimit = TICK_LIMIT_RUNNING
sleep(10)
continue
@@ -333,7 +334,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
if (!error_level)
iteration++
error_level++
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
+ current_ticklimit = TICK_LIMIT_RUNNING
sleep(10)
continue
error_level--
@@ -344,7 +345,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
iteration++
last_run = world.time
src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta)
- GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc.
+ current_ticklimit = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc.
sleep(world.tick_lag * (processing + sleep_delta))
@@ -435,7 +436,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun)
- GLOB.CURRENT_TICKLIMIT = round(world.tick_usage + tick_precentage)
+ current_ticklimit = round(world.tick_usage + tick_precentage)
if (!(queue_node_flags & SS_TICKER))
ran_non_ticker = TRUE
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index 0391f6ba70..48bdbad112 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -150,7 +150,7 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Shutdown()
var/initlog = InitLog()
if(initlog)
- text2file("[GLOB.log_directory]/initialize.log", initlog)
+ text2file(initlog, "[GLOB.log_directory]/initialize.log")
#undef BAD_INIT_QDEL_BEFORE
#undef BAD_INIT_DIDNT_INIT
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index b30bc41759..ecc5f3cc17 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -1,8 +1,9 @@
SUBSYSTEM_DEF(blackbox)
name = "Blackbox"
wait = 6000
- flags = SS_NO_TICK_CHECK
-
+ flags = SS_NO_TICK_CHECK | SS_NO_INIT
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+
var/list/msg_common = list()
var/list/msg_science = list()
var/list/msg_command = list()
@@ -42,7 +43,6 @@ SUBSYSTEM_DEF(blackbox)
msg_cargo = SSblackbox.msg_cargo
msg_other = SSblackbox.msg_other
-
feedback = SSblackbox.feedback
//no touchie
@@ -55,6 +55,8 @@ SUBSYSTEM_DEF(blackbox)
return FALSE
/datum/controller/subsystem/blackbox/Shutdown()
+ set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len)
+
var/pda_msg_amt = 0
var/rc_msg_amt = 0
@@ -84,20 +86,16 @@ SUBSYSTEM_DEF(blackbox)
if (!SSdbcore.Connect())
return
-
- var/sqlrowlist = ""
+
+ var/list/sqlrowlist = list()
for (var/datum/feedback_variable/FV in feedback)
- if (sqlrowlist != "")
- sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
+ sqlrowlist += list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'")
- sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'"))
-
- if (sqlrowlist == "")
+ if (!length(sqlrowlist))
return
- var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist)
- query_feedback_save.Execute()
+ SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, delayed = TRUE)
/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq)
switch(freq)
diff --git a/code/controllers/subsystem/fields.dm b/code/controllers/subsystem/fields.dm
deleted file mode 100644
index 8e9f387478..0000000000
--- a/code/controllers/subsystem/fields.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-
-SUBSYSTEM_DEF(fields)
- name = "Fields"
- wait = 2
- priority = 40
- flags = SS_KEEP_TIMING
- var/list/datum/proximity_monitor/advanced/running = list()
- var/list/datum/proximity_monitor/advanced/currentrun = list()
-
-/datum/controller/subsystem/fields/fire(resumed = 0)
- if(!resumed)
- src.currentrun = running.Copy()
- var/list/currentrun = src.currentrun
- while(currentrun.len)
- var/datum/proximity_monitor/advanced/F = currentrun[currentrun.len]
- currentrun.len--
- if(!F.requires_processing)
- continue
- F.process()
- if(MC_TICK_CHECK)
- return
-
-/datum/controller/subsystem/fields/proc/register_new_field(datum/proximity_monitor/advanced/F)
- running += F
-
-/datum/controller/subsystem/fields/proc/unregister_field(datum/proximity_monitor/advanced/F)
- running -= F
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 84d79009c0..2611bc53e6 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -61,7 +61,7 @@ SUBSYSTEM_DEF(garbage)
for(var/path in sleptDestroy)
dellog += "Path : [path] \n"
dellog += "Sleeps : [sleptDestroy[path]] \n"
- text2file("[GLOB.log_directory]/qdel.log", dellog.Join())
+ text2file(dellog.Join(), "[GLOB.log_directory]/qdel.log")
/datum/controller/subsystem/garbage/fire()
HandleToBeQueued()
diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm
new file mode 100644
index 0000000000..6a878fa142
--- /dev/null
+++ b/code/controllers/subsystem/processing/fields.dm
@@ -0,0 +1,6 @@
+PROCESSING_SUBSYSTEM_DEF(fields)
+ name = "Fields"
+ wait = 2
+ priority = 40
+ flags = SS_KEEP_TIMING | SS_NO_INIT
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index a0ca6a7b67..2abd8b1c25 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(server_maint)
wait = 6
flags = SS_POST_FIRE_TIMING
priority = 10
+ init_order = INIT_ORDER_SERVER_MAINT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun
@@ -16,7 +17,7 @@ SUBSYSTEM_DEF(server_maint)
/datum/controller/subsystem/server_maint/fire(resumed = FALSE)
if(!resumed)
src.currentrun = GLOB.clients.Copy()
-
+
var/list/currentrun = src.currentrun
var/round_started = SSticker.HasRoundStarted()
@@ -37,4 +38,11 @@ SUBSYSTEM_DEF(server_maint)
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
-#undef PING_BUFFER_TIME
+/datum/controller/subsystem/server_maint/Shutdown()
+ kick_clients_in_lobby("The round came to an end with you in the lobby.", TRUE) //second parameter ensures only afk clients are kicked
+ for(var/thing in GLOB.clients)
+ var/client/C = thing
+ if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
+ C << link("byond://[config.server]")
+
+#undef PING_BUFFER_TIME
\ No newline at end of file
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index a3d47b465e..61f93dcc1b 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -217,7 +217,27 @@ SUBSYSTEM_DEF(shuttle)
emergency.request(null, signal_origin, html_decode(emergency_reason), 0)
log_game("[key_name(user)] has called the shuttle.")
- message_admins("[key_name_admin(user)] has called the shuttle.")
+ message_admins("[key_name_admin(user)] has called the shuttle. (TRIGGER CENTCOM RECALL)")
+
+/datum/controller/subsystem/shuttle/proc/centcom_recall(old_timer, admiral_message)
+ if(emergency.mode != SHUTTLE_CALL || emergency.timer != old_timer)
+ return
+ emergency.cancel(/area/centcom)
+
+ if(!admiral_message)
+ admiral_message = pick(GLOB.admiral_messages)
+ var/intercepttext = "NanoTrasen Update: Request For Shuttle.
\
+ To whom it may concern:
\
+ We have taken note of the situation upon [station_name()] and have come to the \
+ conclusion that it does not warrant the abandonment of the station.
\
+ If you do not agree with our opinion we suggest that you open a direct \
+ line with us and explain the nature of your crisis.
\
+ This message has been automatically generated based upon readings from long \
+ range diagnostic tools. To assure the quality of your request every finalized report \
+ is reviewed by an on-call rear admiral.
\
+ Rear Admiral's Notes: \
+ [admiral_message]"
+ print_command_report(intercepttext, announce = TRUE)
// Called when an emergency shuttle mobile docking port is
// destroyed, which will only happen with admin intervention
@@ -523,4 +543,3 @@ SUBSYSTEM_DEF(shuttle)
for(var/obj/docking_port/mobile/M in mobile)
if(M.is_in_shuttle_bounds(A))
return TRUE
-
\ No newline at end of file
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index e8d575a517..a54c74966a 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -20,6 +20,7 @@ SUBSYSTEM_DEF(ticker)
var/login_music //music played in pregame lobby
var/round_end_sound //music/jingle played when the world reboots
+ var/round_end_sound_sent = TRUE //If all clients have loaded it
var/list/datum/mind/minds = list() //The characters in the game. Used for objective tracking.
@@ -63,6 +64,7 @@ SUBSYSTEM_DEF(ticker)
var/modevoted = FALSE //Have we sent a vote for the gamemode?
/datum/controller/subsystem/ticker/Initialize(timeofday)
+ load_mode()
var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
login_music = pick(music)
@@ -637,9 +639,9 @@ SUBSYSTEM_DEF(ticker)
sleep(50)
if(mode.station_was_nuked)
- world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke")
+ Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke")
else
- world.Reboot("Round ended.", "end_proper", "proper completion")
+ Reboot("Round ended.", "end_proper", "proper completion")
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
var/m
@@ -806,3 +808,69 @@ SUBSYSTEM_DEF(ticker)
start_at = world.time + newtime
else
timeLeft = newtime
+
+/datum/controller/subsystem/ticker/proc/load_mode()
+ var/mode = trim(file2text("data/mode.txt"))
+ if(mode)
+ GLOB.master_mode = mode
+ else
+ GLOB.master_mode = "extended"
+ log_game("Saved mode is '[GLOB.master_mode]'")
+
+/datum/controller/subsystem/ticker/proc/save_mode(the_mode)
+ var/F = file("data/mode.txt")
+ fdel(F)
+ F << the_mode
+
+/datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound)
+ set waitfor = FALSE
+ round_end_sound_sent = FALSE
+ round_end_sound = fcopy_rsc(the_sound)
+ for(var/thing in GLOB.clients)
+ var/client/C = thing
+ if (!C)
+ continue
+ C.Export("##action=load_rsc", round_end_sound)
+ round_end_sound_sent = TRUE
+
+/datum/controller/subsystem/ticker/proc/Reboot(reason, feedback_c, feedback_r, delay)
+ set waitfor = FALSE
+ if(usr && !check_rights(R_SERVER, TRUE))
+ return
+
+ if(!delay)
+ delay = config.round_end_countdown * 10
+
+ if(delay_end)
+ to_chat(world, "An admin has delayed the round end.")
+ return
+
+ to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]")
+
+ var/start_wait = world.time
+ UNTIL(round_end_sound_sent && (world.time - start_wait) > (delay * 2)) //don't wait forever
+ sleep(delay - (world.time - start_wait))
+
+ if(delay_end)
+ to_chat(world, "Reboot was cancelled by an admin.")
+ return
+
+ SSblackbox.set_details("[feedback_c]","[feedback_r]")
+
+ log_game("Rebooting World. [reason]")
+
+ world.Reboot()
+
+/datum/controller/subsystem/ticker/Shutdown()
+ if(!round_end_sound)
+ round_end_sound = pick(\
+ 'sound/roundend/newroundsexy.ogg',
+ 'sound/roundend/apcdestroyed.ogg',
+ 'sound/roundend/bangindonk.ogg',
+ 'sound/roundend/leavingtg.ogg',
+ 'sound/roundend/its_only_game.ogg',
+ 'sound/roundend/yeehaw.ogg',
+ 'sound/roundend/disappointed.ogg'\
+ )
+
+ world << sound(round_end_sound)
\ No newline at end of file
diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm
index d9f4ef9938..6c5466d8d9 100644
--- a/code/controllers/subsystem/title.dm
+++ b/code/controllers/subsystem/title.dm
@@ -55,6 +55,12 @@ SUBSYSTEM_DEF(title)
var/F = file("data/previous_title.dat")
F << file_path
+ for(var/thing in GLOB.clients)
+ if(!thing)
+ continue
+ var/obj/screen/splash/S = new(thing, FALSE)
+ S.Fade(FALSE,FALSE)
+
/datum/controller/subsystem/title/Recover()
icon = SStitle.icon
splash_turf = SStitle.splash_turf
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 99234b05ed..deea959c00 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -2,9 +2,9 @@ SUBSYSTEM_DEF(vote)
name = "Vote"
wait = 10
- flags = SS_KEEP_TIMING|SS_NO_INIT
-
- runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ flags = SS_KEEP_TIMING|SS_NO_INIT
+
+ runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/initiator = null
var/started_time = null
@@ -120,13 +120,13 @@ SUBSYSTEM_DEF(vote)
if(SSticker && SSticker.mode)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = .
- world.save_mode(.)
+ SSticker.save_mode(.)
to_chat(world, "The mode is now: [GLOB.master_mode]")
log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].")
if("gamemode")
if(GLOB.master_mode != .)
- world.save_mode(.)
- if(SSticker.HasRoundStarted())
+ SSticker.save_mode(.)
+ if(SSticker.HasRoundStarted())
restart = 1
else
GLOB.master_mode = .
@@ -137,7 +137,7 @@ SUBSYSTEM_DEF(vote)
active_admins = 1
break
if(!active_admins)
- world.Reboot("Restart vote successful.", "end_error", "restart vote")
+ SSticker.Reboot("Restart vote successful.", "end_error", "restart vote")
else
to_chat(world, "Notice:Restart vote will not restart the server automatically because there are active admins on.")
message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.")
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 834d6c864d..f4f4543ad3 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -36,7 +36,7 @@ Bonus
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
var/heal_amt = 0.5
if(M.toxloss > 0 && prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#66FF99")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#66FF99")
M.adjustToxLoss(-heal_amt)
return 1
@@ -67,7 +67,7 @@ Bonus
/datum/symptom/heal/plus/Heal(mob/living/M, datum/disease/advance/A)
var/heal_amt = 1
if(M.toxloss > 0 && prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#00FF00")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#00FF00")
M.adjustToxLoss(-heal_amt)
return 1
@@ -110,7 +110,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#FF3333")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#FF3333")
return 1
@@ -148,7 +148,7 @@ Bonus
if(M.getCloneLoss() > 0)
M.adjustCloneLoss(-1)
M.take_bodypart_damage(0, 1) //Deals BURN damage, which is not cured by this symptom
- new /obj/effect/overlay/temp/heal(get_turf(M), "#33FFCC")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#33FFCC")
if(!parts.len)
return
@@ -158,7 +158,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#CC1100")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#CC1100")
return 1
@@ -201,7 +201,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#FF9933")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#FF9933")
return 1
@@ -248,7 +248,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#CC6600")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#CC6600")
return 1
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index b20bf556d5..fa02a2f092 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -79,681 +79,17 @@
/datum/martial_art/proc/teach(mob/living/carbon/human/H,make_temporary=0)
if(make_temporary)
temporary = 1
- if(temporary && H.martial_art)
- if(!H.martial_art.allow_temp_override)
+ if(temporary && H.mind.martial_art)
+ if(!H.mind.martial_art.allow_temp_override)
return
- base = H.martial_art
+ base = H.mind.martial_art
if(help_verb)
H.verbs += help_verb
- H.martial_art = src
+ H.mind.martial_art = src
/datum/martial_art/proc/remove(mob/living/carbon/human/H)
- if(H.martial_art != src)
+ if(H.mind.martial_art != src)
return
- H.martial_art = base
+ H.mind.martial_art = base
if(help_verb)
H.verbs -= help_verb
-
-/datum/martial_art/boxing
- name = "Boxing"
-
-/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- to_chat(A, "Can't disarm while boxing!")
- return 1
-
-/datum/martial_art/boxing/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- to_chat(A, "Can't grab while boxing!")
- return 1
-
-/datum/martial_art/boxing/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
-
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
-
- var/atk_verb = pick("left hook","right hook","straight punch")
-
- var/damage = rand(5, 8) + A.dna.species.punchdamagelow
- if(!damage)
- playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
- D.visible_message("[A] has attempted to [atk_verb] [D]!", \
- "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE)
- add_logs(A, D, "attempted to hit", atk_verb)
- return 0
-
-
- var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
- var/armor_block = D.run_armor_check(affecting, "melee")
-
- playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1)
-
- D.visible_message("[A] has [atk_verb]ed [D]!", \
- "[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE)
-
- D.apply_damage(damage, STAMINA, affecting, armor_block)
- add_logs(A, D, "punched (boxing) ")
- if(D.getStaminaLoss() > 50)
- var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
- if((D.stat != DEAD) && prob(knockout_prob))
- D.visible_message("[A] has knocked [D] out with a haymaker!", \
- "[A] has knocked [D] out with a haymaker!")
- D.apply_effect(10,WEAKEN,armor_block)
- D.SetSleeping(5)
- D.forcesay(GLOB.hit_appends)
- add_logs(A, D, "knocked out (boxing) ")
- else if(D.lying)
- D.forcesay(GLOB.hit_appends)
- return 1
-
-/mob/living/carbon/human/proc/wrestling_help()
- set name = "Recall Teachings"
- set desc = "Remember how to wrestle."
- set category = "Wrestling"
-
- to_chat(usr, "You flex your muscles and have a revelation...")
- to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.")
- to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.")
- to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.")
-
-#define TORNADO_COMBO "HHD"
-#define THROWBACK_COMBO "DHD"
-#define PLASMA_COMBO "HDDDH"
-
-/datum/martial_art/plasma_fist
- name = "Plasma Fist"
- help_verb = /mob/living/carbon/human/proc/plasma_fist_help
-
-
-/datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(findtext(streak,TORNADO_COMBO))
- streak = ""
- Tornado(A,D)
- return 1
- if(findtext(streak,THROWBACK_COMBO))
- streak = ""
- Throwback(A,D)
- return 1
- if(findtext(streak,PLASMA_COMBO))
- streak = ""
- Plasma(A,D)
- return 1
- return 0
-
-/datum/martial_art/plasma_fist/proc/TornadoAnimate(mob/living/carbon/human/A)
- set waitfor = FALSE
- for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
- if(!A)
- break
- A.setDir(i)
- playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1)
- sleep(1)
-
-/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D)
- A.say("TORNADO SWEEP!")
- TornadoAnimate(A)
- var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null)
- var/list/turfs = list()
- for(var/turf/T in range(1,A))
- turfs.Add(T)
- R.cast(turfs)
- add_logs(A, D, "tornado sweeped(Plasma Fist)")
- return
-
-/datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D)
- D.visible_message("[A] has hit [D] with Plasma Punch!", \
- "[A] has hit [D] with Plasma Punch!")
- playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
- var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
- D.throw_at(throw_target, 200, 4,A)
- A.say("HYAH!")
- add_logs(A, D, "threw back (Plasma Fist)")
- return
-
-/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D)
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
- A.say("PLASMA FIST!")
- D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \
- "[A] has hit [D] with THE PLASMA FIST TECHNIQUE!")
- D.gib()
- add_logs(A, D, "gibbed (Plasma Fist)")
- return
-
-/datum/martial_art/plasma_fist/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("H",D)
- if(check_streak(A,D))
- return 1
- basic_hit(A,D)
- return 1
-
-/datum/martial_art/plasma_fist/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("D",D)
- if(check_streak(A,D))
- return 1
- basic_hit(A,D)
- return 1
-
-/datum/martial_art/plasma_fist/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("G",D)
- if(check_streak(A,D))
- return 1
- basic_hit(A,D)
- return 1
-
-/mob/living/carbon/human/proc/plasma_fist_help()
- set name = "Recall Teachings"
- set desc = "Remember the martial techniques of the Plasma Fist."
- set category = "Plasma Fist"
-
- to_chat(usr, "You clench your fists and have a flashback of knowledge...")
- to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.")
- to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.")
- to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.")
-
-//Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss
-#define WRIST_WRENCH_COMBO "DD"
-#define BACK_KICK_COMBO "HG"
-#define STOMACH_KNEE_COMBO "GH"
-#define HEAD_KICK_COMBO "DHH"
-#define ELBOW_DROP_COMBO "HDHDH"
-/datum/martial_art/the_sleeping_carp
- name = "The Sleeping Carp"
- deflection_chance = 100
- no_guns = TRUE
- allow_temp_override = FALSE
- help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
-
-/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(findtext(streak,WRIST_WRENCH_COMBO))
- streak = ""
- wristWrench(A,D)
- return 1
- if(findtext(streak,BACK_KICK_COMBO))
- streak = ""
- backKick(A,D)
- return 1
- if(findtext(streak,STOMACH_KNEE_COMBO))
- streak = ""
- kneeStomach(A,D)
- return 1
- if(findtext(streak,HEAD_KICK_COMBO))
- streak = ""
- headKick(A,D)
- return 1
- if(findtext(streak,ELBOW_DROP_COMBO))
- streak = ""
- elbowDrop(A,D)
- return 1
- return 0
-
-/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.stunned && !D.weakened)
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \
- "[A] grabs your wrist and violently wrenches it to the side!")
- playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- D.emote("scream")
- D.drop_item()
- D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
- D.Stun(3)
- return 1
- add_logs(A, D, "wrist wrenched (Sleeping Carp)")
- return basic_hit(A,D)
-
-/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(A.dir == D.dir && !D.stat && !D.weakened)
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] kicks [D] in the back!", \
- "[A] kicks you in the back, making you stumble and fall!")
- step_to(D,get_step(D,D.dir),1)
- D.Weaken(4)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
- return 1
- add_logs(A, D, "back-kicked (Sleeping Carp)")
- return basic_hit(A,D)
-
-/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.weakened)
- A.do_attack_animation(D, ATTACK_EFFECT_KICK)
- D.visible_message("[A] knees [D] in the stomach!", \
- "[A] winds you with a knee in the stomach!")
- D.audible_message("[D] gags!")
- D.losebreath += 3
- D.Stun(2)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
- return 1
- add_logs(A, D, "stomach kneed (Sleeping Carp)")
- return basic_hit(A,D)
-
-/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.weakened)
- A.do_attack_animation(D, ATTACK_EFFECT_KICK)
- D.visible_message("[A] kicks [D] in the head!", \
- "[A] kicks you in the jaw!")
- D.apply_damage(20, BRUTE, "head")
- D.drop_item()
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
- D.Stun(4)
- return 1
- add_logs(A, D, "head kicked (Sleeping Carp)")
- return basic_hit(A,D)
-
-/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(D.weakened || D.resting || D.stat)
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] elbow drops [D]!", \
- "[A] piledrives you with their elbow!")
- if(D.stat)
- D.death() //FINISH HIM!
- D.apply_damage(50, BRUTE, "chest")
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
- return 1
- add_logs(A, D, "elbow dropped (Sleeping Carp)")
- return basic_hit(A,D)
-
-/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("G",D)
- if(check_streak(A,D))
- return 1
- if(A.grab_state >= GRAB_AGGRESSIVE)
- D.grabbedby(A, 1)
- else
- A.start_pulling(D, 1)
- if(A.pulling)
- D.drop_all_held_items()
- D.stop_pulling()
- if(A.a_intent == INTENT_GRAB)
- add_logs(A, D, "grabbed", addition="aggressively")
- A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
- else
- add_logs(A, D, "grabbed", addition="passively")
- A.grab_state = GRAB_PASSIVE
- return 1
-
-/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("H",D)
- if(check_streak(A,D))
- return 1
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
- D.visible_message("[A] [atk_verb] [D]!", \
- "[A] [atk_verb] you!")
- D.apply_damage(rand(10,15), BRUTE)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1)
- if(prob(D.getBruteLoss()) && !D.lying)
- D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!")
- D.Weaken(4)
- add_logs(A, D, "[atk_verb] (Sleeping Carp)")
- return 1
-
-
-/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("D",D)
- if(check_streak(A,D))
- return 1
- return ..()
-
-/mob/living/carbon/human/proc/sleeping_carp_help()
- set name = "Recall Teachings"
- set desc = "Remember the martial techniques of the Sleeping Carp clan."
- set category = "Sleeping Carp"
-
- to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...")
-
- to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.")
- to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.")
- to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.")
- to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.")
- to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.")
-
-//CQC
-#define SLAM_COMBO "GH"
-#define KICK_COMBO "HH"
-#define RESTRAIN_COMBO "GG"
-#define PRESSURE_COMBO "DG"
-#define CONSECUTIVE_COMBO "DDH"
-/datum/martial_art/cqc
- name = "CQC"
- help_verb = /mob/living/carbon/human/proc/CQC_help
- block_chance = 75
-
-/datum/martial_art/cqc/proc/drop_restraining()
- restraining = 0
-
-/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(findtext(streak,SLAM_COMBO))
- streak = ""
- Slam(A,D)
- return 1
- if(findtext(streak,KICK_COMBO))
- streak = ""
- Kick(A,D)
- return 1
- if(findtext(streak,RESTRAIN_COMBO))
- streak = ""
- Restrain(A,D)
- return 1
- if(findtext(streak,PRESSURE_COMBO))
- streak = ""
- Pressure(A,D)
- return 1
- if(findtext(streak,CONSECUTIVE_COMBO))
- streak = ""
- Consecutive(A,D)
- return 0
-
-/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat || !D.weakened)
- D.visible_message("[A] slams [D] into the ground!", \
- "[A] slams you into the ground!")
- playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
- D.apply_damage(10, BRUTE)
- D.Weaken(6)
- add_logs(A, D, "cqc slammed")
- return 1
-
-/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat || !D.weakened)
- D.visible_message("[A] kicks [D] back!", \
- "[A] kicks you back!")
- playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- var/atom/throw_target = get_edge_target_turf(D, A.dir)
- D.throw_at(throw_target, 1, 14, A)
- D.apply_damage(10, BRUTE)
- add_logs(A, D, "cqc kicked")
- if(D.weakened && !D.stat)
- D.visible_message("[A] kicks [D]'s head, knocking them out!", \
- "[A] kicks your head, knocking you out!")
- playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
- D.SetSleeping(15)
- D.adjustBrainLoss(25)
- return 1
-
-/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
- D.visible_message("[A] forces their arm on [D]'s neck!")
- D.adjustStaminaLoss(60)
- playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- return 1
-
-/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(restraining)
- return
- if(!D.stat)
- D.visible_message("[A] locks [D] into a restraining position!", \
- "[A] locks you into a restraining position!")
- D.adjustStaminaLoss(20)
- D.Stun(5)
- restraining = 1
- addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
- return 1
-
-/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat)
- D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \
- "[A] strikes your abdomen, neck and back consecutively!")
- playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
- var/obj/item/I = D.get_active_held_item()
- if(I && D.drop_item())
- A.put_in_hands(I)
- D.adjustStaminaLoss(50)
- D.apply_damage(25, BRUTE)
- return 1
-
-/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("G",D)
- if(check_streak(A,D))
- return 1
- if(A.grab_state >= GRAB_AGGRESSIVE)
- D.grabbedby(A, 1)
- else
- A.start_pulling(D, 1)
- if(A.pulling)
- D.stop_pulling()
- add_logs(A, D, "grabbed", addition="aggressively")
- A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
-
- return 1
-
-/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("H",D)
- if(check_streak(A,D))
- return 1
- add_logs(A, D, "CQC'd")
- A.do_attack_animation(D)
- var/picked_hit_type = pick("CQC'd", "Big Bossed")
- var/bonus_damage = 13
- if(D.weakened || D.resting || D.lying)
- bonus_damage += 5
- picked_hit_type = "stomps on"
- D.apply_damage(bonus_damage, BRUTE)
- if(picked_hit_type == "kicks" || picked_hit_type == "stomps on")
- playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
- else
- playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- D.visible_message("[A] [picked_hit_type] [D]!", \
- "[A] [picked_hit_type] you!")
- add_logs(A, D, "[picked_hit_type] with CQC")
- if(A.resting && !D.stat && !D.weakened)
- D.visible_message("[A] leg sweeps [D]!", \
- "[A] leg sweeps you!")
- playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
- D.apply_damage(10, BRUTE)
- D.Weaken(3)
- add_logs(A, D, "cqc sweeped")
- return 1
-
-/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- add_to_streak("D",D)
- var/obj/item/I = null
- if(check_streak(A,D))
- return 1
- if(prob(65))
- if(!D.stat || !D.weakened || !restraining)
- I = D.get_active_held_item()
- D.visible_message("[A] strikes [D]'s jaw with their hand!", \
- "[A] strikes your jaw, disorienting you!")
- playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- if(I && D.drop_item())
- A.put_in_hands(I)
- D.Jitter(2)
- D.apply_damage(5, BRUTE)
- else
- D.visible_message("[A] attempted to disarm [D]!", \
- "[A] attempted to disarm [D]!")
- playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- add_logs(A, D, "disarmed with CQC", "[I ? " grabbing \the [I]" : ""]")
- if(restraining && A.pulling == D)
- D.visible_message("[A] puts [D] into a chokehold!", \
- "[A] puts you into a chokehold!")
- D.SetSleeping(20)
- restraining = 0
- if(A.grab_state < GRAB_NECK)
- A.grab_state = GRAB_NECK
- else
- restraining = 0
- return 0
- return 1
-
-/mob/living/carbon/human/proc/CQC_help()
- set name = "Remember The Basics"
- set desc = "You try to remember some of the basics of CQC."
- set category = "CQC"
-
- to_chat(usr, "You try to remember some of the basics of CQC.")
-
- to_chat(usr, "Slam: Grab Harm. Slam opponent into the ground, weakens and knocks down.")
- to_chat(usr, "CQC Kick: Harm Disarm Harm. Knocks opponent away. Knocks out stunned or weakened opponents.")
- to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.")
- to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.")
- to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.")
-
- to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.")
-
-//ITEMS
-
-/obj/item/clothing/gloves/boxing
- var/datum/martial_art/boxing/style = new
-
-/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == slot_gloves)
- var/mob/living/carbon/human/H = user
- style.teach(H,1)
- return
-
-/obj/item/clothing/gloves/boxing/dropped(mob/user)
- if(!ishuman(user))
- return
- var/mob/living/carbon/human/H = user
- if(H.get_item_by_slot(slot_gloves) == src)
- style.remove(H)
- return
-
-/obj/item/weapon/storage/belt/champion/wrestling
- name = "Wrestling Belt"
- var/datum/martial_art/wrestling/style = new
-
-/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == slot_belt)
- var/mob/living/carbon/human/H = user
- style.teach(H,1)
- return
-
-/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
- if(!ishuman(user))
- return
- var/mob/living/carbon/human/H = user
- if(H.get_item_by_slot(slot_belt) == src)
- style.remove(H)
- return
-
-/obj/item/weapon/plasma_fist_scroll
- name = "frayed scroll"
- desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
- icon = 'icons/obj/wizard.dmi'
- icon_state ="scroll2"
- var/used = 0
-
-/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user)
- if(!ishuman(user))
- return
- if(!used)
- var/mob/living/carbon/human/H = user
- var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
- F.teach(H)
- to_chat(H, "You have learned the ancient martial art of Plasma Fist.")
- used = 1
- desc = "It's completely blank."
- name = "empty scroll"
- icon_state = "blankscroll"
-
-/obj/item/weapon/cqc_manual
- name = "old manual"
- desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
- icon = 'icons/obj/library.dmi'
- icon_state ="cqcmanual"
-
-/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user)
- if(!istype(user) || !user)
- return
- to_chat(user, "You remember the basics of CQC.")
- var/datum/martial_art/cqc/D = new(null)
- D.teach(user)
- user.drop_item()
- visible_message("[src] beeps ominously, and a moment later it bursts up in flames.")
- new /obj/effect/decal/cleanable/ash(get_turf(src))
- qdel(src)
-
-/obj/item/weapon/sleeping_carp_scroll
- name = "mysterious scroll"
- desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "scroll2"
-
-/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
- if(!istype(user) || !user)
- return
- var/message = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
- directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab."
- to_chat(user, message)
- var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
- theSleepingCarp.teach(user)
- user.drop_item()
- visible_message("[src] lights up in fire and quickly burns to ash.")
- new /obj/effect/decal/cleanable/ash(get_turf(src))
- qdel(src)
-
-/obj/item/weapon/twohanded/bostaff
- name = "bo staff"
- desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
- force = 10
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
- force_unwielded = 10
- force_wielded = 24
- throwforce = 20
- throw_speed = 2
- attack_verb = list("smashed", "slammed", "whacked", "thwacked")
- icon = 'icons/obj/weapons.dmi'
- icon_state = "bostaff0"
- block_chance = 50
-
-/obj/item/weapon/twohanded/bostaff/update_icon()
- icon_state = "bostaff[wielded]"
- return
-
-/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
- add_fingerprint(user)
- if((CLUMSY in user.disabilities) && prob(50))
- to_chat(user, "You club yourself over the head with [src].")
- user.Weaken(3)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, "head")
- else
- user.take_bodypart_damage(2*force)
- return
- if(iscyborg(target))
- return ..()
- if(!isliving(target))
- return ..()
- var/mob/living/carbon/C = target
- if(C.stat)
- to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.")
- return
- if(user.a_intent == INTENT_DISARM)
- if(!wielded)
- return ..()
- if(!ishuman(target))
- return ..()
- var/mob/living/carbon/human/H = target
- var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
- "[user] smacks [H] with the butt of [src]!", \
- "[user] broadsides [H] with [src]!", \
- "[user] smashes [H]'s head with [src]!", \
- "[user] beats [H] with front of [src]!", \
- "[user] twirls and slams [H] with [src]!")
- H.visible_message("[pick(fluffmessages)]", \
- "[pick(fluffmessages)]")
- playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
- H.adjustStaminaLoss(rand(13,20))
- if(prob(10))
- H.visible_message("[H] collapses!", \
- "Your legs give out!")
- H.Weaken(4)
- if(H.staminaloss && !H.sleeping)
- var/total_health = (H.health - H.staminaloss)
- if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat)
- H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \
- "[user] knocks you unconscious!")
- H.SetSleeping(30)
- H.adjustBrainLoss(25)
- else
- return ..()
-
-/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
- if(wielded)
- return ..()
- return 0
-
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
new file mode 100644
index 0000000000..6a3a059890
--- /dev/null
+++ b/code/datums/martial/boxing.dm
@@ -0,0 +1,67 @@
+/datum/martial_art/boxing
+ name = "Boxing"
+
+/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ to_chat(A, "Can't disarm while boxing!")
+ return 1
+
+/datum/martial_art/boxing/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ to_chat(A, "Can't grab while boxing!")
+ return 1
+
+/datum/martial_art/boxing/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+
+ var/atk_verb = pick("left hook","right hook","straight punch")
+
+ var/damage = rand(5, 8) + A.dna.species.punchdamagelow
+ if(!damage)
+ playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
+ D.visible_message("[A] has attempted to [atk_verb] [D]!", \
+ "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE)
+ add_logs(A, D, "attempted to hit", atk_verb)
+ return 0
+
+
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
+ var/armor_block = D.run_armor_check(affecting, "melee")
+
+ playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1)
+
+ D.visible_message("[A] has [atk_verb]ed [D]!", \
+ "[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE)
+
+ D.apply_damage(damage, STAMINA, affecting, armor_block)
+ add_logs(A, D, "punched (boxing) ")
+ if(D.getStaminaLoss() > 50)
+ var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
+ if((D.stat != DEAD) && prob(knockout_prob))
+ D.visible_message("[A] has knocked [D] out with a haymaker!", \
+ "[A] has knocked [D] out with a haymaker!")
+ D.apply_effect(10,WEAKEN,armor_block)
+ D.SetSleeping(5)
+ D.forcesay(GLOB.hit_appends)
+ add_logs(A, D, "knocked out (boxing) ")
+ else if(D.lying)
+ D.forcesay(GLOB.hit_appends)
+ return 1
+
+/obj/item/clothing/gloves/boxing
+ var/datum/martial_art/boxing/style = new
+
+/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
+ if(!ishuman(user))
+ return
+ if(slot == slot_gloves)
+ var/mob/living/carbon/human/H = user
+ style.teach(H,1)
+ return
+
+/obj/item/clothing/gloves/boxing/dropped(mob/user)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(H.get_item_by_slot(slot_gloves) == src)
+ style.remove(H)
+ return
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
new file mode 100644
index 0000000000..ebb570fa0c
--- /dev/null
+++ b/code/datums/martial/cqc.dm
@@ -0,0 +1,199 @@
+#define SLAM_COMBO "GH"
+#define KICK_COMBO "HH"
+#define RESTRAIN_COMBO "GG"
+#define PRESSURE_COMBO "DG"
+#define CONSECUTIVE_COMBO "DDH"
+
+/datum/martial_art/cqc
+ name = "CQC"
+ help_verb = /mob/living/carbon/human/proc/CQC_help
+ block_chance = 75
+
+/datum/martial_art/cqc/proc/drop_restraining()
+ restraining = 0
+
+/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(findtext(streak,SLAM_COMBO))
+ streak = ""
+ Slam(A,D)
+ return 1
+ if(findtext(streak,KICK_COMBO))
+ streak = ""
+ Kick(A,D)
+ return 1
+ if(findtext(streak,RESTRAIN_COMBO))
+ streak = ""
+ Restrain(A,D)
+ return 1
+ if(findtext(streak,PRESSURE_COMBO))
+ streak = ""
+ Pressure(A,D)
+ return 1
+ if(findtext(streak,CONSECUTIVE_COMBO))
+ streak = ""
+ Consecutive(A,D)
+ return 0
+
+/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat || !D.weakened)
+ D.visible_message("[A] slams [D] into the ground!", \
+ "[A] slams you into the ground!")
+ playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
+ D.apply_damage(10, BRUTE)
+ D.Weaken(6)
+ add_logs(A, D, "cqc slammed")
+ return 1
+
+/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat || !D.weakened)
+ D.visible_message("[A] kicks [D] back!", \
+ "[A] kicks you back!")
+ playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ var/atom/throw_target = get_edge_target_turf(D, A.dir)
+ D.throw_at(throw_target, 1, 14, A)
+ D.apply_damage(10, BRUTE)
+ add_logs(A, D, "cqc kicked")
+ if(D.weakened && !D.stat)
+ D.visible_message("[A] kicks [D]'s head, knocking them out!", \
+ "[A] kicks your head, knocking you out!")
+ playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
+ D.SetSleeping(15)
+ D.adjustBrainLoss(25)
+ return 1
+
+/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ D.visible_message("[A] forces their arm on [D]'s neck!")
+ D.adjustStaminaLoss(60)
+ playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ return 1
+
+/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(restraining)
+ return
+ if(!D.stat)
+ D.visible_message("[A] locks [D] into a restraining position!", \
+ "[A] locks you into a restraining position!")
+ D.adjustStaminaLoss(20)
+ D.Stun(5)
+ restraining = 1
+ addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
+ return 1
+
+/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat)
+ D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \
+ "[A] strikes your abdomen, neck and back consecutively!")
+ playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
+ var/obj/item/I = D.get_active_held_item()
+ if(I && D.drop_item())
+ A.put_in_hands(I)
+ D.adjustStaminaLoss(50)
+ D.apply_damage(25, BRUTE)
+ return 1
+
+/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("G",D)
+ if(check_streak(A,D))
+ return 1
+ if(A.grab_state >= GRAB_AGGRESSIVE)
+ D.grabbedby(A, 1)
+ else
+ A.start_pulling(D, 1)
+ if(A.pulling)
+ D.stop_pulling()
+ add_logs(A, D, "grabbed", addition="aggressively")
+ A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
+
+ return 1
+
+/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("H",D)
+ if(check_streak(A,D))
+ return 1
+ add_logs(A, D, "CQC'd")
+ A.do_attack_animation(D)
+ var/picked_hit_type = pick("CQC'd", "Big Bossed")
+ var/bonus_damage = 13
+ if(D.weakened || D.resting || D.lying)
+ bonus_damage += 5
+ picked_hit_type = "stomps on"
+ D.apply_damage(bonus_damage, BRUTE)
+ if(picked_hit_type == "kicks" || picked_hit_type == "stomps on")
+ playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
+ else
+ playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ D.visible_message("[A] [picked_hit_type] [D]!", \
+ "[A] [picked_hit_type] you!")
+ add_logs(A, D, "[picked_hit_type] with CQC")
+ if(A.resting && !D.stat && !D.weakened)
+ D.visible_message("[A] leg sweeps [D]!", \
+ "[A] leg sweeps you!")
+ playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
+ D.apply_damage(10, BRUTE)
+ D.Weaken(3)
+ add_logs(A, D, "cqc sweeped")
+ return 1
+
+/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("D",D)
+ var/obj/item/I = null
+ if(check_streak(A,D))
+ return 1
+ if(prob(65))
+ if(!D.stat || !D.weakened || !restraining)
+ I = D.get_active_held_item()
+ D.visible_message("[A] strikes [D]'s jaw with their hand!", \
+ "[A] strikes your jaw, disorienting you!")
+ playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ if(I && D.drop_item())
+ A.put_in_hands(I)
+ D.Jitter(2)
+ D.apply_damage(5, BRUTE)
+ else
+ D.visible_message("[A] attempted to disarm [D]!", \
+ "[A] attempted to disarm [D]!")
+ playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ add_logs(A, D, "disarmed with CQC", "[I ? " grabbing \the [I]" : ""]")
+ if(restraining && A.pulling == D)
+ D.visible_message("[A] puts [D] into a chokehold!", \
+ "[A] puts you into a chokehold!")
+ D.SetSleeping(20)
+ restraining = 0
+ if(A.grab_state < GRAB_NECK)
+ A.grab_state = GRAB_NECK
+ else
+ restraining = 0
+ return 0
+ return 1
+
+/mob/living/carbon/human/proc/CQC_help()
+ set name = "Remember The Basics"
+ set desc = "You try to remember some of the basics of CQC."
+ set category = "CQC"
+
+ to_chat(usr, "You try to remember some of the basics of CQC.")
+
+ to_chat(usr, "Slam: Grab Harm. Slam opponent into the ground, weakens and knocks down.")
+ to_chat(usr, "CQC Kick: Harm Disarm Harm. Knocks opponent away. Knocks out stunned or weakened opponents.")
+ to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.")
+ to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.")
+ to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.")
+
+ to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.")
+
+/obj/item/weapon/cqc_manual
+ name = "old manual"
+ desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
+ icon = 'icons/obj/library.dmi'
+ icon_state ="cqcmanual"
+
+/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user)
+ if(!istype(user) || !user)
+ return
+ to_chat(user, "You remember the basics of CQC.")
+ var/datum/martial_art/cqc/D = new(null)
+ D.teach(user)
+ user.drop_item()
+ visible_message("[src] beeps ominously, and a moment later it bursts up in flames.")
+ new /obj/effect/decal/cleanable/ash(get_turf(src))
+ qdel(src)
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 5bc9b0588b..eb5f74b411 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -13,12 +13,12 @@
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
var/mob/living/carbon/human/H = owner
- if (H.martial_art.streak == "neck_chop")
+ if (H.mind.martial_art.streak == "neck_chop")
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
- H.martial_art.streak = ""
+ H.mind.martial_art.streak = ""
else
owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.")
- H.martial_art.streak = "neck_chop"
+ H.mind.martial_art.streak = "neck_chop"
/datum/action/leg_sweep
name = "Leg Sweep - Trips the victim, knocking them down for a brief moment."
@@ -29,12 +29,12 @@
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
var/mob/living/carbon/human/H = owner
- if (H.martial_art.streak == "leg_sweep")
+ if (H.mind.martial_art.streak == "leg_sweep")
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
- H.martial_art.streak = ""
+ H.mind.martial_art.streak = ""
else
owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.")
- H.martial_art.streak = "leg_sweep"
+ H.mind.martial_art.streak = "leg_sweep"
/datum/action/lung_punch//referred to internally as 'quick choke'
name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time."
@@ -45,12 +45,12 @@
to_chat(owner, "You can't use Krav Maga while you're incapacitated.")
return
var/mob/living/carbon/human/H = owner
- if (H.martial_art.streak == "quick_choke")
+ if (H.mind.martial_art.streak == "quick_choke")
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
- H.martial_art.streak = ""
+ H.mind.martial_art.streak = ""
else
owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.")
- H.martial_art.streak = "quick_choke"//internal name for lung punch
+ H.mind.martial_art.streak = "quick_choke"//internal name for lung punch
/datum/martial_art/krav_maga/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
..()
diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm
new file mode 100644
index 0000000000..c79ef032ee
--- /dev/null
+++ b/code/datums/martial/plasma_fist.dm
@@ -0,0 +1,114 @@
+#define TORNADO_COMBO "HHD"
+#define THROWBACK_COMBO "DHD"
+#define PLASMA_COMBO "HDDDH"
+
+/datum/martial_art/plasma_fist
+ name = "Plasma Fist"
+ help_verb = /mob/living/carbon/human/proc/plasma_fist_help
+
+
+/datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(findtext(streak,TORNADO_COMBO))
+ streak = ""
+ Tornado(A,D)
+ return 1
+ if(findtext(streak,THROWBACK_COMBO))
+ streak = ""
+ Throwback(A,D)
+ return 1
+ if(findtext(streak,PLASMA_COMBO))
+ streak = ""
+ Plasma(A,D)
+ return 1
+ return 0
+
+/datum/martial_art/plasma_fist/proc/TornadoAnimate(mob/living/carbon/human/A)
+ set waitfor = FALSE
+ for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
+ if(!A)
+ break
+ A.setDir(i)
+ playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1)
+ sleep(1)
+
+/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ A.say("TORNADO SWEEP!")
+ TornadoAnimate(A)
+ var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null)
+ var/list/turfs = list()
+ for(var/turf/T in range(1,A))
+ turfs.Add(T)
+ R.cast(turfs)
+ add_logs(A, D, "tornado sweeped(Plasma Fist)")
+ return
+
+/datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ D.visible_message("[A] has hit [D] with Plasma Punch!", \
+ "[A] has hit [D] with Plasma Punch!")
+ playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
+ var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
+ D.throw_at(throw_target, 200, 4,A)
+ A.say("HYAH!")
+ add_logs(A, D, "threw back (Plasma Fist)")
+ return
+
+/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
+ A.say("PLASMA FIST!")
+ D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \
+ "[A] has hit [D] with THE PLASMA FIST TECHNIQUE!")
+ D.gib()
+ add_logs(A, D, "gibbed (Plasma Fist)")
+ return
+
+/datum/martial_art/plasma_fist/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("H",D)
+ if(check_streak(A,D))
+ return 1
+ basic_hit(A,D)
+ return 1
+
+/datum/martial_art/plasma_fist/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("D",D)
+ if(check_streak(A,D))
+ return 1
+ basic_hit(A,D)
+ return 1
+
+/datum/martial_art/plasma_fist/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("G",D)
+ if(check_streak(A,D))
+ return 1
+ basic_hit(A,D)
+ return 1
+
+/mob/living/carbon/human/proc/plasma_fist_help()
+ set name = "Recall Teachings"
+ set desc = "Remember the martial techniques of the Plasma Fist."
+ set category = "Plasma Fist"
+
+ to_chat(usr, "You clench your fists and have a flashback of knowledge...")
+ to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.")
+ to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.")
+ to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.")
+
+/obj/item/weapon/plasma_fist_scroll
+ name = "frayed scroll"
+ desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state ="scroll2"
+ var/used = 0
+
+/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user)
+ if(!ishuman(user))
+ return
+ if(!used)
+ var/mob/living/carbon/human/H = user
+ var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
+ F.teach(H)
+ to_chat(H, "You have learned the ancient martial art of Plasma Fist.")
+ used = 1
+ desc = "It's completely blank."
+ name = "empty scroll"
+ icon_state = "blankscroll"
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
new file mode 100644
index 0000000000..f079d2a7db
--- /dev/null
+++ b/code/datums/martial/sleeping_carp.dm
@@ -0,0 +1,247 @@
+#define WRIST_WRENCH_COMBO "DD"
+#define BACK_KICK_COMBO "HG"
+#define STOMACH_KNEE_COMBO "GH"
+#define HEAD_KICK_COMBO "DHH"
+#define ELBOW_DROP_COMBO "HDHDH"
+
+/datum/martial_art/the_sleeping_carp
+ name = "The Sleeping Carp"
+ deflection_chance = 100
+ no_guns = TRUE
+ allow_temp_override = FALSE
+ help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
+
+/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(findtext(streak,WRIST_WRENCH_COMBO))
+ streak = ""
+ wristWrench(A,D)
+ return 1
+ if(findtext(streak,BACK_KICK_COMBO))
+ streak = ""
+ backKick(A,D)
+ return 1
+ if(findtext(streak,STOMACH_KNEE_COMBO))
+ streak = ""
+ kneeStomach(A,D)
+ return 1
+ if(findtext(streak,HEAD_KICK_COMBO))
+ streak = ""
+ headKick(A,D)
+ return 1
+ if(findtext(streak,ELBOW_DROP_COMBO))
+ streak = ""
+ elbowDrop(A,D)
+ return 1
+ return 0
+
+/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat && !D.stunned && !D.weakened)
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \
+ "[A] grabs your wrist and violently wrenches it to the side!")
+ playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ D.emote("scream")
+ D.drop_item()
+ D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
+ D.Stun(3)
+ return 1
+ add_logs(A, D, "wrist wrenched (Sleeping Carp)")
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(A.dir == D.dir && !D.stat && !D.weakened)
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ D.visible_message("[A] kicks [D] in the back!", \
+ "[A] kicks you in the back, making you stumble and fall!")
+ step_to(D,get_step(D,D.dir),1)
+ D.Weaken(4)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ return 1
+ add_logs(A, D, "back-kicked (Sleeping Carp)")
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat && !D.weakened)
+ A.do_attack_animation(D, ATTACK_EFFECT_KICK)
+ D.visible_message("[A] knees [D] in the stomach!", \
+ "[A] winds you with a knee in the stomach!")
+ D.audible_message("[D] gags!")
+ D.losebreath += 3
+ D.Stun(2)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ return 1
+ add_logs(A, D, "stomach kneed (Sleeping Carp)")
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!D.stat && !D.weakened)
+ A.do_attack_animation(D, ATTACK_EFFECT_KICK)
+ D.visible_message("[A] kicks [D] in the head!", \
+ "[A] kicks you in the jaw!")
+ D.apply_damage(20, BRUTE, "head")
+ D.drop_item()
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ D.Stun(4)
+ return 1
+ add_logs(A, D, "head kicked (Sleeping Carp)")
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(D.weakened || D.resting || D.stat)
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ D.visible_message("[A] elbow drops [D]!", \
+ "[A] piledrives you with their elbow!")
+ if(D.stat)
+ D.death() //FINISH HIM!
+ D.apply_damage(50, BRUTE, "chest")
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
+ return 1
+ add_logs(A, D, "elbow dropped (Sleeping Carp)")
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("G",D)
+ if(check_streak(A,D))
+ return 1
+ if(A.grab_state >= GRAB_AGGRESSIVE)
+ D.grabbedby(A, 1)
+ else
+ A.start_pulling(D, 1)
+ if(A.pulling)
+ D.drop_all_held_items()
+ D.stop_pulling()
+ if(A.a_intent == INTENT_GRAB)
+ add_logs(A, D, "grabbed", addition="aggressively")
+ A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
+ else
+ add_logs(A, D, "grabbed", addition="passively")
+ A.grab_state = GRAB_PASSIVE
+ return 1
+
+/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("H",D)
+ if(check_streak(A,D))
+ return 1
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
+ D.visible_message("[A] [atk_verb] [D]!", \
+ "[A] [atk_verb] you!")
+ D.apply_damage(rand(10,15), BRUTE)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1)
+ if(prob(D.getBruteLoss()) && !D.lying)
+ D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!")
+ D.Weaken(4)
+ add_logs(A, D, "[atk_verb] (Sleeping Carp)")
+ return 1
+
+
+/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ add_to_streak("D",D)
+ if(check_streak(A,D))
+ return 1
+ return ..()
+
+/mob/living/carbon/human/proc/sleeping_carp_help()
+ set name = "Recall Teachings"
+ set desc = "Remember the martial techniques of the Sleeping Carp clan."
+ set category = "Sleeping Carp"
+
+ to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...")
+
+ to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.")
+ to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.")
+ to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.")
+ to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.")
+ to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.")
+
+/obj/item/weapon/sleeping_carp_scroll
+ name = "mysterious scroll"
+ desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "scroll2"
+
+/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
+ if(!istype(user) || !user)
+ return
+ var/message = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
+ directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab."
+ to_chat(user, message)
+ var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
+ theSleepingCarp.teach(user)
+ user.drop_item()
+ visible_message("[src] lights up in fire and quickly burns to ash.")
+ new /obj/effect/decal/cleanable/ash(get_turf(src))
+ qdel(src)
+
+/obj/item/weapon/twohanded/bostaff
+ name = "bo staff"
+ desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
+ force = 10
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = SLOT_BACK
+ force_unwielded = 10
+ force_wielded = 24
+ throwforce = 20
+ throw_speed = 2
+ attack_verb = list("smashed", "slammed", "whacked", "thwacked")
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "bostaff0"
+ block_chance = 50
+
+/obj/item/weapon/twohanded/bostaff/update_icon()
+ icon_state = "bostaff[wielded]"
+ return
+
+/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
+ add_fingerprint(user)
+ if((CLUMSY in user.disabilities) && prob(50))
+ to_chat(user, "You club yourself over the head with [src].")
+ user.Weaken(3)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.apply_damage(2*force, BRUTE, "head")
+ else
+ user.take_bodypart_damage(2*force)
+ return
+ if(iscyborg(target))
+ return ..()
+ if(!isliving(target))
+ return ..()
+ var/mob/living/carbon/C = target
+ if(C.stat)
+ to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.")
+ return
+ if(user.a_intent == INTENT_DISARM)
+ if(!wielded)
+ return ..()
+ if(!ishuman(target))
+ return ..()
+ var/mob/living/carbon/human/H = target
+ var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
+ "[user] smacks [H] with the butt of [src]!", \
+ "[user] broadsides [H] with [src]!", \
+ "[user] smashes [H]'s head with [src]!", \
+ "[user] beats [H] with front of [src]!", \
+ "[user] twirls and slams [H] with [src]!")
+ H.visible_message("[pick(fluffmessages)]", \
+ "[pick(fluffmessages)]")
+ playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
+ H.adjustStaminaLoss(rand(13,20))
+ if(prob(10))
+ H.visible_message("[H] collapses!", \
+ "Your legs give out!")
+ H.Weaken(4)
+ if(H.staminaloss && !H.sleeping)
+ var/total_health = (H.health - H.staminaloss)
+ if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat)
+ H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \
+ "[user] knocks you unconscious!")
+ H.SetSleeping(30)
+ H.adjustBrainLoss(25)
+ else
+ return ..()
+
+/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
+ if(wielded)
+ return ..()
+ return 0
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 5554ceeaeb..fc1c7a9b6d 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -1,3 +1,13 @@
+/mob/living/carbon/human/proc/wrestling_help()
+ set name = "Recall Teachings"
+ set desc = "Remember how to wrestle."
+ set category = "Wrestling"
+
+ to_chat(usr, "You flex your muscles and have a revelation...")
+ to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.")
+ to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.")
+ to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.")
+
/datum/martial_art/wrestling
name = "Wrestling"
var/datum/action/slam/slam = new/datum/action/slam()
@@ -40,7 +50,7 @@
return
owner.visible_message("[owner] prepares to BODY SLAM!", "Your next attack will be a BODY SLAM.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "slam"
+ H.mind.martial_art.streak = "slam"
/datum/action/throw_wrassle
name = "Throw (Cinch) - Spin a cinched opponent around and throw them."
@@ -52,7 +62,7 @@
return
owner.visible_message("[owner] prepares to THROW!", "Your next attack will be a THROW.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "throw"
+ H.mind.martial_art.streak = "throw"
/datum/action/kick
name = "Kick - A powerful kick, sends people flying away from you. Also useful for escaping from bad situations."
@@ -64,7 +74,7 @@
return
owner.visible_message("[owner] prepares to KICK!", "Your next attack will be a KICK.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "kick"
+ H.mind.martial_art.streak = "kick"
/datum/action/strike
name = "Strike - Hit a neaby opponent with a quick attack."
@@ -76,7 +86,7 @@
return
owner.visible_message("[owner] prepares to STRIKE!", "Your next attack will be a STRIKE.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "strike"
+ H.mind.martial_art.streak = "strike"
/datum/action/drop
name = "Drop - Smash down onto an opponent."
@@ -88,7 +98,7 @@
return
owner.visible_message("[owner] prepares to LEG DROP!", "Your next attack will be a LEG DROP.")
var/mob/living/carbon/human/H = owner
- H.martial_art.streak = "drop"
+ H.mind.martial_art.streak = "drop"
/datum/martial_art/wrestling/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
..()
@@ -430,3 +440,23 @@
D.Stun(rand(3,5))
add_logs(A, D, "cinched")
return 1
+
+/obj/item/weapon/storage/belt/champion/wrestling
+ name = "Wrestling Belt"
+ var/datum/martial_art/wrestling/style = new
+
+/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
+ if(!ishuman(user))
+ return
+ if(slot == slot_belt)
+ var/mob/living/carbon/human/H = user
+ style.teach(H,1)
+ return
+
+/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(H.get_item_by_slot(slot_belt) == src)
+ style.remove(H)
+ return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 04bec0a7a4..7f7310665b 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -50,7 +50,8 @@
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/linglink
-
+ var/datum/martial_art/martial_art = null
+ var/static/default_martial_art = new/datum/martial_art
var/miming = 0 // Mime's vow of silence
var/list/antag_datums
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 5b7d015e19..f24ad5f7c3 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -166,4 +166,30 @@
/datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
id = "cult_ghost"
duration = -1
- alert_type = null
\ No newline at end of file
+ alert_type = null
+/datum/status_effect/crusher_mark
+ id = "crusher_mark"
+ duration = 30 //if you leave for 30 seconds you lose the mark, deal with it
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+ var/mutable_appearance/marked_underlay
+ var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
+
+/datum/status_effect/crusher_mark/on_apply()
+ if(owner.mob_size >= MOB_SIZE_LARGE)
+ marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
+ marked_underlay.pixel_x = -owner.pixel_x
+ marked_underlay.pixel_y = -owner.pixel_y
+ owner.underlays += marked_underlay
+ return FALSE
+
+/datum/status_effect/crusher_mark/Destroy()
+ hammer_synced = null
+ if(owner)
+ owner.underlays -= marked_underlay
+ QDEL_NULL(marked_underlay)
+ return ..()
+
+/datum/status_effect/crusher_mark/be_replaced()
+ owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point.
+ ..()
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 46853995cb..4f36685439 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -32,7 +32,7 @@
/mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B)
if(stat != DEAD && health < maxHealth)
for(var/i in 1 to 2)
- var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(src)) //hello yes you are being healed
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
H.color = overmind.blob_reagent_datum.complementary_color
else
@@ -91,7 +91,7 @@
melee_damage_lower = 2
melee_damage_upper = 4
obj_damage = 20
- environment_smash = 1
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
movement_type = FLYING
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index f9eb16c7a9..e80e92337e 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -140,7 +140,7 @@
loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it
/obj/structure/blob/proc/blob_attack_animation(atom/A = null, controller) //visually attacks an atom
- var/obj/effect/overlay/temp/blob/O = new /obj/effect/overlay/temp/blob(src.loc)
+ var/obj/effect/temp_visual/blob/O = new /obj/effect/temp_visual/blob(src.loc)
O.setDir(dir)
if(controller)
var/mob/camera/blob/BO = controller
@@ -208,7 +208,7 @@
if(overmind)
overmind.blob_reagent_datum.emp_reaction(src, severity)
if(prob(100 - severity * 30))
- new /obj/effect/overlay/temp/emp(get_turf(src))
+ new /obj/effect/temp_visual/emp(get_turf(src))
/obj/structure/blob/tesla_act(power)
..()
diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
index cf709f09b0..7d8c3eb1f9 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
@@ -73,7 +73,7 @@
L.visible_message("[src] appears around [L] in a burst of light!", \
"[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!")
L.Stun(5)
- new /obj/effect/overlay/temp/ratvar/sigil/transgression(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/sigil/transgression(get_turf(src))
qdel(src)
@@ -102,7 +102,7 @@
L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...")
var/oldcolor = color
animate(src, color = "#AF0AAF", time = convert_time)
- var/obj/effect/overlay/temp/ratvar/sigil/glow
+ var/obj/effect/temp_visual/ratvar/sigil/glow
if(glow_type)
glow = new glow_type(get_turf(src))
animate(glow, alpha = 255, time = convert_time)
@@ -158,7 +158,7 @@
light_color = "#A97F1B"
delete_on_finish = FALSE
sigil_name = "Sigil of Accession"
- glow_type = /obj/effect/overlay/temp/ratvar/sigil/accession
+ glow_type = /obj/effect/temp_visual/ratvar/sigil/accession
resist_string = "glows bright orange"
/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
@@ -321,14 +321,14 @@
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src))
sigil_active = TRUE
if(animation_number >= 4)
- new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animation_number = 0
animation_number++
if(!is_servant_of_ratvar(L))
var/vitality_drained = 0
if(L.stat == DEAD)
vitality_drained = L.maxHealth
- var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/WandODeath.ogg', 50, 1)
L.visible_message("[L] collapses in on [L.p_them()]self as [src] flares bright blue!")
@@ -356,7 +356,7 @@
if(ghost)
ghost.reenter_corpse()
L.revive(1, 1)
- var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/Staff_Healing.ogg', 50, 1)
L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
index 120ed0ff60..ec35ae4c5b 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
@@ -124,15 +124,15 @@
/proc/get_component_animation_type(id)
switch(id)
if(BELLIGERENT_EYE)
- return /obj/effect/overlay/temp/ratvar/component
+ return /obj/effect/temp_visual/ratvar/component
if(VANGUARD_COGWHEEL)
- return /obj/effect/overlay/temp/ratvar/component/cogwheel
+ return /obj/effect/temp_visual/ratvar/component/cogwheel
if(GEIS_CAPACITOR)
- return /obj/effect/overlay/temp/ratvar/component/capacitor
+ return /obj/effect/temp_visual/ratvar/component/capacitor
if(REPLICANT_ALLOY)
- return /obj/effect/overlay/temp/ratvar/component/alloy
+ return /obj/effect/temp_visual/ratvar/component/alloy
if(HIEROPHANT_ANSIBLE)
- return /obj/effect/overlay/temp/ratvar/component/ansible
+ return /obj/effect/temp_visual/ratvar/component/ansible
else
return null
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
index 5ede091ca4..3e7d0f3779 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
@@ -5,60 +5,60 @@
//otherwise, return literally any non-list thing but preferably FALSE
//returning TRUE won't produce the "cannot be proselytized" message and will still prevent proselytizing
-/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Turf conversion
-/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //four sheets of metal
+/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //four sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 4), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal
+/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, five rods
+/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, five rods
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2) - (POWER_ROD * 5), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //no metal
+/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //no metal
return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH)
-/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal
+/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
-/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 50, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = -POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
-/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(floor_tile == /obj/item/stack/tile/plasteel)
new floor_tile(src)
make_plating()
playsound(src, 'sound/items/Crowbar.ogg', 10, 1) //clink
return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = POWER_FLOOR, "spawn_dir" = SOUTH)
-/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(locate(/obj/structure/table) in src)
return FALSE
if(is_blocked_turf(src, TRUE))
to_chat(user, "Something is in the way, preventing you from proselytizing [src] into a clockwork wall.")
return TRUE
var/operation_time = 100
- if(!GLOB.ratvar_awakens && proselytizer.speed_multiplier > 0) //if ratvar isn't awake, this always takes 10 seconds
+ if(proselytizer.speed_multiplier > 0)
operation_time /= proselytizer.speed_multiplier
return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
//False wall conversion
-/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/cost = POWER_WALL_MINUS_FLOOR
if(ispath(mineral, /obj/item/stack/sheet/metal))
cost -= (POWER_METAL * (2 + mineral_amount)) //four sheets of metal, plus an assumption that the girder is also two
@@ -66,17 +66,17 @@
cost -= (POWER_METAL * 2) //anything that doesn't use metal just has the girder
return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = cost, "spawn_dir" = SOUTH)
-/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, two rods; special assumption
+/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, two rods; special assumption
return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = POWER_WALL_MINUS_FLOOR - (POWER_METAL * 2) - (POWER_ROD * 2), "spawn_dir" = SOUTH)
-/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Metal conversion
-/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
var/amount_temp = get_amount()
@@ -90,7 +90,7 @@
no_delete = TRUE
use(amount_temp)
amount_temp *= 12.5 //each tile is 12.5 power so this is 2 tiles to 25 power
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete)
if(amount_temp >= 20)
var/sheets_to_make = round(amount_temp * 0.05) //and 20 to 1 brass
var/used = sheets_to_make * 20
@@ -104,11 +104,11 @@
to_chat(user, "You need at least 20 floor tiles to convert into brass.")
return TRUE
-/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH)
if(get_amount() >= 10)
var/sheets_to_make = round(get_amount() * 0.1)
var/used = sheets_to_make * 10
@@ -122,11 +122,11 @@
to_chat(user, "You need at least 10 rods to convert into brass.")
return TRUE
-/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH)
if(get_amount() >= 5)
var/sheets_to_make = round(get_amount() * 0.2)
var/used = sheets_to_make * 5
@@ -140,11 +140,11 @@
to_chat(user, "You need at least 5 sheets of metal to convert into brass.")
return TRUE
-/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH)
if(get_amount() >= 2)
var/sheets_to_make = round(get_amount() * 0.5)
var/used = sheets_to_make * 2
@@ -159,23 +159,23 @@
return TRUE
//Brass directly to power
-/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
//Airlock conversion
-/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/doortype = /obj/machinery/door/airlock/clockwork
if(glass)
doortype = /obj/machinery/door/airlock/clockwork/brass
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir)
-/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Table conversion
-/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/prosel_cost = POWER_STANDARD
if(framestack == /obj/item/stack/rods)
prosel_cost -= POWER_ROD*framestackamount
@@ -187,10 +187,10 @@
prosel_cost -= POWER_PLASTEEL*buildstackamount
return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
-/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
-/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/prosel_cost = POWER_FLOOR
if(framestack == /obj/item/stack/rods)
prosel_cost -= POWER_ROD*framestackamount
@@ -198,11 +198,11 @@
prosel_cost -= POWER_FLOOR*framestackamount
return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
-/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Window conversion
-/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/windowtype = /obj/structure/window/reinforced/clockwork
var/new_dir = TRUE
var/prosel_time = 15
@@ -220,18 +220,18 @@
INVOKE_ASYNC(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, G, user)
return list("operation_time" = prosel_time, "new_obj_type" = windowtype, "power_cost" = prosel_cost, "spawn_dir" = dir, "dir_in_new" = new_dir)
-/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Windoor conversion
-/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE)
-/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Grille conversion
-/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/grilletype = /obj/structure/grille/ratvar
var/prosel_time = 15
if(broken)
@@ -239,32 +239,32 @@
prosel_time = 5
return list("operation_time" = prosel_time, "new_obj_type" = grilletype, "power_cost" = 0, "spawn_dir" = dir)
-/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Lattice conversion
-/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE)
-/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
ratvar_act() //just in case we're the wrong type for some reason??
return FALSE
-/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/catwalk/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE)
-/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
//Girder conversion
-/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/prosel_cost = POWER_GEAR - (POWER_METAL * 2)
if(state == GIRDER_REINF_STRUTS || state == GIRDER_REINF)
prosel_cost -= POWER_PLASTEEL
return list("operation_time" = 20, "new_obj_type" = /obj/structure/destructible/clockwork/wall_gear, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
//Hitting a clockwork structure will try to repair it.
-/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
@@ -287,7 +287,7 @@
"You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.")
//Hitting a sigil of transmission will try to charge from it.
-/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
var/list/charge_values = list()
if(!proselytizer.sigil_charge_checks(charge_values, src, user))
@@ -337,7 +337,7 @@
adjustHealth(-amount)
//Hitting a ratvar'd silicon will also try to repair it.
-/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
@@ -346,7 +346,7 @@
"You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.")
//Same with clockwork mobs.
-/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
@@ -355,7 +355,7 @@
"You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [health]/[maxHealth] health.")
//Cogscarabs get special interaction because they're drones and have innate self-heals/revives.
-/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
+/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(stat == DEAD)
try_reactivate(user) //if we're at maximum health, prosel the turf under us
@@ -374,36 +374,17 @@
proselytizer.repairing = null
//Convert shards and gear bits directly to power
-/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
- if(!power_amount)
- power_amount = -POWER_STANDARD
- if(proselytizer.can_use_power(power_amount))
- var/obj/effect/overlay/temp/ratvar/beam/itemconsume/B = new /obj/effect/overlay/temp/ratvar/beam/itemconsume(get_turf(src))
- B.pixel_x = pixel_x
- B.pixel_y = pixel_y
- if(!silent) //looper no looping
- for(var/obj/item/clockwork/alloy_shards/S in get_turf(src)) //convert all other shards in the turf if we can
- if(S == src)
- continue //we want the shards to be proselytized after the main shard, thus this delay
- addtimer(CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, S, user, TRUE), 0)
- return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH)
-/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
- if(!power_amount)
- power_amount = -(CLOCKCULT_POWER_UNIT*0.08)
- return ..()
+/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.08), "spawn_dir" = SOUTH)
-/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
- if(!power_amount)
- power_amount = -(CLOCKCULT_POWER_UNIT*0.06)
- return ..()
+/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.06), "spawn_dir" = SOUTH)
-/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
- if(!power_amount)
- power_amount = -(CLOCKCULT_POWER_UNIT*0.04)
- return ..()
+/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.04), "spawn_dir" = SOUTH)
-/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
- if(!power_amount)
- power_amount = -(CLOCKCULT_POWER_UNIT*0.02)
- return ..()
+/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH)
\ No newline at end of file
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
index 57a68078df..ccf7aead44 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
@@ -124,7 +124,7 @@
L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE)
var/healseverity = max(round(totaldamage*0.05, 1), 1) //shows the general severity of the damage you just healed, 1 glow per 20
for(var/i in 1 to healseverity)
- new /obj/effect/overlay/temp/heal(targetturf, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1")
clockwork_say(ranged_ability_user, text2ratvar("Mend wounded flesh!"))
add_logs(ranged_ability_user, L, "healed with Sentinel's Compromise")
else
@@ -173,7 +173,7 @@
if(usable_power > 0 && C.cell.use(usable_power))
multiplier += (usable_power * 0.001)
qdel(VC)
- new/obj/effect/overlay/temp/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier)
+ new/obj/effect/temp_visual/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier)
add_logs(ranged_ability_user, targetturf, "fired a volt ray")
remove_ranged_ability()
diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
index 976cd1cb4b..a54b019d53 100644
--- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
@@ -96,13 +96,13 @@
impale_cooldown = world.time + initial(impale_cooldown)
attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling
if(target)
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
target.Stun(2) //brief stun
to_chat(user, "You prepare to remove your ratvarian spear from [target]...")
var/remove_verb = pick("pull", "yank", "drag")
if(do_after(user, 10, 1, target))
var/turf/T = get_turf(target)
- var/obj/effect/overlay/temp/dir_setting/bloodsplatter/B = new /obj/effect/overlay/temp/dir_setting/bloodsplatter(T, get_dir(target, user))
+ var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user))
playsound(T, 'sound/misc/splort.ogg', 200, 1)
playsound(T, 'sound/weapons/pierce.ogg', 200, 1)
if(target.stat != CONSCIOUS)
@@ -151,5 +151,5 @@
T = get_turf(src)
if(T) //make sure we're not in null or something
T.visible_message("[src] [pick("cracks in two and fades away", "snaps in two and dematerializes")]!")
- new /obj/effect/overlay/temp/ratvar/spearbreak(T)
+ new /obj/effect/temp_visual/ratvar/spearbreak(T)
qdel(src)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
index 6006c25724..376526febb 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
@@ -150,7 +150,7 @@
if(iscarbon(host))
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
if(GLOB.ratvar_awakens || resulthealth <= MARAUDER_EMERGE_THRESHOLD)
- new /obj/effect/overlay/temp/heal(host.loc, "#AF0AAF")
+ new /obj/effect/temp_visual/heal(host.loc, "#AF0AAF")
host.heal_ordered_damage(4, damage_heal_order)
/mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
index bc5ec1b9d8..9efb9a8eb2 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
@@ -114,7 +114,7 @@
for(var/i in 1 to heal_attempts)
if(S.health < S.maxHealth)
S.adjustHealth(-heal_amount)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_attempts && S.health >= S.maxHealth) //we finished healing on the last tick, give them the message
to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -129,7 +129,7 @@
for(var/i in 1 to heal_attempts)
if(S.health < S.maxHealth)
S.heal_ordered_damage(heal_amount, damage_heal_order)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_attempts && S.health >= S.maxHealth)
to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -158,7 +158,7 @@
for(var/i in 1 to heal_ticks)
if(H.health < H.maxHealth)
H.heal_ordered_damage(heal_amount, damage_heal_order)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_ticks && H.health >= H.maxHealth)
to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -174,10 +174,10 @@
if(C.obj_integrity < C.max_integrity)
C.obj_integrity = min(C.obj_integrity + 5, C.max_integrity)
C.update_icon()
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
else
break
- new /obj/effect/overlay/temp/ratvar/mending_mantra(get_turf(invoker))
+ new /obj/effect/temp_visual/ratvar/mending_mantra(get_turf(invoker))
return TRUE
@@ -389,7 +389,7 @@
usable_power = min(Floor(C.cell.charge * 0.2, MIN_CLOCKCULT_POWER), 1000) - prev_power
if(usable_power > 0 && C.cell.use(usable_power))
multiplier += (usable_power * 0.0005)
- var/obj/effect/overlay/temp/ratvar/volt_hit/VH = new /obj/effect/overlay/temp/ratvar/volt_hit(get_turf(invoker), null, multiplier)
+ var/obj/effect/temp_visual/ratvar/volt_hit/VH = new /obj/effect/temp_visual/ratvar/volt_hit(get_turf(invoker), null, multiplier)
invoker.visible_message("[invoker] is struck by [invoker.p_their()] own [VH.name]!", "You're struck by your own [VH.name]!")
invoker.adjustFireLoss(VH.damage) //you have to fail all five blasts to die to this
playsound(invoker, 'sound/machines/defib_zap.ogg', VH.damage, 1, -1)
diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm
index 0a193e7558..64c7135971 100644
--- a/code/game/gamemodes/clock_cult/clock_structure.dm
+++ b/code/game/gamemodes/clock_cult/clock_structure.dm
@@ -131,7 +131,7 @@
if(anchored && unanchored_icon)
anchored = FALSE
update_anchored(null, obj_integrity > max_integrity * 0.25)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
//for the ark and Ratvar
@@ -222,7 +222,7 @@
/obj/structure/destructible/clockwork/powered/emp_act(severity)
if(forced_disable(TRUE))
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
/obj/structure/destructible/clockwork/powered/proc/total_accessable_power() //how much power we have and can use
if(!needs_power || GLOB.ratvar_awakens)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
index 1203c7119a..84098fca57 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
@@ -31,7 +31,7 @@
return
/obj/structure/destructible/clockwork/geis_binding/emp_act(severity)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
qdel(src)
/obj/structure/destructible/clockwork/geis_binding/post_buckle_mob(mob/living/M)
@@ -54,8 +54,8 @@
if(!can_resist)
repair_and_interrupt()
else
- var/obj/effect/overlay/temp/ratvar/geis_binding/G = new /obj/effect/overlay/temp/ratvar/geis_binding(M.loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T = new /obj/effect/overlay/temp/ratvar/geis_binding/top(M.loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc)
G.layer = mob_layer - 0.01
T.layer = mob_layer + 0.01
G.alpha = alpha
@@ -93,10 +93,10 @@
var/mob/living/carbon/C = L
C.silent += 4
visible_message("[src] flares brightly!")
- var/obj/effect/overlay/temp/ratvar/geis_binding/G1 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/G2 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T1 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T2 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T1 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T2 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc)
G1.layer = mob_layer - 0.01
G2.layer = mob_layer - 0.01
T1.layer = mob_layer + 0.01
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
index c4415dfed8..9c7b5e9518 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
@@ -87,7 +87,7 @@
var/obj/mecha/M = target
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
- new /obj/effect/overlay/temp/ratvar/ocular_warden(get_turf(target))
+ new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target))
setDir(get_dir(get_turf(src), get_turf(target)))
if(!target)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
index 94bf35b6a7..8dc2fb06f0 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
@@ -19,7 +19,7 @@
/obj/structure/destructible/clockwork/wall_gear/Initialize()
. = ..()
- new /obj/effect/overlay/temp/ratvar/gear(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/gear(get_turf(src))
/obj/structure/destructible/clockwork/wall_gear/emp_act(severity)
return
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 098fbcdf26..6651f68556 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -177,13 +177,13 @@
var/turf/mobloc = get_turf(B.current)
switch(i)
if(1)
- new /obj/effect/overlay/temp/cult/sparks(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/cult/sparks(mobloc, B.current.dir)
playsound(mobloc, "sparks", 50, 1)
if(2)
- new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, B.current.dir)
playsound(mobloc, "sparks", 75, 1)
if(3)
- new /obj/effect/overlay/temp/dir_setting/cult/phase(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir)
playsound(mobloc, "sparks", 100, 1)
if(4)
playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, 1)
@@ -193,7 +193,7 @@
var/obj/item/device/soulstone/S = B.current.loc
S.release_shades(owner)
B.current.setDir(SOUTH)
- new /obj/effect/overlay/temp/cult/blood(final)
+ new /obj/effect/temp_visual/cult/blood(final)
addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10)
else
return
@@ -201,7 +201,7 @@
Remove(owner)
/mob/proc/reckon(turf/final)
- new /obj/effect/overlay/temp/cult/blood/out(get_turf(src))
+ new /obj/effect/temp_visual/cult/blood/out(get_turf(src))
forceMove(final)
/datum/action/innate/cult/master/finalreck/proc/chant(chant_number)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 62559379c5..4be11267ef 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -204,7 +204,7 @@
if(current_charges)
owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!")
current_charges--
- new /obj/effect/overlay/temp/cult/sparks(get_turf(owner))
+ new /obj/effect/temp_visual/cult/sparks(get_turf(owner))
if(!current_charges)
owner.visible_message("The runed shield around [owner] suddenly disappears!")
owner.update_inv_wear_suit()
@@ -356,14 +356,14 @@
if(uses <= 0)
icon_state ="shifter_drained"
playsound(mobloc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, C.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir)
var/atom/movable/pulled = handle_teleport_grab(destination, C)
C.forceMove(destination)
if(pulled)
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
- new /obj/effect/overlay/temp/dir_setting/cult/phase(destination, C.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
playsound(destination, "sparks", 50, 1)
@@ -375,8 +375,8 @@
desc = "Used by veteran cultists to instantly transport items to their needful bretheren."
w_class = WEIGHT_CLASS_SMALL
brightness_on = 1
- icon_state = "torch-on"
- item_state = "torch-on"
+ icon_state = "torch"
+ item_state = "torch"
color = "#ff0000"
on_damage = 15
slot_flags = null
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 51c622858d..63e5b97b9e 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -152,7 +152,7 @@
for(var/mob/living/L in range(5, src))
if(iscultist(L) || isshade(L) || isconstruct(L))
if(L.health != L.maxHealth)
- new /obj/effect/overlay/temp/heal(get_turf(src), "#960000")
+ new /obj/effect/temp_visual/heal(get_turf(src), "#960000")
if(ishuman(L))
L.adjustBruteLoss(-1, 0)
L.adjustFireLoss(-1, 0)
@@ -190,7 +190,7 @@
else
var/turf/open/floor/engine/cult/F = safepick(cultturfs)
if(F)
- new /obj/effect/overlay/temp/cult/turf/floor(F)
+ new /obj/effect/temp_visual/cult/turf/floor(F)
else
// Are we in space or something? No cult turfs or
// convertable turfs?
diff --git a/code/game/gamemodes/cult/rune_spawn_action.dm b/code/game/gamemodes/cult/rune_spawn_action.dm
index beffe924bc..7412a5d6bb 100644
--- a/code/game/gamemodes/cult/rune_spawn_action.dm
+++ b/code/game/gamemodes/cult/rune_spawn_action.dm
@@ -7,9 +7,9 @@
var/scribe_time = 100
var/damage_interrupt = TRUE
var/action_interrupt = TRUE
- var/obj/effect/overlay/temp/cult/rune_spawn/rune_word_type
- var/obj/effect/overlay/temp/cult/rune_spawn/rune_innerring_type
- var/obj/effect/overlay/temp/cult/rune_spawn/rune_center_type
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_word_type
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_innerring_type
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type
var/rune_color
/datum/action/innate/cult/create_rune/IsAvailable()
@@ -27,15 +27,15 @@
if(!chosen_keyword)
return
//the outer ring is always the same across all runes
- var/obj/effect/overlay/temp/cult/rune_spawn/R1 = new(owner.loc, scribe_time, rune_color)
+ var/obj/effect/temp_visual/cult/rune_spawn/R1 = new(owner.loc, scribe_time, rune_color)
//the rest are not always the same, so we need types for em
- var/obj/effect/overlay/temp/cult/rune_spawn/R2
+ var/obj/effect/temp_visual/cult/rune_spawn/R2
if(rune_word_type)
R2 = new rune_word_type(owner.loc, scribe_time, rune_color)
- var/obj/effect/overlay/temp/cult/rune_spawn/R3
+ var/obj/effect/temp_visual/cult/rune_spawn/R3
if(rune_innerring_type)
R3 = new rune_innerring_type(owner.loc, scribe_time, rune_color)
- var/obj/effect/overlay/temp/cult/rune_spawn/R4
+ var/obj/effect/temp_visual/cult/rune_spawn/R4
if(rune_center_type)
R4 = new rune_center_type(owner.loc, scribe_time, rune_color)
@@ -64,7 +64,7 @@
/datum/action/innate/cult/create_rune/tele
button_icon_state = "telerune"
rune_type = /obj/effect/rune/teleport
- rune_word_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2
- rune_innerring_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2/inner
- rune_center_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2/center
+ rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune2
+ rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/inner
+ rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/center
rune_color = RUNE_COLOR_TELEPORT
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 9de8c237bc..e3b990bfef 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -410,7 +410,7 @@ structure_check() searches for nearby cultist structures required for the invoca
else
GLOB.sacrificed += sacrificial
- new /obj/effect/overlay/temp/cult/sac(get_turf(src))
+ new /obj/effect/temp_visual/cult/sac(get_turf(src))
for(var/M in invokers)
if(big_sac)
to_chat(M, "\"Yes! This is the one I desire! You have done well.\"")
diff --git a/code/game/gamemodes/devil/imp/imp.dm b/code/game/gamemodes/devil/imp/imp.dm
index 602fbf765e..70ed6dfc1d 100644
--- a/code/game/gamemodes/devil/imp/imp.dm
+++ b/code/game/gamemodes/devil/imp/imp.dm
@@ -25,7 +25,7 @@
maxHealth = 200
health = 200
healable = 0
- environment_smash = 1
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
obj_damage = 40
melee_damage_lower = 10
melee_damage_upper = 15
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 46f651d359..bb4bf455dc 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -2,7 +2,8 @@
//Gang War Game Mode
GLOBAL_LIST_INIT(gang_name_pool, list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp"))
-GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple"))
+GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple", "white"))
+GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/obj/item/clothing/suit/jacket/leather/overcoat,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/jacket/miljacket,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/pirate,/obj/item/clothing/suit/poncho,/obj/item/clothing/suit/apron/overalls,/obj/item/clothing/suit/jacket/letterman))
/datum/game_mode
var/list/datum/gang/gangs = list()
@@ -164,6 +165,8 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
///////////////////////////////////////////
/datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, datum/gang/G, check = 1)
if(!G || (gangster_mind in get_all_gangsters()) || (gangster_mind.enslaved_to && !is_gangster(gangster_mind.enslaved_to)))
+ if(is_in_gang(gangster_mind.current, G.name) && !(gangster_mind in get_gang_bosses()))
+ return 3
return 0
if(check && gangster_mind.current.isloyal()) //Check to see if the potential gangster is implanted
return 1
@@ -193,6 +196,10 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
////////////////////////////////////////////////////////////////////
/datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, beingborged, silent, remove_bosses=0)
var/datum/gang/gang = gangster_mind.gang_datum
+ for(var/obj/O in gangster_mind.current.contents)
+ if(istype(O, /obj/item/device/gangtool/soldier))
+ qdel(O)
+
if(!gang)
return 0
@@ -325,3 +332,4 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
SSticker.station_explosion_cinematic(1,"gang war", null)
SSticker.mode.explosion_in_progress = 0
SSticker.force_ending = TRUE
+
diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm
index ba455e94e5..0ff9ef4f2d 100644
--- a/code/game/gamemodes/gang/gang_datum.dm
+++ b/code/game/gamemodes/gang/gang_datum.dm
@@ -15,33 +15,91 @@
var/list/territory_lost = list()
var/recalls = 1
var/dom_attempts = 2
- var/points = 15
+ var/inner_outfit
+ var/outer_outfit
var/datum/atom_hud/antag/gang/ganghud
var/is_deconvertible = TRUE //Can you deconvert normal gangsters from the gang
var/domination_timer
var/is_dominating
- var/item_list
- var/item_category_list
- var/buyable_items = list(
+ var/boss_item_list
+ var/boss_category_list
+ var/static/list/boss_items = list(
/datum/gang_item/function/gang_ping,
/datum/gang_item/function/recall,
- /datum/gang_item/function/outfit,
+
+ /datum/gang_item/clothing/under,
+ /datum/gang_item/clothing/suit,
+ /datum/gang_item/clothing/hat,
+ /datum/gang_item/clothing/neck,
+ /datum/gang_item/clothing/shoes,
+ /datum/gang_item/clothing/mask,
+ /datum/gang_item/clothing/hands,
+ /datum/gang_item/clothing/belt,
+
+ /datum/gang_item/weapon/shuriken,
/datum/gang_item/weapon/switchblade,
+ /datum/gang_item/weapon/improvised,
+ /datum/gang_item/weapon/ammo/improvised_ammo,
+ /datum/gang_item/weapon/surplus,
+ /datum/gang_item/weapon/ammo/surplus_ammo,
/datum/gang_item/weapon/pistol,
/datum/gang_item/weapon/ammo/pistol_ammo,
+ /datum/gang_item/weapon/sniper,
+ /datum/gang_item/weapon/ammo/sniper_ammo,
+ /datum/gang_item/weapon/machinegun,
/datum/gang_item/weapon/uzi,
/datum/gang_item/weapon/ammo/uzi_ammo,
+ /datum/gang_item/equipment/sharpener,
/datum/gang_item/equipment/spraycan,
+ /datum/gang_item/equipment/sharpener,
+ /datum/gang_item/equipment/emp,
/datum/gang_item/equipment/c4,
+ /datum/gang_item/equipment/frag,
+ /datum/gang_item/equipment/stimpack,
/datum/gang_item/equipment/implant_breaker,
+ /datum/gang_item/equipment/wetwork_boots,
/datum/gang_item/equipment/pen,
- /datum/gang_item/equipment/gangtool,
- /datum/gang_item/equipment/necklace,
/datum/gang_item/equipment/dominator
)
+ var/reg_item_list
+ var/reg_category_list
+ var/static/list/soldier_items = list(
+ /datum/gang_item/clothing/under,
+ /datum/gang_item/clothing/suit,
+ /datum/gang_item/clothing/hat,
+ /datum/gang_item/clothing/neck,
+ /datum/gang_item/clothing/shoes,
+ /datum/gang_item/clothing/mask,
+ /datum/gang_item/clothing/hands,
+ /datum/gang_item/clothing/belt,
+
+ /datum/gang_item/weapon/shuriken,
+ /datum/gang_item/weapon/switchblade,
+ /datum/gang_item/weapon/improvised,
+ /datum/gang_item/weapon/ammo/improvised_ammo,
+ /datum/gang_item/weapon/surplus,
+ /datum/gang_item/weapon/ammo/surplus_ammo,
+ /datum/gang_item/weapon/pistol,
+ /datum/gang_item/weapon/ammo/pistol_ammo,
+ /datum/gang_item/weapon/sniper,
+ /datum/gang_item/weapon/ammo/sniper_ammo,
+ /datum/gang_item/weapon/machinegun,
+ /datum/gang_item/weapon/uzi,
+ /datum/gang_item/weapon/ammo/uzi_ammo,
+ /datum/gang_item/equipment/sharpener,
+ /datum/gang_item/equipment/spraycan,
+ /datum/gang_item/equipment/sharpener,
+ /datum/gang_item/equipment/emp,
+ /datum/gang_item/equipment/c4,
+ /datum/gang_item/equipment/frag,
+ /datum/gang_item/equipment/stimpack,
+ /datum/gang_item/equipment/implant_breaker,
+ /datum/gang_item/equipment/wetwork_boots,
+ )
+
/datum/gang/New(loc,gangname)
if(!GLOB.gang_colors_pool.len)
message_admins("WARNING: Maximum number of gangs have been exceeded!")
@@ -53,36 +111,56 @@
switch(color)
if("red")
color_hex = "#DA0000"
+ inner_outfit = pick(/obj/item/clothing/under/color/red, /obj/item/clothing/under/lawyer/red)
if("orange")
color_hex = "#FF9300"
+ inner_outfit = pick(/obj/item/clothing/under/color/orange, /obj/item/clothing/under/geisha)
if("yellow")
color_hex = "#FFF200"
+ inner_outfit = pick(/obj/item/clothing/under/color/yellow, /obj/item/clothing/under/burial, /obj/item/clothing/under/suit_jacket/tan)
if("green")
color_hex = "#A8E61D"
+ inner_outfit = pick(/obj/item/clothing/under/color/green, /obj/item/clothing/under/syndicate/camo, /obj/item/clothing/under/suit_jacket/green)
if("blue")
color_hex = "#00B7EF"
+ inner_outfit = pick(/obj/item/clothing/under/color/blue, /obj/item/clothing/under/suit_jacket/navy)
if("purple")
color_hex = "#DA00FF"
+ inner_outfit = pick(/obj/item/clothing/under/color/lightpurple, /obj/item/clothing/under/lawyer/purpsuit)
+ if("white")
+ color_hex = "#FFFFFF"
+ inner_outfit = pick(/obj/item/clothing/under/color/white, /obj/item/clothing/under/suit_jacket/white)
name = (gangname ? gangname : pick(GLOB.gang_name_pool))
GLOB.gang_name_pool -= name
-
+ outer_outfit = pick(GLOB.gang_outfit_pool)
ganghud = new()
ganghud.color = color_hex
log_game("The [name] Gang has been created. Their gang color is [color].")
build_item_list()
/datum/gang/proc/build_item_list()
- item_list = list()
- item_category_list = list()
- for(var/V in buyable_items)
- var/datum/gang_item/G = new V()
- item_list[G.id] = G
- var/list/Cat = item_category_list[G.category]
+ boss_item_list = list()
+ boss_category_list = list()
+ for(var/B in boss_items)
+ var/datum/gang_item/G = new B()
+ boss_item_list[G.id] = G
+ var/list/Cat = boss_category_list[G.category]
if(Cat)
Cat += G
else
- item_category_list[G.category] = list(G)
+ boss_category_list[G.category] = list(G)
+
+ reg_item_list = list()
+ reg_category_list = list()
+ for(var/S in soldier_items)
+ var/datum/gang_item/G = new S()
+ reg_item_list[G.id] = G
+ var/list/Cat = reg_category_list[G.category]
+ if(Cat)
+ Cat += G
+ else
+ reg_category_list[G.category] = list(G)
/datum/gang/proc/add_gang_hud(datum/mind/recruit_mind)
ganghud.join_hud(recruit_mind.current)
@@ -103,52 +181,6 @@
/datum/gang/proc/domination_time_remaining()
var/diff = domination_timer - world.time
return diff / 10
-//////////////////////////////////////////// OUTFITS
-
-
-//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform
-/datum/gang/proc/gang_outfit(mob/living/carbon/user,obj/item/device/gangtool/gangtool)
- if(!user || !gangtool)
- return 0
- if(!gangtool.can_use(user))
- return 0
-
- var/gang_style_list = list("Gang Colors","Black Suits","White Suits","Leather Jackets","Leather Overcoats","Puffer Jackets","Military Jackets","Tactical Turtlenecks","Soviet Uniforms")
- if(!style && (user.mind in SSticker.mode.get_gang_bosses())) //Only the boss gets to pick a style
- style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
-
- if(gangtool.can_use(user) && (gangtool.outfits >= 1))
- var/outfit_path
- switch(style)
- if(null || "Gang Colors")
- outfit_path = text2path("/obj/item/clothing/under/color/[color]")
- if("Black Suits")
- outfit_path = /obj/item/clothing/under/suit_jacket/charcoal
- if("White Suits")
- outfit_path = /obj/item/clothing/under/suit_jacket/white
- if("Puffer Jackets")
- outfit_path = /obj/item/clothing/suit/jacket/puffer
- if("Leather Jackets")
- outfit_path = /obj/item/clothing/suit/jacket/leather
- if("Leather Overcoats")
- outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat
- if("Military Jackets")
- outfit_path = /obj/item/clothing/suit/jacket/miljacket
- if("Soviet Uniforms")
- outfit_path = /obj/item/clothing/under/soviet
- if("Tactical Turtlenecks")
- outfit_path = /obj/item/clothing/under/syndicate
-
- if(outfit_path)
- var/obj/item/clothing/outfit = new outfit_path(user.loc)
- outfit.armor = list(melee = 20, bullet = 30, laser = 10, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 30, acid = 30)
- outfit.desc += " Tailored for the [name] Gang to offer the wearer moderate protection against ballistics and physical trauma."
- outfit.gang = src
- user.put_in_hands(outfit)
- return 1
-
- return 0
-
//////////////////////////////////////////// MESSAGING
@@ -186,45 +218,7 @@
lost_names += "[territory_lost[area]]"
territory -= area
- //Count uniformed gangsters
- var/uniformed = 0
- for(var/datum/mind/gangmind in (gangsters|bosses))
- if(ishuman(gangmind.current))
- var/mob/living/carbon/human/gangster = gangmind.current
- //Gangster must be alive and on station
- if((gangster.stat == DEAD) || (gangster.z > ZLEVEL_STATION))
- continue
-
- var/obj/item/clothing/outfit
- var/obj/item/clothing/gang_outfit
- if(gangster.w_uniform)
- outfit = gangster.w_uniform
- if(outfit.gang == src)
- gang_outfit = outfit
- if(gangster.wear_suit)
- outfit = gangster.wear_suit
- if(outfit.gang == src)
- gang_outfit = outfit
-
- if(gang_outfit)
- to_chat(gangster, "The [src] Gang's influence grows as you wear [gang_outfit].")
- uniformed ++
-
//Calculate and report influence growth
- var/message = "[src] Gang Status Report:
*---------*
"
- if(is_dominating)
- var/seconds_remaining = domination_time_remaining()
- var/new_time = max(180, seconds_remaining - (uniformed * 4) - (territory.len * 2))
- if(new_time < seconds_remaining)
- message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories and [uniformed] uniformed gangsters.
"
- set_domination_time(new_time)
- message += "[seconds_remaining] seconds remain in hostile takeover.
"
- else
- var/points_new = min(999,points + 15 + (uniformed * 2) + territory.len)
- if(points_new != points)
- message += "Gang influence has increased by [points_new - points] for defending [territory.len] territories and [uniformed] uniformed gangsters.
"
- points = points_new
- message += "Your gang now has [points] influence.
"
//Process new territories
for(var/area in territory_new)
@@ -234,27 +228,69 @@
territory += area
//Report territory changes
+ var/message = "[src] Gang Status Report:.
*---------*
"
message += "[territory_new.len] new territories:
[added_names]
"
message += "[territory_lost.len] territories lost:
[lost_names]
"
-
//Clear the lists
territory_new = list()
territory_lost = list()
-
var/control = round((territory.len/GLOB.start_state.num_territories)*100, 1)
- message += "Your gang now has [control]% control of the station.
*---------*"
- message_gangtools(message)
-
- //Increase outfit stock
- for(var/obj/item/device/gangtool/tool in gangtools)
- tool.outfits = min(tool.outfits+1,5)
+ var/sbonus = sqrt(LAZYLEN(territory)) // Bonus given to soldier's for the gang's total territory
+ message += "Your gang now has [control]% control of the station.
*---------*
"
+ if(is_dominating)
+ var/seconds_remaining = domination_time_remaining()
+ var/new_time = max(180, seconds_remaining - (territory.len * 2))
+ if(new_time < seconds_remaining)
+ message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories.
"
+ set_domination_time(new_time)
+ message += "[seconds_remaining] seconds remain in hostile takeover.
"
+ else
+ for(var/obj/item/device/gangtool/G in gangtools)
+ var/pmessage = message
+ var/points_new = 0
+ if(istype(G, /obj/item/device/gangtool/soldier))
+ points_new = max(0,round(3 - G.points/10)) + (sbonus) + (LAZYLEN(G.tags)/2) // Soldier points
+ pmessage += "Your influence has increased by [round(sbonus)] from your gang holding [LAZYLEN(territory)] territories, and a bonus of [round(LAZYLEN(G.tags)/2)] for territories you have personally marked and kept intact.
"
+ else
+ points_new = max(0,round(5 - G.points/10)) + LAZYLEN(territory) // Boss points, more focused on big picture
+ pmessage += "Your influence has increased by [round(points_new)] from your gang holding [territory.len] territories
"
+ G.points += points_new
+ var/mob/living/carbon/human/ganger = get(G.loc, /mob/living)
+ var/points_newer = 0
+ var/static/inner = inner_outfit
+ var/static/outer = outer_outfit
+ if(ishuman(ganger) && ganger.mind in (gangsters|bosses))
+ for(var/obj/C in ganger.contents)
+ if(C.type == inner_outfit)
+ points_newer += 2
+ continue
+ if(C.type == outer_outfit)
+ points_newer += 2
+ continue
+ switch(C.type)
+ if(/obj/item/clothing/neck/necklace/dope)
+ points_newer += 2
+ if(/obj/item/clothing/head/collectable/petehat/gang)
+ points_newer += 4
+ if(/obj/item/clothing/shoes/gang)
+ points_newer += 6
+ if(/obj/item/clothing/mask/gskull)
+ points_newer += 5
+ if(/obj/item/clothing/gloves/gang)
+ points_newer += 3
+ if(/obj/item/weapon/storage/belt/military/gang)
+ points_newer += 4
+ if(points_newer)
+ G.points += points_newer
+ pmessage += "Your influential choice of clothing has further increased your influence by [points_newer] points.
"
+ pmessage += "You now have [G.points] influence.
"
+ to_chat(ganger, "\icon[G] [pmessage]")
//Multiverse
/datum/gang/multiverse
dom_attempts = 0
- points = 0
fighting_style = "multiverse"
is_deconvertible = FALSE
@@ -263,4 +299,4 @@
ganghud = new()
/datum/gang/multiverse/income()
- return
\ No newline at end of file
+ return
diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm
index d626aa3b9a..aec9b040cd 100644
--- a/code/game/gamemodes/gang/gang_items.dm
+++ b/code/game/gamemodes/gang/gang_items.dm
@@ -6,14 +6,12 @@
var/category
var/id
+
/datum/gang_item/proc/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool, check_canbuy = TRUE)
if(check_canbuy && !can_buy(user, gang, gangtool))
return FALSE
var/real_cost = get_cost(user, gang, gangtool)
- if(gang && real_cost)
- gang.message_gangtools("A [get_name_display(user, gang, gangtool)] was purchased by [user.real_name] for [real_cost] Influence.")
- log_game("A [id] was purchased by [key_name(user)] ([gang.name] Gang) for [real_cost] Influence.")
- gang.points -= real_cost
+ gangtool.points -= real_cost
spawn_item(user, gang, gangtool)
return TRUE
@@ -25,7 +23,7 @@
to_chat(user, spawn_msg)
/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
- return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool)
+ return gang && (gangtool.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool)
/datum/gang_item/proc/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return TRUE
@@ -78,23 +76,104 @@
gangtool.recall(user)
-/datum/gang_item/function/outfit
- name = "Create Armored Gang Outfit"
- id = "outfit"
+///////////////////
+//CLOTHING
+///////////////////
-/datum/gang_item/function/outfit/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
- return gangtool && (gangtool.outfits > 0) && ..()
+/datum/gang_item/clothing
+ category = "Purchase Influence-Enhancing Clothes:"
+
+/datum/gang_item/clothing/under
+ name = "Gang Uniform"
+ id = "under"
+ cost = 1
+
+/datum/gang_item/clothing/under/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
+ if(gang.inner_outfit)
+ var/obj/item/O = new gang.inner_outfit(user.loc)
+ user.put_in_hands(O)
+ to_chat(user, " This is your gang's official uniform, wearing it will increase your influence")
+
+/datum/gang_item/clothing/suit
+ name = "Gang Armored Outerwear"
+ id = "suit"
+ cost = 1
+
+/datum/gang_item/clothing/suit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
+ if(gang.outer_outfit)
+ var/obj/item/O = new gang.outer_outfit(user.loc)
+ O.armor = list(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30)
+ O.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma."
+ user.put_in_hands(O)
+ to_chat(user, " This is your gang's official outerwear, wearing it will increase your influence")
+
+
+/datum/gang_item/clothing/hat
+ name = "Pimp Hat"
+ id = "hat"
+ cost = 18
+ item_path = /obj/item/clothing/head/collectable/petehat/gang
+
+/obj/item/clothing/head/collectable/petehat/gang
+ name = "pimpin' hat"
+ desc = "The undisputed king of style."
+
+/datum/gang_item/clothing/mask
+ name = "Golden Death Mask"
+ id = "mask"
+ cost = 20
+ item_path = /obj/item/clothing/mask/gskull
+
+/obj/item/clothing/mask/gskull
+ name = "golden death mask"
+ icon_state = "gskull"
+ desc = "Strike terror, and envy, into the hearts of your enemies."
+
+
+/datum/gang_item/clothing/shoes
+ name = "Bling Boots"
+ id = "boots"
+ cost = 25
+ item_path = /obj/item/clothing/shoes/gang
+
+/obj/item/clothing/shoes/gang
+ name = "blinged-out boots"
+ desc = "Stand aside peasants."
+ icon_state = "bling"
+
+/datum/gang_item/clothing/neck
+ name = "Gold Necklace"
+ id = "necklace"
+ cost = 10
+ item_path = /obj/item/clothing/neck/necklace/dope
+
+
+/datum/gang_item/clothing/hands
+ name = "Decorative Brass Knuckles"
+ id = "hand"
+ cost = 12
+ item_path = /obj/item/clothing/gloves/gang
+
+/obj/item/clothing/gloves/gang
+ name = "braggadocio's brass knuckles"
+ desc = "Purely decorative, don't find out the hard way."
+ icon_state = "knuckles"
+ w_class = 3
+
+/datum/gang_item/clothing/belt
+ name = "Badass Belt"
+ id = "belt"
+ cost = 15
+ item_path = /obj/item/weapon/storage/belt/military/gang
+
+/obj/item/weapon/storage/belt/military/gang
+ name = "badass belt"
+ icon_state = "gangbelt"
+ item_state = "gang"
+ desc = "The belt buckle simply reads 'BAMF'."
+ storage_slots = 1
-/datum/gang_item/function/outfit/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
- if(gangtool && !gangtool.outfits)
- return "(Restocking)"
- return ..()
-/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
- if(gang && gang.gang_outfit(user, gangtool))
- to_chat(user, "Gang Outfits can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.")
- if(gangtool)
- gangtool.outfits -= 1
///////////////////
//WEAPONS
@@ -120,10 +199,34 @@
cost = 5
item_path = /obj/item/weapon/switchblade
+/datum/gang_item/weapon/surplus
+ name = "Surplus Rifle"
+ id = "surplus"
+ cost = 8
+ item_path = /obj/item/weapon/gun/ballistic/automatic/surplus
+
+/datum/gang_item/weapon/ammo/surplus_ammo
+ name = "Surplus Rifle Ammo"
+ id = "surplus_ammo"
+ cost = 5
+ item_path = /obj/item/ammo_box/magazine/m10mm/rifle
+
+/datum/gang_item/weapon/improvised
+ name = "Sawn-Off Improvised Shotgun"
+ id = "sawn"
+ cost = 6
+ item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
+
+/datum/gang_item/weapon/ammo/improvised_ammo
+ name = "Box of Buckshot"
+ id = "buckshot"
+ cost = 5
+ item_path = /obj/item/weapon/storage/box/lethalshot
+
/datum/gang_item/weapon/pistol
name = "10mm Pistol"
id = "pistol"
- cost = 25
+ cost = 30
item_path = /obj/item/weapon/gun/ballistic/automatic/pistol
/datum/gang_item/weapon/ammo/pistol_ammo
@@ -144,12 +247,19 @@
cost = 15
item_path = /obj/item/ammo_box/magazine/sniper_rounds
+/datum/gang_item/weapon/machinegun
+ name = "Mounted Machine Gun"
+ id = "MG"
+ cost = 50
+ item_path = /obj/machinery/manned_turret
+ spawn_msg = "The mounted machine gun features enhanced responsiveness. Hold down on the trigger while firing to control where you're shooting."
+
/datum/gang_item/weapon/uzi
name = "Uzi SMG"
id = "uzi"
cost = 60
item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
- id = "uzi"
+
/datum/gang_item/weapon/ammo/uzi_ammo
name = "Uzi Ammo"
@@ -157,7 +267,6 @@
cost = 40
item_path = /obj/item/ammo_box/magazine/uzim9mm
-
///////////////////
//EQUIPMENT
///////////////////
@@ -178,12 +287,6 @@
cost = 3
item_path = /obj/item/weapon/sharpener
-/datum/gang_item/equipment/necklace
- name = "Gold Necklace"
- id = "necklace"
- cost = 1
- item_path = /obj/item/clothing/neck/necklace/dope
-
/datum/gang_item/equipment/emp
name = "EMP Grenade"
@@ -200,13 +303,13 @@
/datum/gang_item/equipment/frag
name = "Fragmentation Grenade"
id = "frag nade"
- cost = 10
+ cost = 18
item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag
/datum/gang_item/equipment/stimpack
name = "Black Market Stimulants"
id = "stimpack"
- cost = 15
+ cost = 12
item_path = /obj/item/weapon/reagent_containers/syringe/stimulants
/datum/gang_item/equipment/implant_breaker
@@ -223,6 +326,18 @@
if(spawn_msg)
to_chat(user, spawn_msg)
+/datum/gang_item/equipment/wetwork_boots
+ name = "Wetwork boots"
+ id = "wetwork"
+ cost = 20
+ item_path = /obj/item/clothing/shoes/combat/gang
+
+/obj/item/clothing/shoes/combat/gang
+ name = "Wetwork boots"
+ desc = "A gang's best hitmen are prepared for anything."
+ permeability_coefficient = 0.01
+ flags = NOSLIP
+
/datum/gang_item/equipment/pen
name = "Recruitment Pen"
id = "pen"
@@ -316,4 +431,4 @@
return ..()
/datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
- new item_path(user.loc)
\ No newline at end of file
+ new item_path(user.loc)
diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm
index 930c612d14..d60a3cb57b 100644
--- a/code/game/gamemodes/gang/gang_pen.dm
+++ b/code/game/gamemodes/gang/gang_pen.dm
@@ -25,7 +25,16 @@
var/datum/gang/G = user.mind.gang_datum
var/recruitable = SSticker.mode.add_gangster(M.mind,G)
switch(recruitable)
+ if(3)
+ for(var/obj/O in M.contents)
+ if(istype(O, /obj/item/device/gangtool/soldier))
+ to_chat(user, "This gangster already has an uplink!")
+ return
+ new /obj/item/device/gangtool/soldier(M)
+ to_chat(user, "You inject [M] with a new gangtool!")
+ cooldown(G)
if(2)
+ new /obj/item/device/gangtool/soldier(M)
M.Paralyse(5)
cooldown(G)
if(1)
@@ -57,4 +66,4 @@
cooldown = 0
icon_state = "pen"
var/mob/M = get(src, /mob)
- to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.")
\ No newline at end of file
+ to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.")
diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index c8c98e5d47..ad2da7b502 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -12,9 +12,11 @@
origin_tech = "programming=5;bluespace=2;syndicate=5"
var/datum/gang/gang //Which gang uses this?
var/recalling = 0
- var/outfits = 3
+ var/outfits = 2
var/free_pen = 0
var/promotable = 0
+ var/points = 15
+ var/list/tags = list()
/obj/item/device/gangtool/Initialize() //Initialize supply point income if it hasn't already been started
..()
@@ -48,14 +50,14 @@
var/isboss = (user.mind == gang.bosses[1])
dat += "Registration: [gang.name] Gang [isboss ? "Boss" : "Lieutenant"]
"
dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
"
- dat += "Gang Influence: [gang.points]
"
- dat += "Time until Influence grows: [(gang.points >= 999) ? ("--:--") : (time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
"
+ dat += "Your Influence: [points]
"
+ dat += "Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
"
dat += "
"
- for(var/cat in gang.item_category_list)
+ for(var/cat in gang.boss_category_list)
dat += "[cat]
"
- for(var/V in gang.item_category_list[cat])
+ for(var/V in gang.boss_category_list[cat])
var/datum/gang_item/G = V
if(!G.can_see(user, gang, src))
continue
@@ -76,7 +78,7 @@
dat += "Refresh
"
- var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.4", 340, 625)
+ var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625)
popup.set_content(dat)
popup.open()
@@ -95,7 +97,7 @@
return
if(href_list["purchase"])
- var/datum/gang_item/G = gang.item_list[href_list["purchase"]]
+ var/datum/gang_item/G = gang.boss_item_list[href_list["purchase"]]
if(G && G.can_buy(usr, gang, src))
G.purchase(usr, gang, src, FALSE)
@@ -168,7 +170,7 @@
if(recalling)
to_chat(usr, "Error: Recall already in progress.")
return 0
-
+
if(!gang.recalls)
to_chat(usr, "Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.")
@@ -212,7 +214,7 @@
userturf = get_turf(user)
if(userturf.z == 1) //Check one more time that they are on station.
if(SSshuttle.cancelEvac(user))
- gang.recalls -= 1
+ gang.recalls -= 1
return 1
to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.")
@@ -227,18 +229,103 @@
return 0
if(!user.mind)
return 0
-
- if(gang) //If it's already registered, only let the gang's bosses use this
- if(user.mind in gang.bosses)
- return 1
- else //If it's not registered, any gangster can use this to register
- if(user.mind in SSticker.mode.get_all_gangsters())
- return 1
-
+ if(gang && (user.mind in gang.bosses)) //If it's already registered, only let the gang's bosses use this
+ return 1
+ else if(user.mind in SSticker.mode.get_all_gangsters()) // For soldiers and potential LT's
+ return 1
return 0
/obj/item/device/gangtool/spare
outfits = 1
/obj/item/device/gangtool/spare/lt
- promotable = 1
\ No newline at end of file
+ promotable = 1
+
+///////////// Internal tool used by gang regulars ///////////
+
+/obj/item/device/gangtool/soldier
+ points = 5
+
+/obj/item/device/gangtool/soldier/New(mob/user)
+ . = ..()
+ gang = user.mind.gang_datum
+ gang.gangtools += src
+ var/datum/action/innate/gang/tool/GT = new
+ GT.Grant(user, src, gang)
+
+/obj/item/device/gangtool/soldier/attack_self(mob/user)
+ if (!can_use(user))
+ return
+ var/dat
+ if(gang.is_dominating)
+ dat += "Takeover In Progress:
[gang.domination_time_remaining()] seconds remain"
+ dat += "Registration: [gang.name] - Foot Soldier
"
+ dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
"
+ dat += "Your Influence: [points]
"
+ if(LAZYLEN(tags))
+ dat += "Your tags generate bonus influence for you.
You have tagged the following territories:"
+ for(var/obj/effect/decal/cleanable/crayon/gang/T in tags)
+ dat += " [T.territory] -"
+ else
+ dat += "You have not personally tagged any territory for your gang. Use a spray can to mark your territory and receive bonus influence."
+ dat += "
Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
"
+ dat += "
"
+ for(var/cat in gang.reg_category_list)
+ dat += "[cat]
"
+ for(var/V in gang.reg_category_list[cat])
+ var/datum/gang_item/G = V
+ if(!G.can_see(user, gang, src))
+ continue
+
+ var/cost = G.get_cost_display(user, gang, src)
+ if(cost)
+ dat += cost + " "
+
+ var/toAdd = G.get_name_display(user, gang, src)
+ if(G.can_buy(user, gang, src))
+ toAdd = "[toAdd]"
+ dat += toAdd
+ var/extra = G.get_extra_info(user, gang, src)
+ if(extra)
+ dat += "
[extra]"
+ dat += "
"
+ dat += "
"
+
+ dat += "Refresh
"
+
+ var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/item/device/gangtool/soldier/Topic(href, href_list)
+ if(!can_use(usr))
+ return
+ if(href_list["purchase"])
+ var/datum/gang_item/G = gang.reg_item_list[href_list["purchase"]]
+ if(G && G.can_buy(usr, gang, src))
+ G.purchase(usr, gang, src, FALSE)
+
+ attack_self(usr)
+
+/datum/action/innate/gang
+ background_icon_state = "bg_spell"
+
+/datum/action/innate/gang/IsAvailable()
+ if(!owner.mind || !owner.mind in SSticker.mode.get_all_gangsters())
+ return 0
+ return ..()
+
+/datum/action/innate/gang/tool
+ name = "Personal Gang Tool"
+ desc = "An implanted gang tool that lets you purchase gear"
+ background_icon_state = "bg_mime"
+ button_icon_state = "bolt_action"
+ var/obj/item/device/gangtool/soldier/GT
+
+/datum/action/innate/gang/tool/Grant(mob/user, obj/reg, datum/gang/G)
+ . = ..()
+ GT = reg
+ button.color = G.color
+
+/datum/action/innate/gang/tool/Activate()
+ GT.attack_self(owner)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 8f90cd892d..9def30992e 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/tunguska/Move()
. = ..()
if(.)
- new /obj/effect/overlay/temp/revenant(get_turf(src))
+ new /obj/effect/temp_visual/revenant(get_turf(src))
/obj/effect/meteor/tunguska/meteor_effect()
..()
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index d7ab46cb9c..de11c2ed94 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -64,7 +64,7 @@
stealth_active = 1
if(ishuman(loc))
var/mob/living/carbon/human/M = loc
- new /obj/effect/overlay/temp/dir_setting/ninja/cloak(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir)
M.name_override = disguise.name
M.icon = disguise.icon
M.icon_state = disguise.icon_state
@@ -78,7 +78,7 @@
stealth_active = 0
if(ishuman(loc))
var/mob/living/carbon/human/M = loc
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir)
M.name_override = null
M.cut_overlays()
M.regenerate_icons()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 083e610587..a12515a625 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -16,38 +16,38 @@
flick("alien-pad", src)
for(var/mob/living/target in loc)
target.forceMove(teleport_target)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
to_chat(target, "The instability of the warp leaves you disoriented!")
target.Stun(3)
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
flick("alien-pad", src)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
Warp(target)
/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target)
- new /obj/effect/overlay/temp/teleport_abductor(place)
+ new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
flick("alien-pad", src)
target.forceMove(place)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
/obj/machinery/abductor/pad/proc/PadToLoc(place)
- new /obj/effect/overlay/temp/teleport_abductor(place)
+ new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
flick("alien-pad", src)
for(var/mob/living/target in get_turf(src))
target.forceMove(place)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
-/obj/effect/overlay/temp/teleport_abductor
+/obj/effect/temp_visual/teleport_abductor
name = "Huh"
icon = 'icons/obj/abductor.dmi'
icon_state = "teleport"
duration = 80
-/obj/effect/overlay/temp/teleport_abductor/Initialize()
+/obj/effect/temp_visual/teleport_abductor/Initialize()
. = ..()
var/datum/effect_system/spark_spread/S = new
S.set_up(10,0,loc)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 3b315bb668..5212b82e51 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -83,7 +83,7 @@
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD)
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
friendly = "pinches"
@@ -435,7 +435,7 @@
resources += resource_gain
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
- var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
I.pixel_z = target.pixel_z
@@ -452,7 +452,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
- new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target))
+ new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
target.ex_act(3)
@@ -497,7 +497,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target)
do_attack_animation(target)
to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.")
- var/obj/effect/overlay/temp/swarmer/dismantle/D = new /obj/effect/overlay/temp/swarmer/dismantle(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target))
D.pixel_x = target.pixel_x
D.pixel_y = target.pixel_y
D.pixel_z = target.pixel_z
@@ -507,7 +507,7 @@
M.amount = 5
for(var/obj/item/I in target.component_parts)
I.loc = M.loc
- var/obj/effect/overlay/temp/swarmer/disintegration/N = new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
N.pixel_x = target.pixel_x
N.pixel_y = target.pixel_y
N.pixel_z = target.pixel_z
@@ -519,23 +519,23 @@
qdel(target)
-/obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects
+/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects
icon = 'icons/mob/swarmer.dmi'
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/swarmer/disintegration
+/obj/effect/temp_visual/swarmer/disintegration
icon_state = "disintegrate"
duration = 10
-/obj/effect/overlay/temp/swarmer/disintegration/Initialize()
+/obj/effect/temp_visual/swarmer/disintegration/Initialize()
. = ..()
playsound(loc, "sparks", 100, 1)
-/obj/effect/overlay/temp/swarmer/dismantle
+/obj/effect/temp_visual/swarmer/dismantle
icon_state = "dismantle"
duration = 25
-/obj/effect/overlay/temp/swarmer/integrate
+/obj/effect/temp_visual/swarmer/integrate
icon_state = "integrate"
duration = 5
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index a4e9d9482e..0d8093905e 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -35,7 +35,12 @@
var/morphed = 0
var/atom/movable/form = null
var/morph_time = 0
-
+ var/static/list/blacklist_typecache = typecacheof(list(
+ /obj/screen,
+ /obj/singularity,
+ /mob/living/simple_animal/hostile/morph,
+ /obj/effect))
+
var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \
You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \
observers, and can only be performed once every five seconds. While morphed, you move faster, but do \
@@ -67,13 +72,7 @@
..()
/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it
- if(istype(A,/obj/screen))
- return 0
- if(istype(A,/obj/singularity))
- return 0
- if(istype(A,/mob/living/simple_animal/hostile/morph))
- return 0
- return 1
+ return !is_type_in_typecache(A, blacklist_typecache)
/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A)
if(A && A.loc != src)
@@ -100,6 +99,7 @@
visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!", \
"You twist your body and assume the form of [target].")
appearance = target.appearance
+ copy_overlays(target)
alpha = max(alpha, 150) //fucking chameleons
transform = initial(transform)
pixel_y = initial(pixel_y)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 580515d4ec..ed51fb4caa 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -202,7 +202,7 @@
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(4, 0, L)
s.start()
- new /obj/effect/overlay/temp/revenant(L.loc)
+ new /obj/effect/temp_visual/revenant(L.loc)
sleep(20)
if(!L.on) //wait, wait, don't shock me
return
@@ -237,7 +237,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T)
if(T.flags & NOJAUNT)
T.flags -= NOJAUNT
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15))
var/turf/open/floor/floor = T
if(floor.intact && floor.floor_tile)
@@ -246,10 +246,10 @@
floor.burnt = 0
floor.make_plating(1)
if(T.type == /turf/closed/wall && prob(15))
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/closed/wall/rust)
if(T.type == /turf/closed/wall/r_wall && prob(10))
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/closed/wall/r_wall/rust)
for(var/obj/structure/closet/closet in T.contents)
closet.open()
@@ -261,7 +261,7 @@
for(var/obj/structure/window/window in T)
window.take_damage(rand(30,80))
if(window && window.fulltile)
- new /obj/effect/overlay/temp/revenant/cracks(window.loc)
+ new /obj/effect/temp_visual/revenant/cracks(window.loc)
for(var/obj/machinery/light/light in T)
light.flicker(20) //spooky
@@ -284,7 +284,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/proc/malfunction(turf/T, mob/user)
for(var/mob/living/simple_animal/bot/bot in T)
if(!bot.emagged)
- new /obj/effect/overlay/temp/revenant(bot.loc)
+ new /obj/effect/temp_visual/revenant(bot.loc)
bot.locked = 0
bot.open = 1
bot.emag_act()
@@ -292,21 +292,21 @@
if(human == user)
continue
to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].")
- new /obj/effect/overlay/temp/revenant(human.loc)
+ new /obj/effect/temp_visual/revenant(human.loc)
human.emp_act(1)
for(var/obj/thing in T)
if(istype(thing, /obj/machinery/dominator) || istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery
continue
if(prob(20))
if(prob(50))
- new /obj/effect/overlay/temp/revenant(thing.loc)
+ new /obj/effect/temp_visual/revenant(thing.loc)
thing.emag_act(null)
else
if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all
thing.emp_act(1)
for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
- new /obj/effect/overlay/temp/revenant(S.loc)
+ new /obj/effect/temp_visual/revenant(S.loc)
S.spark_system.start()
S.emp_act(1)
@@ -329,7 +329,7 @@
for(var/mob/living/mob in T)
if(mob == user)
continue
- new /obj/effect/overlay/temp/revenant(mob.loc)
+ new /obj/effect/temp_visual/revenant(mob.loc)
if(iscarbon(mob))
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
@@ -350,14 +350,14 @@
mob.adjustToxLoss(5)
for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability.
vine.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY)
- new /obj/effect/overlay/temp/revenant(vine.loc)
+ new /obj/effect/temp_visual/revenant(vine.loc)
QDEL_IN(vine, 10)
for(var/obj/structure/glowshroom/shroom in T)
shroom.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY)
- new /obj/effect/overlay/temp/revenant(shroom.loc)
+ new /obj/effect/temp_visual/revenant(shroom.loc)
QDEL_IN(shroom, 10)
for(var/obj/machinery/hydroponics/tray in T)
- new /obj/effect/overlay/temp/revenant(tray.loc)
+ new /obj/effect/temp_visual/revenant(tray.loc)
tray.pestlevel = rand(8, 10)
tray.weedlevel = rand(8, 10)
tray.toxic = rand(45, 55)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
index 8b766aad37..913efb34ce 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
@@ -33,11 +33,11 @@
to_chat(affected_mob, "You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...")
affected_mob.confused += 8
affected_mob.adjustStaminaLoss(8)
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(stagedamage < stage)
stagedamage++
affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage.
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(prob(45))
affected_mob.adjustStaminaLoss(stage)
..() //So we don't increase a stage before applying the stage damage.
@@ -56,7 +56,7 @@
finalstage = TRUE
to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].")
affected_mob.adjustStaminaLoss(45)
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 53e92c639d..432bdadfff 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -27,7 +27,7 @@
maxHealth = 200
health = 200
healable = 0
- environment_smash = 1
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
obj_damage = 50
melee_damage_lower = 30
melee_damage_upper = 30
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 1f01b38860..5964983b09 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -459,8 +459,7 @@
var/datum/game_mode/nuclear/NM = SSticker.mode
NM.nukes_left --
if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is
- spawn()
- world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending")
+ SSticker.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending")
/*
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 137514d1e3..f89833d315 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -175,6 +175,7 @@
continue
var/mob/living/carbon/human/H = X
if(H.stat == DEAD)
+ H.dust(TRUE)
spooky_scaries.Remove(X)
continue
listclearnulls(spooky_scaries)
@@ -584,7 +585,7 @@
var/turf/T = get_turf(user)
playsound(T,'sound/magic/WarpWhistle.ogg', 200, 1)
user.canmove = 0
- new /obj/effect/overlay/temp/tornado(T)
+ new /obj/effect/temp_visual/tornado(T)
sleep(20)
if(interrupted(user))
return
@@ -602,7 +603,7 @@
T = potential_T
break
breakout += 1
- new /obj/effect/overlay/temp/tornado(T)
+ new /obj/effect/temp_visual/tornado(T)
sleep(20)
if(interrupted(user))
return
@@ -620,7 +621,7 @@
last_user.canmove = 1
return ..()
-/obj/effect/overlay/temp/tornado
+/obj/effect/temp_visual/tornado
icon = 'icons/obj/wizard.dmi'
icon_state = "tornado"
name = "tornado"
@@ -630,6 +631,6 @@
duration = 40
pixel_x = 500
-/obj/effect/overlay/temp/tornado/Initialize()
+/obj/effect/temp_visual/tornado/Initialize()
. = ..()
animate(src, pixel_x = -500, time = 40)
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 3e36776773..8632243b67 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -236,7 +236,7 @@
/obj/machinery/disco/proc/hierofunk()
for(var/i in 1 to 10)
- spawn_atom_to_turf(/obj/effect/overlay/temp/hierophant/telegraph/edge, src, 1, FALSE)
+ spawn_atom_to_turf(/obj/effect/temp_visual/hierophant/telegraph/edge, src, 1, FALSE)
sleep(5)
/obj/machinery/disco/proc/lights_spin()
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 18d60559bd..7f914971b2 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -363,7 +363,7 @@
assemblytype = /obj/structure/door_assembly/door_assembly_cult
hackProof = 1
aiControlDisabled = 1
- var/openingoverlaytype = /obj/effect/overlay/temp/cult/door
+ var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
/obj/machinery/door/airlock/cult/New()
@@ -380,7 +380,7 @@
new openingoverlaytype(loc)
return 1
else
- new /obj/effect/overlay/temp/cult/sac(loc)
+ new /obj/effect/temp_visual/cult/sac(loc)
var/atom/throwtarget
throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(M, src)))
M << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50))
@@ -407,7 +407,7 @@
icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned
- openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned
+ openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned
/obj/machinery/door/airlock/cult/unruned/friendly
friendly = TRUE
@@ -438,8 +438,8 @@
/obj/machinery/door/airlock/clockwork/New()
..()
var/turf/T = get_turf(src)
- new /obj/effect/overlay/temp/ratvar/door(T)
- new /obj/effect/overlay/temp/ratvar/beam/door(T)
+ new /obj/effect/temp_visual/ratvar/door(T)
+ new /obj/effect/temp_visual/ratvar/beam/door(T)
change_construction_value(5)
/obj/machinery/door/airlock/clockwork/Destroy()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 99cdc1adc3..c03738fd0b 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -328,7 +328,7 @@
/obj/machinery/door/window/clockwork/setDir(direct)
if(!made_glow)
- var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/door/window(get_turf(src))
+ var/obj/effect/E = new /obj/effect/temp_visual/ratvar/door/window(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 96b0029134..a224efd91c 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -159,7 +159,7 @@ Class Procs:
/obj/machinery/emp_act(severity)
if(use_power && !stat)
use_power(7500/severity)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
..()
/obj/machinery/proc/open_machine(drop = 1)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 6bab77fd6f..22c6c57b17 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -1,9 +1,9 @@
#define TURRET_STUN 0
#define TURRET_LETHAL 1
-#define POPUP_ANIM_TIME 5
-#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad
-
+#define POPUP_ANIM_TIME 5
+#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad
+
/obj/machinery/porta_turret
name = "turret"
icon = 'icons/obj/turrets.dmi'
@@ -87,9 +87,9 @@
if(has_cover)
cover = new /obj/machinery/porta_turret_cover(loc)
cover.parent_turret = src
- underlays += image('icons/obj/turrets.dmi',icon_state = "basedark")
+ underlays += image('icons/obj/turrets.dmi',icon_state = "basedark")
if(!has_cover)
- INVOKE_ASYNC(src, .proc/popUp)
+ INVOKE_ASYNC(src, .proc/popUp)
/obj/machinery/porta_turret/update_icon()
cut_overlays()
@@ -368,10 +368,10 @@
var/list/targets = list()
var/turretview = view(scan_range, base)
for(var/A in turretview)
- var/atom/AA = A
- if(AA.invisibility>SEE_INVISIBLE_LIVING)
- continue
-
+ var/atom/AA = A
+ if(AA.invisibility>SEE_INVISIBLE_LIVING)
+ continue
+
if(check_anomalies)//if it's set to check for simple animals
if(istype(A, /mob/living/simple_animal))
var/mob/living/simple_animal/SA = A
@@ -426,7 +426,7 @@
raising = 1
if(cover)
flick("popup", cover)
- sleep(POPUP_ANIM_TIME)
+ sleep(POPUP_ANIM_TIME)
raising = 0
if(cover)
cover.icon_state = "openTurretCover"
@@ -442,7 +442,7 @@
raising = 1
if(cover)
flick("popdown", cover)
- sleep(POPDOWN_ANIM_TIME)
+ sleep(POPDOWN_ANIM_TIME)
raising = 0
if(cover)
cover.icon_state = "turretCover"
@@ -553,6 +553,7 @@
use_power = 0
has_cover = 0
scan_range = 9
+ req_access = list(GLOB.access_syndicate)
stun_projectile = /obj/item/projectile/bullet
lethal_projectile = /obj/item/projectile/bullet
lethal_projectile_sound = 'sound/weapons/Gunshot.ogg'
@@ -569,6 +570,8 @@
return 10 //Syndicate turrets shoot everything not in their faction
/obj/machinery/porta_turret/syndicate/pod
+ max_integrity = 40
+ integrity_failure = 20
obj_integrity = 40
stun_projectile = /obj/item/projectile/bullet/weakbullet3
lethal_projectile = /obj/item/projectile/bullet/weakbullet3
@@ -792,7 +795,7 @@
/obj/item/wallframe/turret_control
name = "turret control frame"
desc = "Used for building turret control panels"
- icon_state = "apc"
+ icon_state = "apc"
result_path = /obj/machinery/turretid
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
@@ -921,3 +924,170 @@
on = 0
spawn(100)
on = 1
+
+/////// MANNED TURRET ////////
+
+/obj/machinery/manned_turret
+ name = "machine gun turret"
+ desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets."
+ icon = 'icons/obj/turrets.dmi'
+ icon_state = "machinegun"
+ can_buckle = TRUE
+ density = TRUE
+ max_integrity = 100
+ obj_integrity = 100
+ buckle_lying = 0
+ layer = ABOVE_MOB_LAYER
+ var/view_range = 10
+ var/cooldown = 0
+ var/projectile_type = /obj/item/projectile/bullet/weakbullet3
+ var/rate_of_fire = 1
+ var/number_of_shots = 40
+ var/cooldown_duration = 90
+ var/atom/target
+ var/turf/target_turf
+ var/warned = FALSE
+
+//BUCKLE HOOKS
+
+/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = 0)
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ for(var/obj/item/I in buckled_mob.held_items)
+ if(istype(I, /obj/item/gun_control))
+ qdel(I)
+ if(istype(buckled_mob))
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 0
+ if(buckled_mob.client)
+ buckled_mob.client.change_view(world.view)
+ anchored = FALSE
+ . = ..()
+
+/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user)
+ if(user.incapacitated() || !istype(user))
+ return
+ M.forceMove(get_turf(src))
+ ..()
+ for(var/V in M.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+ if(M.dropItemToGround(I))
+ var/obj/item/gun_control/TC = new /obj/item/gun_control(src)
+ M.put_in_hands(TC)
+ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
+ var/obj/item/gun_control/TC = new /obj/item/gun_control(src)
+ M.put_in_hands(TC)
+ M.pixel_y = 14
+ layer = ABOVE_MOB_LAYER
+ setDir(SOUTH)
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ anchored = TRUE
+ if(user.client)
+ user.client.change_view(view_range)
+
+/obj/item/gun_control
+ name = "turret controls"
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "offhand"
+ w_class = WEIGHT_CLASS_HUGE
+ flags = ABSTRACT | NODROP
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
+ var/obj/machinery/manned_turret/turret
+
+/obj/item/gun_control/New(obj/machinery/manned_turret/MT)
+ if(MT)
+ turret = MT
+ else
+ qdel(src)
+
+/obj/item/gun_control/CanItemAutoclick()
+ return 1
+
+/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user)
+ ..()
+ var/obj/machinery/manned_turret/E = user.buckled
+ E.setDir(get_dir(E,targeted_atom))
+ user.setDir(E.dir)
+ switch(E.dir)
+ if(NORTH)
+ E.layer = BELOW_MOB_LAYER
+ user.pixel_x = 0
+ user.pixel_y = -14
+ if(NORTHEAST)
+ E.layer = BELOW_MOB_LAYER
+ user.pixel_x = -8
+ user.pixel_y = -4
+ if(EAST)
+ E.layer = ABOVE_MOB_LAYER
+ user.pixel_x = -14
+ user.pixel_y = 0
+ if(SOUTHEAST)
+ E.layer = BELOW_MOB_LAYER
+ user.pixel_x = -8
+ user.pixel_y = 4
+ if(SOUTH)
+ E.layer = ABOVE_MOB_LAYER
+ user.pixel_x = 0
+ user.pixel_y = 14
+ if(SOUTHWEST)
+ E.layer = BELOW_MOB_LAYER
+ user.pixel_x = 8
+ user.pixel_y = 4
+ if(WEST)
+ E.layer = ABOVE_MOB_LAYER
+ user.pixel_x = 14
+ user.pixel_y = 0
+ if(NORTHWEST)
+ E.layer = BELOW_MOB_LAYER
+ user.pixel_x = 8
+ user.pixel_y = -4
+ E.checkfire(targeted_atom, user)
+
+/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user)
+ target = targeted_atom
+ if(target == user || target == get_turf(src))
+ return
+ if(world.time < cooldown)
+ if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing
+ warned = TRUE
+ playsound(src, 'sound/weapons/sear.ogg', 100, 1)
+ return
+ else
+ cooldown = world.time + cooldown_duration
+ warned = FALSE
+ INVOKE_ASYNC(src, /obj/machinery/manned_turret/.proc/volley)
+
+/obj/machinery/manned_turret/proc/volley()
+ target_turf = get_turf(target)
+ for(var/i in 1 to number_of_shots)
+ addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper), i*rate_of_fire)
+
+
+/obj/machinery/manned_turret/proc/fire_helper()
+ if(!src)
+ return
+ var/turf/targets_from = get_turf(src)
+ if(QDELETED(target))
+ target = target_turf
+ var/obj/item/projectile/P = new projectile_type(targets_from)
+ P.current = targets_from
+ P.starting = targets_from
+ P.firer = src
+ P.original = target
+ playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1)
+ P.yo = target.y - targets_from.y + rand(-1,1)
+ P.xo = target.x - targets_from.x + rand(-1,1)
+ P.fire()
+
+/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics
+ name = "Infinity Gun"
+ view_range = 12
+ projectile_type = /obj/item/projectile/bullet/weakbullet3
+
+
+/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user)
+ target = targeted_atom
+ if(target == user || target == get_turf(src))
+ return
+ target_turf = get_turf(target)
+ fire_helper(target_turf)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ebe4c79730..6c86899cf0 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1152,6 +1152,32 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
+/obj/machinery/vending/toyliberationstation
+ name = "\improper Syndicate Donksoft Toy Vendor"
+ desc = "A ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
+ icon_state = "syndi"
+ req_access_txt = "1"
+ product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get perma briged!"
+ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ vend_reply = "Come back for more!"
+ products = list(/obj/item/weapon/gun/ballistic/automatic/toy/unrestricted = 10,
+ /obj/item/weapon/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
+ /obj/item/weapon/gun/ballistic/shotgun/toy/unrestricted = 10,
+ /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20,
+ /obj/item/toy/foamblade = 10,
+ /obj/item/toy/syndicateballoon = 10,
+ /obj/item/clothing/suit/syndicatefake = 5,
+ /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just a assistant
+ contraband = list(/obj/item/weapon/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting!
+ /obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
+ /obj/item/weapon/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
+ /obj/item/ammo_box/foambox/riot = 20,
+ /obj/item/toy/katana = 10,
+ /obj/item/weapon/twohanded/dualsaber/toy = 5,
+ /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
+
#undef STANDARD_CHARGE
#undef CONTRABAND_CHARGE
#undef COIN_CHARGE
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index 61151f086f..dbee8bd677 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -64,12 +64,9 @@
/obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores()
- if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment)
- var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo
- if(ore_box)
- for(var/obj/item/weapon/ore/ore in range(1, chassis))
- if(get_dir(chassis,ore)&chassis.dir)
- ore.Move(ore_box)
+ if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/mecha/working/ripley))
+ var/obj/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~
+ R.collect_ore()
/obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/mecha/M as obj)
if(..())
@@ -109,36 +106,19 @@
icon_state = "mecha_analyzer"
selectable = 0
equip_cooldown = 30
- var/scanning = 0
+ var/scanning_time = 0
/obj/item/mecha_parts/mecha_equipment/mining_scanner/New()
..()
START_PROCESSING(SSobj, src)
-/obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M)
- ..()
- M.occupant_sight_flags |= SEE_TURFS
- if(M.occupant)
- M.occupant.update_sight()
-
-/obj/item/mecha_parts/mecha_equipment/mining_scanner/detach()
- chassis.occupant_sight_flags &= ~SEE_TURFS
- if(chassis.occupant)
- chassis.occupant.update_sight()
- return ..()
-
/obj/item/mecha_parts/mecha_equipment/mining_scanner/process()
if(!loc)
STOP_PROCESSING(SSobj, src)
qdel(src)
- if(scanning)
- return
- if(istype(loc,/obj/mecha/working))
+ if(istype(loc,/obj/mecha/working) && scanning_time <= world.time)
var/obj/mecha/working/mecha = loc
if(!mecha.occupant)
return
- var/list/L = list(mecha.occupant)
- scanning = 1
- mineral_scan_pulse(L,get_turf(loc))
- spawn(equip_cooldown)
- scanning = 0
+ scanning_time = world.time + equip_cooldown
+ mineral_scan_pulse(get_turf(src))
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 1d7d9072c9..1cd46f24ea 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -8,7 +8,7 @@
var/variance = 0
var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter
var/projectile_delay = 0
- var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
+ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/combat/M)
if(..())
@@ -60,7 +60,7 @@
//Base energy weapon type
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "general energy weapon"
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/mecha_parts/mecha_equipment/weapon/energy/get_shot_amount()
return min(round(chassis.cell.charge / energy_drain), projectiles_per_shot)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 25ba38c51c..66cc6be38a 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -37,7 +37,6 @@
var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5)
var/obj/item/weapon/stock_parts/cell/cell
var/state = 0
- var/cell_power_remaining = 1 // 0 - no power, 1 - 100% power in cell. Starts as 1 so putting any cell into empty mech doesn't deplete charge from it
var/list/log = new
var/last_message = 0
var/add_req_access = 1
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index ccb7901d63..94f68c66d0 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -213,7 +213,6 @@
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
to_chat(user, "You repair the damaged temperature controller.")
else if(state==3 && cell)
- cell_power_remaining = max(0.1, cell.charge/cell.maxcharge) //10% charge or whatever is remaining in the current cell
cell.forceMove(loc)
cell = null
state = 4
@@ -232,7 +231,6 @@
var/obj/item/weapon/stock_parts/cell/C = W
to_chat(user, "You install the powercell.")
C.forceMove(src)
- C.use(max(0, C.charge - C.maxcharge*cell_power_remaining)) //Set inserted cell's power to saved percentage if that's higher
cell = C
log_message("Powercell installed")
else
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index aca6b7a778..a752811fe7 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -19,12 +19,17 @@
/obj/mecha/working/ripley/Move()
. = ..()
- if(. && (locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment))
+ if(.)
+ collect_ore()
+ update_pressure()
+
+/obj/mecha/working/ripley/proc/collect_ore()
+ if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment)
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo
if(ore_box)
- for(var/obj/item/weapon/ore/ore in get_turf(src))
- ore.Move(ore_box)
- update_pressure()
+ for(var/obj/item/weapon/ore/ore in range(1, src))
+ if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it!
+ ore.forceMove(ore_box)
/obj/mecha/working/ripley/Destroy()
for(var/i=1, i <= hides, i++)
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index af205fd132..53ecfc8d62 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -8,7 +8,7 @@
/obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0, var/alt_icon = null)
..()
-
+
name = e_name
desc = "A [name] vandalizing the station."
if(type == "poseur tag")
@@ -30,22 +30,25 @@
layer = HIGH_OBJ_LAYER //Harder to hide
do_icon_rotate = FALSE //These are designed to always face south, so no rotation please.
var/datum/gang/gang
+ var/obj/item/device/gangtool/linked_tool
+ var/area/territory
-/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0)
+/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0, var/mob/user)
if(!type || !G)
qdel(src)
-
- var/area/territory = get_area(src)
+ territory = get_area(src)
gang = G
var/newcolor = G.color_hex
icon_state = G.name
G.territory_new |= list(territory.type = territory.name)
-
+ linked_tool = locate(/obj/item/device/gangtool) in user.contents
+ if(linked_tool)
+ linked_tool.tags += src
..(mapload, newcolor, icon_state, e_name, rotation)
/obj/effect/decal/cleanable/crayon/gang/Destroy()
- var/area/territory = get_area(src)
-
+ if(linked_tool)
+ linked_tool.tags -= src
if(gang)
gang.territory -= territory.type
gang.territory_new -= territory.type
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index c2146daa82..e03325fb93 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -1,11 +1,11 @@
-/obj/effect/overlay/temp/point
+/obj/effect/temp_visual/point
name = "pointer"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "arrow"
layer = POINT_LAYER
duration = 25
-/obj/effect/overlay/temp/point/Initialize(mapload, set_invis = 0)
+/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
..()
var/atom/old_loc = loc
loc = get_turf(src)
diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm
index bfa6cd8fa9..62471505d0 100644
--- a/code/game/objects/effects/proximity.dm
+++ b/code/game/objects/effects/proximity.dm
@@ -93,6 +93,4 @@
/obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM)
set waitfor = FALSE
- var/atom/H = monitor.host
- testing("HasProx: [H] -> [AM]")
- H.HasProximity(AM)
+ monitor.host.HasProximity(AM)
diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm
index 91db494d9b..a452dae749 100644
--- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm
+++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm
@@ -10,7 +10,7 @@
var/area/A = get_area(T)
new /obj/structure/alien/egg(T)
- new /obj/effect/overlay/temp/gravpush(T)
+ new /obj/effect/temp_visual/gravpush(T)
playsound(T, 'sound/items/party_horn.ogg', 50, 1, -1)
message_admins("An alien egg has been delivered to [A] at [ADMIN_COORDJMP(T)].")
diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm
index 65c9d30e47..1eae2a3c64 100644
--- a/code/game/objects/effects/temporary_visuals/clockcult.dm
+++ b/code/game/objects/effects/temporary_visuals/clockcult.dm
@@ -1,68 +1,68 @@
-//temporary visual effects(/obj/effect/overlay/temp) used by clockcult stuff
-/obj/effect/overlay/temp/ratvar
+//temporary visual effects(/obj/effect/temp_visual) used by clockcult stuff
+/obj/effect/temp_visual/ratvar
name = "ratvar's light"
icon = 'icons/effects/clockwork_effects.dmi'
duration = 8
randomdir = 0
layer = ABOVE_NORMAL_TURF_LAYER
-/obj/effect/overlay/temp/ratvar/door
+/obj/effect/temp_visual/ratvar/door
icon_state = "ratvardoorglow"
layer = CLOSED_DOOR_LAYER //above closed doors
-/obj/effect/overlay/temp/ratvar/door/window
+/obj/effect/temp_visual/ratvar/door/window
icon_state = "ratvarwindoorglow"
layer = ABOVE_WINDOW_LAYER
-/obj/effect/overlay/temp/ratvar/beam
+/obj/effect/temp_visual/ratvar/beam
icon_state = "ratvarbeamglow"
-/obj/effect/overlay/temp/ratvar/beam/door
+/obj/effect/temp_visual/ratvar/beam/door
layer = CLOSED_DOOR_LAYER
-/obj/effect/overlay/temp/ratvar/beam/grille
+/obj/effect/temp_visual/ratvar/beam/grille
layer = BELOW_OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/beam/itemconsume
+/obj/effect/temp_visual/ratvar/beam/itemconsume
layer = HIGH_OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/beam/falsewall
+/obj/effect/temp_visual/ratvar/beam/falsewall
layer = OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/beam/catwalk
+/obj/effect/temp_visual/ratvar/beam/catwalk
layer = LATTICE_LAYER
-/obj/effect/overlay/temp/ratvar/wall
+/obj/effect/temp_visual/ratvar/wall
icon_state = "ratvarwallglow"
-/obj/effect/overlay/temp/ratvar/wall/false
+/obj/effect/temp_visual/ratvar/wall/false
layer = OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/floor
+/obj/effect/temp_visual/ratvar/floor
icon_state = "ratvarfloorglow"
-/obj/effect/overlay/temp/ratvar/floor/catwalk
+/obj/effect/temp_visual/ratvar/floor/catwalk
layer = LATTICE_LAYER
-/obj/effect/overlay/temp/ratvar/window
+/obj/effect/temp_visual/ratvar/window
icon_state = "ratvarwindowglow"
layer = ABOVE_OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/window/single
+/obj/effect/temp_visual/ratvar/window/single
icon_state = "ratvarwindowglow_s"
-/obj/effect/overlay/temp/ratvar/gear
+/obj/effect/temp_visual/ratvar/gear
icon_state = "ratvargearglow"
layer = BELOW_OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/grille
+/obj/effect/temp_visual/ratvar/grille
icon_state = "ratvargrilleglow"
layer = BELOW_OBJ_LAYER
-/obj/effect/overlay/temp/ratvar/grille/broken
+/obj/effect/temp_visual/ratvar/grille/broken
icon_state = "ratvarbrokengrilleglow"
-/obj/effect/overlay/temp/ratvar/mending_mantra
+/obj/effect/temp_visual/ratvar/mending_mantra
layer = ABOVE_MOB_LAYER
duration = 20
alpha = 200
@@ -70,7 +70,7 @@
light_range = 1.5
light_color = "#1E8CE1"
-/obj/effect/overlay/temp/ratvar/mending_mantra/Initialize(mapload)
+/obj/effect/temp_visual/ratvar/mending_mantra/Initialize(mapload)
. = ..()
transform = matrix()*2
var/matrix/M = transform
@@ -78,7 +78,7 @@
animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL)
animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL)
-/obj/effect/overlay/temp/ratvar/volt_hit
+/obj/effect/temp_visual/ratvar/volt_hit
name = "volt blast"
layer = ABOVE_MOB_LAYER
duration = 5
@@ -89,13 +89,13 @@
var/mob/user
var/damage = 20
-/obj/effect/overlay/temp/ratvar/volt_hit/Initialize(mapload, caster, multiplier)
+/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster, multiplier)
if(multiplier)
damage *= multiplier
duration = max(round(damage * 0.2), 1)
. = ..()
-/obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier)
+/obj/effect/temp_visual/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier)
. = ..()
user = caster
if(user)
@@ -104,7 +104,7 @@
transform = M
INVOKE_ASYNC(src, .proc/volthit)
-/obj/effect/overlay/temp/ratvar/volt_hit/proc/volthit()
+/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit()
if(user)
Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray)
var/hit_amount = 0
@@ -134,61 +134,61 @@
else
playsound(src, "sparks", 50, 1)
-/obj/effect/overlay/temp/ratvar/ocular_warden
+/obj/effect/temp_visual/ratvar/ocular_warden
name = "warden's gaze"
layer = ABOVE_MOB_LAYER
icon_state = "warden_gaze"
duration = 3
-/obj/effect/overlay/temp/ratvar/ocular_warden/Initialize()
+/obj/effect/temp_visual/ratvar/ocular_warden/Initialize()
. = ..()
pixel_x = rand(-8, 8)
pixel_y = rand(-10, 10)
animate(src, alpha = 0, time = 3, easing = EASE_OUT)
-/obj/effect/overlay/temp/ratvar/spearbreak
+/obj/effect/temp_visual/ratvar/spearbreak
icon = 'icons/effects/64x64.dmi'
icon_state = "ratvarspearbreak"
layer = BELOW_MOB_LAYER
pixel_y = -16
pixel_x = -16
-/obj/effect/overlay/temp/ratvar/geis_binding
+/obj/effect/temp_visual/ratvar/geis_binding
icon_state = "geisbinding"
-/obj/effect/overlay/temp/ratvar/geis_binding/top
+/obj/effect/temp_visual/ratvar/geis_binding/top
icon_state = "geisbinding_top"
-/obj/effect/overlay/temp/ratvar/component
+/obj/effect/temp_visual/ratvar/component
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "belligerent_eye"
layer = ABOVE_MOB_LAYER
duration = 10
-/obj/effect/overlay/temp/ratvar/component/Initialize()
+/obj/effect/temp_visual/ratvar/component/Initialize()
. = ..()
transform = matrix()*0.75
pixel_x = rand(-10, 10)
pixel_y = rand(-10, -2)
animate(src, pixel_y = pixel_y + 10, alpha = 50, time = 10, easing = EASE_OUT)
-/obj/effect/overlay/temp/ratvar/component/cogwheel
+/obj/effect/temp_visual/ratvar/component/cogwheel
icon_state = "vanguard_cogwheel"
-/obj/effect/overlay/temp/ratvar/component/capacitor
+/obj/effect/temp_visual/ratvar/component/capacitor
icon_state = "geis_capacitor"
-/obj/effect/overlay/temp/ratvar/component/alloy
+/obj/effect/temp_visual/ratvar/component/alloy
icon_state = "replicant_alloy"
-/obj/effect/overlay/temp/ratvar/component/ansible
+/obj/effect/temp_visual/ratvar/component/ansible
icon_state = "hierophant_ansible"
-/obj/effect/overlay/temp/ratvar/sigil
+/obj/effect/temp_visual/ratvar/sigil
name = "glowing circle"
icon_state = "sigildull"
-/obj/effect/overlay/temp/ratvar/sigil/transgression
+/obj/effect/temp_visual/ratvar/sigil/transgression
color = "#FAE48C"
layer = ABOVE_MOB_LAYER
duration = 70
@@ -196,13 +196,13 @@
light_power = 2
light_color = "#FAE48C"
-/obj/effect/overlay/temp/ratvar/sigil/transgression/Initialize()
+/obj/effect/temp_visual/ratvar/sigil/transgression/Initialize()
. = ..()
var/oldtransform = transform
animate(src, transform = matrix()*2, time = 5)
animate(transform = oldtransform, alpha = 0, time = 65)
-/obj/effect/overlay/temp/ratvar/sigil/vitality
+/obj/effect/temp_visual/ratvar/sigil/vitality
color = "#1E8CE1"
icon_state = "sigilactivepulse"
layer = ABOVE_MOB_LAYER
@@ -210,7 +210,7 @@
light_power = 0.5
light_color = "#1E8CE1"
-/obj/effect/overlay/temp/ratvar/sigil/accession
+/obj/effect/temp_visual/ratvar/sigil/accession
color = "#AF0AAF"
layer = ABOVE_MOB_LAYER
duration = 70
diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm
index ad3f84fe06..78cc50cfc1 100644
--- a/code/game/objects/effects/temporary_visuals/cult.dm
+++ b/code/game/objects/effects/temporary_visuals/cult.dm
@@ -1,58 +1,58 @@
-//temporary visual effects(/obj/effect/overlay/temp) used by cult stuff
-/obj/effect/overlay/temp/cult
+//temporary visual effects(/obj/effect/temp_visual) used by cult stuff
+/obj/effect/temp_visual/cult
icon = 'icons/effects/cult_effects.dmi'
randomdir = 0
duration = 10
-/obj/effect/overlay/temp/cult/sparks
+/obj/effect/temp_visual/cult/sparks
randomdir = 1
name = "blood sparks"
icon_state = "bloodsparkles"
-/obj/effect/overlay/temp/cult/blood // The traditional teleport
+/obj/effect/temp_visual/cult/blood // The traditional teleport
name = "blood jaunt"
duration = 12
icon_state = "bloodin"
-/obj/effect/overlay/temp/cult/blood/out
+/obj/effect/temp_visual/cult/blood/out
icon_state = "bloodout"
-/obj/effect/overlay/temp/dir_setting/cult/phase // The veil shifter teleport
+/obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport
name = "phase glow"
duration = 7
icon_state = "cultin"
-/obj/effect/overlay/temp/dir_setting/cult/phase/out
+/obj/effect/temp_visual/dir_setting/cult/phase/out
icon_state = "cultout"
-/obj/effect/overlay/temp/cult/sac
+/obj/effect/temp_visual/cult/sac
name = "maw of Nar-Sie"
icon_state = "sacconsume"
-/obj/effect/overlay/temp/cult/door
+/obj/effect/temp_visual/cult/door
name = "unholy glow"
icon_state = "doorglow"
layer = CLOSED_FIREDOOR_LAYER //above closed doors
-/obj/effect/overlay/temp/cult/door/unruned
+/obj/effect/temp_visual/cult/door/unruned
icon_state = "unruneddoorglow"
-/obj/effect/overlay/temp/cult/turf
+/obj/effect/temp_visual/cult/turf
name = "unholy glow"
icon_state = "wallglow"
layer = ABOVE_NORMAL_TURF_LAYER
-/obj/effect/overlay/temp/cult/turf/floor
+/obj/effect/temp_visual/cult/turf/floor
icon_state = "floorglow"
duration = 5
//visuals for runes being magically created
-/obj/effect/overlay/temp/cult/rune_spawn
+/obj/effect/temp_visual/cult/rune_spawn
icon_state = "runeouter"
alpha = 0
var/turnedness = 179 //179 turns counterclockwise, 181 turns clockwise
-/obj/effect/overlay/temp/cult/rune_spawn/Initialize(mapload, set_duration, set_color)
+/obj/effect/temp_visual/cult/rune_spawn/Initialize(mapload, set_duration, set_color)
if(isnum(set_duration))
duration = set_duration
if(set_color)
@@ -66,79 +66,79 @@
animate(src, alpha = 255, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL)
animate(src, transform = oldtransform, time = duration, flags = ANIMATION_PARALLEL)
-/obj/effect/overlay/temp/cult/rune_spawn/rune1
+/obj/effect/temp_visual/cult/rune_spawn/rune1
icon_state = "rune1words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune1/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune1/inner
icon_state = "rune1inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune1/center
+/obj/effect/temp_visual/cult/rune_spawn/rune1/center
icon_state = "rune1center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune2
+/obj/effect/temp_visual/cult/rune_spawn/rune2
icon_state = "rune2words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune2/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune2/inner
icon_state = "rune2inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune2/center
+/obj/effect/temp_visual/cult/rune_spawn/rune2/center
icon_state = "rune2center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune3
+/obj/effect/temp_visual/cult/rune_spawn/rune3
icon_state = "rune3words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune3/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune3/inner
icon_state = "rune3inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune3/center
+/obj/effect/temp_visual/cult/rune_spawn/rune3/center
icon_state = "rune3center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune4
+/obj/effect/temp_visual/cult/rune_spawn/rune4
icon_state = "rune4words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune4/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune4/inner
icon_state = "rune4inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune4/center
+/obj/effect/temp_visual/cult/rune_spawn/rune4/center
icon_state = "rune4center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune5
+/obj/effect/temp_visual/cult/rune_spawn/rune5
icon_state = "rune5words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune5/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune5/inner
icon_state = "rune5inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune5/center
+/obj/effect/temp_visual/cult/rune_spawn/rune5/center
icon_state = "rune5center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune6
+/obj/effect/temp_visual/cult/rune_spawn/rune6
icon_state = "rune6words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune6/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune6/inner
icon_state = "rune6inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune6/center
+/obj/effect/temp_visual/cult/rune_spawn/rune6/center
icon_state = "rune6center"
-/obj/effect/overlay/temp/cult/rune_spawn/rune7
+/obj/effect/temp_visual/cult/rune_spawn/rune7
icon_state = "rune7words"
turnedness = 181
-/obj/effect/overlay/temp/cult/rune_spawn/rune7/inner
+/obj/effect/temp_visual/cult/rune_spawn/rune7/inner
icon_state = "rune7inner"
turnedness = 179
-/obj/effect/overlay/temp/cult/rune_spawn/rune7/center
+/obj/effect/temp_visual/cult/rune_spawn/rune7/center
icon_state = "rune7center"
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 2ceea0aced..c3cf2a5103 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -1,12 +1,12 @@
//unsorted miscellaneous temporary visuals
-/obj/effect/overlay/temp/dir_setting/bloodsplatter
+/obj/effect/temp_visual/dir_setting/bloodsplatter
icon = 'icons/effects/blood.dmi'
duration = 5
randomdir = FALSE
layer = BELOW_MOB_LAYER
var/splatter_type = "splatter"
-/obj/effect/overlay/temp/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
+/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
if(set_dir in GLOB.diagonals)
icon_state = "[splatter_type][pick(1, 2, 6)]"
else
@@ -40,22 +40,22 @@
layer = ABOVE_MOB_LAYER
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
-/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter
+/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
splatter_type = "xsplatter"
-/obj/effect/overlay/temp/dir_setting/speedbike_trail
+/obj/effect/temp_visual/dir_setting/speedbike_trail
name = "speedbike trails"
icon_state = "ion_fade"
layer = BELOW_MOB_LAYER
duration = 10
randomdir = 0
-/obj/effect/overlay/temp/dir_setting/firing_effect
+/obj/effect/temp_visual/dir_setting/firing_effect
icon = 'icons/effects/effects.dmi'
icon_state = "firing_effect"
duration = 2
-/obj/effect/overlay/temp/dir_setting/firing_effect/setDir(newdir)
+/obj/effect/temp_visual/dir_setting/firing_effect/setDir(newdir)
switch(newdir)
if(NORTH)
layer = BELOW_MOB_LAYER
@@ -69,84 +69,84 @@
pixel_y = rand(-1,1)
..()
-/obj/effect/overlay/temp/dir_setting/firing_effect/energy
+/obj/effect/temp_visual/dir_setting/firing_effect/energy
icon_state = "firing_effect_energy"
duration = 3
-/obj/effect/overlay/temp/dir_setting/firing_effect/magic
+/obj/effect/temp_visual/dir_setting/firing_effect/magic
icon_state = "shieldsparkles"
duration = 3
-/obj/effect/overlay/temp/dir_setting/ninja
+/obj/effect/temp_visual/dir_setting/ninja
name = "ninja shadow"
icon = 'icons/mob/mob.dmi'
icon_state = "uncloak"
duration = 9
-/obj/effect/overlay/temp/dir_setting/ninja/cloak
+/obj/effect/temp_visual/dir_setting/ninja/cloak
icon_state = "cloak"
-/obj/effect/overlay/temp/dir_setting/ninja/shadow
+/obj/effect/temp_visual/dir_setting/ninja/shadow
icon_state = "shadow"
-/obj/effect/overlay/temp/dir_setting/ninja/phase
+/obj/effect/temp_visual/dir_setting/ninja/phase
name = "ninja energy"
icon_state = "phasein"
-/obj/effect/overlay/temp/dir_setting/ninja/phase/out
+/obj/effect/temp_visual/dir_setting/ninja/phase/out
icon_state = "phaseout"
-/obj/effect/overlay/temp/dir_setting/wraith
+/obj/effect/temp_visual/dir_setting/wraith
name = "blood"
icon = 'icons/mob/mob.dmi'
icon_state = "phase_shift2"
duration = 12
-/obj/effect/overlay/temp/dir_setting/wraith/out
+/obj/effect/temp_visual/dir_setting/wraith/out
icon_state = "phase_shift"
-/obj/effect/overlay/temp/dir_setting/tailsweep
+/obj/effect/temp_visual/dir_setting/tailsweep
icon_state = "tailsweep"
duration = 4
-/obj/effect/overlay/temp/wizard
+/obj/effect/temp_visual/wizard
name = "water"
icon = 'icons/mob/mob.dmi'
icon_state = "reappear"
duration = 5
-/obj/effect/overlay/temp/wizard/out
+/obj/effect/temp_visual/wizard/out
icon_state = "liquify"
duration = 12
-/obj/effect/overlay/temp/monkeyify
+/obj/effect/temp_visual/monkeyify
icon = 'icons/mob/mob.dmi'
icon_state = "h2monkey"
duration = 22
-/obj/effect/overlay/temp/monkeyify/humanify
+/obj/effect/temp_visual/monkeyify/humanify
icon_state = "monkey2h"
-/obj/effect/overlay/temp/borgflash
+/obj/effect/temp_visual/borgflash
icon = 'icons/mob/mob.dmi'
icon_state = "blspell"
duration = 5
-/obj/effect/overlay/temp/guardian
+/obj/effect/temp_visual/guardian
randomdir = 0
-/obj/effect/overlay/temp/guardian/phase
+/obj/effect/temp_visual/guardian/phase
duration = 5
icon_state = "phasein"
-/obj/effect/overlay/temp/guardian/phase/out
+/obj/effect/temp_visual/guardian/phase/out
icon_state = "phaseout"
-/obj/effect/overlay/temp/decoy
+/obj/effect/temp_visual/decoy
desc = "It's a decoy!"
duration = 15
-/obj/effect/overlay/temp/decoy/Initialize(mapload, atom/mimiced_atom)
+/obj/effect/temp_visual/decoy/Initialize(mapload, atom/mimiced_atom)
. = ..()
alpha = initial(alpha)
if(mimiced_atom)
@@ -155,95 +155,95 @@
setDir(mimiced_atom.dir)
mouse_opacity = 0
-/obj/effect/overlay/temp/decoy/fading/Initialize(mapload, atom/mimiced_atom)
+/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom)
. = ..()
animate(src, alpha = 0, time = duration)
-/obj/effect/overlay/temp/decoy/fading/fivesecond
+/obj/effect/temp_visual/decoy/fading/fivesecond
duration = 50
-/obj/effect/overlay/temp/small_smoke
+/obj/effect/temp_visual/small_smoke
icon_state = "smoke"
duration = 50
-/obj/effect/overlay/temp/fire
+/obj/effect/temp_visual/fire
icon = 'icons/effects/fire.dmi'
icon_state = "3"
duration = 20
-/obj/effect/overlay/temp/revenant
+/obj/effect/temp_visual/revenant
name = "spooky lights"
icon_state = "purplesparkles"
-/obj/effect/overlay/temp/revenant/cracks
+/obj/effect/temp_visual/revenant/cracks
name = "glowing cracks"
icon_state = "purplecrack"
duration = 6
-/obj/effect/overlay/temp/gravpush
+/obj/effect/temp_visual/gravpush
name = "gravity wave"
icon_state = "shieldsparkles"
duration = 5
-/obj/effect/overlay/temp/telekinesis
+/obj/effect/temp_visual/telekinesis
name = "telekinetic force"
icon_state = "empdisable"
duration = 5
-/obj/effect/overlay/temp/emp
+/obj/effect/temp_visual/emp
name = "emp sparks"
icon_state = "empdisable"
-/obj/effect/overlay/temp/emp/pulse
+/obj/effect/temp_visual/emp/pulse
name = "emp pulse"
icon_state = "emppulse"
duration = 8
randomdir = 0
-/obj/effect/overlay/temp/gib_animation
+/obj/effect/temp_visual/gib_animation
icon = 'icons/mob/mob.dmi'
duration = 15
-/obj/effect/overlay/temp/gib_animation/Initialize(mapload, gib_icon)
+/obj/effect/temp_visual/gib_animation/Initialize(mapload, gib_icon)
icon_state = gib_icon // Needs to be before ..() so icon is correct
. = ..()
-/obj/effect/overlay/temp/gib_animation/animal
+/obj/effect/temp_visual/gib_animation/animal
icon = 'icons/mob/animal.dmi'
-/obj/effect/overlay/temp/dust_animation
+/obj/effect/temp_visual/dust_animation
icon = 'icons/mob/mob.dmi'
duration = 15
-/obj/effect/overlay/temp/dust_animation/Initialize(mapload, dust_icon)
+/obj/effect/temp_visual/dust_animation/Initialize(mapload, dust_icon)
icon_state = dust_icon // Before ..() so the correct icon is flick()'d
. = ..()
-/obj/effect/overlay/temp/mummy_animation
+/obj/effect/temp_visual/mummy_animation
icon = 'icons/mob/mob.dmi'
icon_state = "mummy_revive"
duration = 20
-/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
+/obj/effect/temp_visual/heal //color is white by default, set to whatever is needed
name = "healing glow"
icon_state = "heal"
duration = 15
-/obj/effect/overlay/temp/heal/Initialize(mapload, set_color)
+/obj/effect/temp_visual/heal/Initialize(mapload, set_color)
if(set_color)
add_atom_colour(set_color, FIXED_COLOUR_PRIORITY)
. = ..()
pixel_x = rand(-12, 12)
pixel_y = rand(-9, 0)
-/obj/effect/overlay/temp/kinetic_blast
+/obj/effect/temp_visual/kinetic_blast
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
layer = ABOVE_ALL_MOB_LAYER
duration = 4
-/obj/effect/overlay/temp/explosion
+/obj/effect/temp_visual/explosion
name = "explosion"
icon = 'icons/effects/96x96.dmi'
icon_state = "explosion"
@@ -251,22 +251,22 @@
pixel_y = -32
duration = 8
-/obj/effect/overlay/temp/explosion/fast
+/obj/effect/temp_visual/explosion/fast
icon_state = "explosionfast"
duration = 4
-/obj/effect/overlay/temp/blob
+/obj/effect/temp_visual/blob
name = "blob"
icon_state = "blob_attack"
alpha = 140
randomdir = 0
duration = 6
-/obj/effect/overlay/temp/impact_effect
+/obj/effect/temp_visual/impact_effect
icon_state = "impact_bullet"
duration = 5
-/obj/effect/overlay/temp/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P)
+/obj/effect/temp_visual/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P)
if(target == P.original) //the projectile hit the target originally clicked
pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4)
pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4)
@@ -275,37 +275,37 @@
pixel_y = target.pixel_y + rand(-4,4)
. = ..()
-/obj/effect/overlay/temp/impact_effect/red_laser
+/obj/effect/temp_visual/impact_effect/red_laser
icon_state = "impact_laser"
duration = 4
-/obj/effect/overlay/temp/impact_effect/red_laser/wall
+/obj/effect/temp_visual/impact_effect/red_laser/wall
icon_state = "impact_laser_wall"
duration = 10
-/obj/effect/overlay/temp/impact_effect/blue_laser
+/obj/effect/temp_visual/impact_effect/blue_laser
icon_state = "impact_laser_blue"
duration = 4
-/obj/effect/overlay/temp/impact_effect/green_laser
+/obj/effect/temp_visual/impact_effect/green_laser
icon_state = "impact_laser_green"
duration = 4
-/obj/effect/overlay/temp/impact_effect/purple_laser
+/obj/effect/temp_visual/impact_effect/purple_laser
icon_state = "impact_laser_purple"
duration = 4
-/obj/effect/overlay/temp/impact_effect/ion
+/obj/effect/temp_visual/impact_effect/ion
icon_state = "shieldsparkles"
duration = 6
-/obj/effect/overlay/temp/heart
+/obj/effect/temp_visual/heart
name = "heart"
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
duration = 25
-/obj/effect/overlay/temp/heart/Initialize(mapload)
+/obj/effect/temp_visual/heart/Initialize(mapload)
. = ..()
pixel_x = rand(-4,4)
pixel_y = rand(-4,4)
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
index 8c7a178bd6..44b9b91224 100644
--- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -1,5 +1,5 @@
//temporary visual effects
-/obj/effect/overlay/temp
+/obj/effect/temp_visual
icon_state = "nothing"
anchored = 1
layer = ABOVE_MOB_LAYER
@@ -8,30 +8,30 @@
var/randomdir = TRUE
var/timerid
-/obj/effect/overlay/temp/Initialize()
+/obj/effect/temp_visual/Initialize()
. = ..()
if(randomdir)
setDir(pick(GLOB.cardinal))
timerid = QDEL_IN(src, duration)
-/obj/effect/overlay/temp/Destroy()
+/obj/effect/temp_visual/Destroy()
. = ..()
deltimer(timerid)
-/obj/effect/overlay/temp/singularity_act()
+/obj/effect/temp_visual/singularity_act()
return
-/obj/effect/overlay/temp/singularity_pull()
+/obj/effect/temp_visual/singularity_pull()
return
-/obj/effect/overlay/temp/ex_act()
+/obj/effect/temp_visual/ex_act()
return
-/obj/effect/overlay/temp/dir_setting
+/obj/effect/temp_visual/dir_setting
randomdir = FALSE
-/obj/effect/overlay/temp/dir_setting/Initialize(mapload, set_dir)
+/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir)
if(set_dir)
setDir(set_dir)
. = ..()
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 3aaa24ce60..f7d04941ed 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -9,7 +9,7 @@
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
if(heavy_range > 1)
- new /obj/effect/overlay/temp/emp/pulse(epicenter)
+ new /obj/effect/temp_visual/emp/pulse(epicenter)
if(heavy_range > light_range)
light_range = heavy_range
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index af8b9341f9..0c29ee3f9f 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -68,6 +68,7 @@
var/pre_noise = FALSE
var/post_noise = FALSE
+
/obj/item/toy/crayon/suicide_act(mob/user)
user.visible_message("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!")
return (BRUTELOSS|OXYLOSS)
@@ -422,7 +423,7 @@
var/gangID = user.mind.gang_datum
var/area/territory = get_area(target)
- new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0)
+ new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0,user)
to_chat(user, "You tagged [territory] for your gang!")
/obj/item/toy/crayon/red
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 0e4f7200bb..3ab826ec41 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -56,13 +56,13 @@
qdel(active_dummy)
active_dummy = null
to_chat(usr, "You deactivate \the [src].")
- new /obj/effect/overlay/temp/emp/pulse(get_turf(src))
+ new /obj/effect/temp_visual/emp/pulse(get_turf(src))
else
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc)
C.activate(usr, saved_appearance, src)
to_chat(usr, "You activate \the [src].")
- new /obj/effect/overlay/temp/emp/pulse(get_turf(src))
+ new /obj/effect/temp_visual/emp/pulse(get_turf(src))
/obj/item/device/chameleon/proc/disrupt(delete_dummy = 1)
if(active_dummy)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 9131c02240..bc3c43202c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -162,18 +162,18 @@
return
var/T = get_turf(target)
if(locate(/mob/living) in T)
- new /obj/effect/overlay/temp/medical_holosign(T,user) //produce a holographic glow
+ new /obj/effect/temp_visual/medical_holosign(T,user) //produce a holographic glow
holo_cooldown = world.time + 100
return
..()
-/obj/effect/overlay/temp/medical_holosign
+/obj/effect/temp_visual/medical_holosign
name = "medical holosign"
desc = "A small holographic glow that indicates a medic is coming to treat a patient."
icon_state = "medi_holo"
duration = 30
-/obj/effect/overlay/temp/medical_holosign/Initialize(mapload, creator)
+/obj/effect/temp_visual/medical_holosign/Initialize(mapload, creator)
. = ..()
playsound(loc, 'sound/machines/ping.ogg', 50, 0) //make some noise!
if(creator)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 14e4f5a01c..9c14a4376a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -196,13 +196,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
if(do_after(user,50, target = src))
to_chat(user, "You cut the hair from this [src.singular_name].")
- //Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc)
- if(HS.amount < 50)
- HS.amount++
- use(1)
- break
- //If it gets to here it means it did not find a suitable stack on the tile.
var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
HS.amount = 1
use(1)
@@ -230,3 +223,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
HS.amount = 1
wetness = initial(wetness)
src.use(1)
+
+/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW)
+ ..()
+ var/obj/item/stack/sheet/leather/L = new(loc)
+ L.amount = amount
+ qdel(src)
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index c50ef26b81..ecc8d3a362 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -50,7 +50,8 @@
M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"])
M.updateappearance(mutations_overlay_update=1)
log_attack(log_msg)
- return TRUE
+ return TRUE
+ return FALSE
/obj/item/weapon/dnainjector/attack(mob/target, mob/user)
if(!user.IsAdvancedToolUser())
@@ -77,9 +78,9 @@
add_logs(user, target, "injected", src)
- if(!inject(target, user)) //Now we actually do the heavy lifting.
- to_chat(user, "It appears that [target] does not have compatible DNA.")
-
+ if(!inject(target, user)) //Now we actually do the heavy lifting.
+ to_chat(user, "It appears that [target] does not have compatible DNA.")
+
used = 1
icon_state = "dnainjector0"
desc += " This one is used up."
@@ -307,11 +308,11 @@
/obj/item/weapon/dnainjector/timed/inject(mob/living/carbon/M, mob/user)
prepare()
+ if(M.stat == DEAD) //prevents dead people from having their DNA changed
+ to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.")
+ return FALSE
if(M.has_dna() && !(M.disabilities & NOCLONE))
- if(M.stat == DEAD) //prevents dead people from having their DNA changed
- to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.")
- return
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
var/endtime = world.time+duration
@@ -352,9 +353,9 @@
M.updateappearance(mutations_overlay_update=1)
M.dna.temporary_mutations[UI_CHANGED] = endtime
log_attack(log_msg)
+ return TRUE
else
- to_chat(user, "It appears that [M] does not have compatible DNA.")
- return
+ return FALSE
/obj/item/weapon/dnainjector/timed/hulk
name = "\improper DNA injector (Hulk)"
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index a5f5eb6133..81ccd127c8 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -48,27 +48,27 @@
/obj/item/weapon/grenade/attack_self(mob/user)
if(!active)
if(clown_check(user))
- preprime(user)
+ preprime(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.throw_mode_on()
-/obj/item/weapon/grenade/proc/preprime(mob/user)
- if(user)
- to_chat(user, "You prime the [name]! [det_time/10] seconds!")
- playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1)
- active = TRUE
- icon_state = initial(icon_state) + "_active"
- add_fingerprint(user)
- var/turf/bombturf = get_turf(src)
- var/area/A = get_area(bombturf)
- if(user)
- var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]"
- GLOB.bombers += message
- message_admins(message)
- log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
-
- addtimer(CALLBACK(src, .proc/prime), det_time)
+/obj/item/weapon/grenade/proc/preprime(mob/user)
+ if(user)
+ to_chat(user, "You prime the [name]! [det_time/10] seconds!")
+ playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1)
+ active = TRUE
+ icon_state = initial(icon_state) + "_active"
+ add_fingerprint(user)
+ var/turf/bombturf = get_turf(src)
+ var/area/A = get_area(bombturf)
+ if(user)
+ var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]"
+ GLOB.bombers += message
+ message_admins(message)
+ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
+
+ addtimer(CALLBACK(src, .proc/prime), det_time)
/obj/item/weapon/grenade/proc/prime()
@@ -108,4 +108,4 @@
if(damage && attack_type == PROJECTILE_ATTACK && prob(15))
owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!")
prime()
- return 1 //It hit the grenade, not them
+ return 1 //It hit the grenade, not them
diff --git a/code/game/objects/items/weapons/implants/implant_krav_maga.dm b/code/game/objects/items/weapons/implants/implant_krav_maga.dm
index 1db7601255..60823f3279 100644
--- a/code/game/objects/items/weapons/implants/implant_krav_maga.dm
+++ b/code/game/objects/items/weapons/implants/implant_krav_maga.dm
@@ -19,7 +19,9 @@
var/mob/living/carbon/human/H = imp_in
if(!ishuman(H))
return
- if(istype(H.martial_art, /datum/martial_art/krav_maga))
+ if(!H.mind)
+ return
+ if(istype(H.mind.martial_art, /datum/martial_art/krav_maga))
style.remove(H)
else
style.teach(H,1)
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 1f5a229864..7b26c58a5d 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -80,7 +80,7 @@
target.apply_damage(force * fisto_setting, BRUTE)
target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]!", \
"You cry out in pain as [user]'s punch flings you backwards!")
- new /obj/effect/overlay/temp/kinetic_blast(target.loc)
+ new /obj/effect/temp_visual/kinetic_blast(target.loc)
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 5b1c641383..f2e9ca9fc6 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -247,10 +247,10 @@
)
/obj/item/weapon/storage/belt/military
- name = "military belt"
- desc = "A syndicate belt designed to be used by boarding parties. Its style is modeled after the hardsuits they wear."
- icon_state = "militarybelt"
- item_state = "military"
+ name = "chest rig"
+ desc = "A set of tactical webbing worn by Syndicate boarding parties."
+ icon_state = "explorer1"
+ item_state = "explorer1"
max_w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/storage/belt/military/abductor
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
old mode 100755
new mode 100644
index 4ffa4a9b89..97548b97d6
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -140,8 +140,8 @@
item_state = "plasmaman_tank_belt"
slot_flags = SLOT_BELT
force = 5
- volume = 3
- w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
+ volume = 3
+ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
/obj/item/weapon/tank/internals/plasmaman/belt/full/New()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 98a52994e9..9d24b44f33 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -106,7 +106,7 @@
new /obj/item/device/flashlight/seclite(src)
new /obj/item/clothing/gloves/krav_maga/sec(src)
new /obj/item/weapon/door_remote/head_of_security(src)
- new /obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube(src)
+ new /obj/item/weapon/gun/ballistic/shotgun/automatic/combat/compact(src)
/obj/structure/closet/secure_closet/security
name = "security officer's locker"
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 389ae40e88..43e0de52a1 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -331,8 +331,8 @@
/obj/structure/falsewall/brass/New(loc)
..()
var/turf/T = get_turf(src)
- new /obj/effect/overlay/temp/ratvar/wall/false(T)
- new /obj/effect/overlay/temp/ratvar/beam/falsewall(T)
+ new /obj/effect/temp_visual/ratvar/wall/false(T)
+ new /obj/effect/temp_visual/ratvar/beam/falsewall(T)
change_construction_value(4)
/obj/structure/falsewall/brass/Destroy()
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 05414f0a4d..91fbf13e3c 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -152,6 +152,8 @@
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
if(transfer_choice != "Yes")
return
+ if(QDELETED(src) || uses <= 0)
+ return
log_game("[user.ckey] golem-swapped into [src]")
user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!")
create(ckey = user.ckey, flavour = FALSE, name = user.real_name)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 2dc159d482..64d93e914e 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -254,10 +254,10 @@
/obj/structure/grille/ratvar/New()
..()
if(broken)
- new /obj/effect/overlay/temp/ratvar/grille/broken(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/grille/broken(get_turf(src))
else
- new /obj/effect/overlay/temp/ratvar/grille(get_turf(src))
- new /obj/effect/overlay/temp/ratvar/beam/grille(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/grille(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/beam/grille(get_turf(src))
/obj/structure/grille/ratvar/narsie_act()
take_damage(rand(1, 3), BRUTE)
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index ba9e5f8a33..2f6b03bef1 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -102,8 +102,8 @@
/obj/structure/lattice/catwalk/clockwork/Initialize(mapload)
..()
- new /obj/effect/overlay/temp/ratvar/floor/catwalk(loc)
- new /obj/effect/overlay/temp/ratvar/beam/catwalk(loc)
+ new /obj/effect/temp_visual/ratvar/floor/catwalk(loc)
+ new /obj/effect/temp_visual/ratvar/beam/catwalk(loc)
/obj/structure/lattice/catwalk/clockwork/ratvar_act()
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f594c4b513..0c11418003 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -545,7 +545,7 @@
qdel(I)
var/amount_of_gears = 2
if(fulltile)
- new /obj/effect/overlay/temp/ratvar/window(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/window(get_turf(src))
amount_of_gears = 4
for(var/i in 1 to amount_of_gears)
debris += new/obj/item/clockwork/alloy_shards/medium/gear_bit()
@@ -553,7 +553,7 @@
/obj/structure/window/reinforced/clockwork/setDir(direct)
if(!made_glow)
- var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/window/single(get_turf(src))
+ var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm
index 8b24a4c816..4f22487537 100644
--- a/code/game/turfs/simulated/chasm.dm
+++ b/code/game/turfs/simulated/chasm.dm
@@ -111,6 +111,9 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
planetary_atmos = TRUE
baseturf = /turf/open/chasm/straight_down/lava_land_surface
+ light_range = 1.9 //slightly less range than lava
+ light_power = 0.65 //less bright, too
+ light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right
/turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM)
//Make sure the item is still there after our sleep
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 9144cbc871..810a77fc42 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -133,8 +133,8 @@
/turf/open/floor/clockwork/Initialize()
..()
- new /obj/effect/overlay/temp/ratvar/floor(src)
- new /obj/effect/overlay/temp/ratvar/beam(src)
+ new /obj/effect/temp_visual/ratvar/floor(src)
+ new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/floor(src)
realappearence.linked = src
change_construction_value(1)
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index 9c40b8276f..544d637571 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -108,7 +108,7 @@
/turf/open/floor/engine/cult/Initialize()
..()
- new /obj/effect/overlay/temp/cult/turf/floor(src)
+ new /obj/effect/temp_visual/cult/turf/floor(src)
realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
realappearence.linked = src
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 54f3ad5ad5..708427a11a 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -73,6 +73,8 @@
for(i in 1 to mineralAmt)
new mineralType(src)
SSblackbox.add_details("ore_mined",mineralType)
+ for(var/obj/effect/temp_visual/mining_overlay/M in src)
+ qdel(M)
ChangeTurf(turf_type, defer_change)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index 9fa69fc6a7..21015e82d0 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -10,7 +10,7 @@
girder_type = /obj/structure/girder/cult
/turf/closed/wall/mineral/cult/Initialize()
- new /obj/effect/overlay/temp/cult/turf(src)
+ new /obj/effect/temp_visual/cult/turf(src)
. = ..()
/turf/closed/wall/mineral/cult/devastate_wall()
@@ -39,11 +39,11 @@
desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound."
/turf/closed/wall/mineral/cult/artificer/break_wall()
- new /obj/effect/overlay/temp/cult/turf(get_turf(src))
+ new /obj/effect/temp_visual/cult/turf(get_turf(src))
return null //excuse me we want no runed metal here
/turf/closed/wall/mineral/cult/artificer/devastate_wall()
- new /obj/effect/overlay/temp/cult/turf(get_turf(src))
+ new /obj/effect/temp_visual/cult/turf(get_turf(src))
//Clockwork wall: Causes nearby tinkerer's caches to generate components.
/turf/closed/wall/clockwork
@@ -60,8 +60,8 @@
/turf/closed/wall/clockwork/Initialize()
..()
- new /obj/effect/overlay/temp/ratvar/wall(src)
- new /obj/effect/overlay/temp/ratvar/beam(src)
+ new /obj/effect/temp_visual/ratvar/wall(src)
+ new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/wall(src)
realappearence.linked = src
change_construction_value(5)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index ac8162bc08..f8329b1f69 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -419,13 +419,18 @@
set desc="Restarts the world immediately"
if (!usr.client.holder)
return
- var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel")
- if(confirm == "Cancel")
- return
- if(confirm == "Yes")
- SSticker.delay_end = 0
+
+ var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
+ var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
+ if(result)
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+ switch(result)
+ if("Regular Restart")
+ SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+ if("Hard Restart (No Delay, No Feeback Reason)")
+ world.Reboot()
+ if("Hardest Restart (No actions, just reboot)")
+ world.Reboot(fast_track = TRUE)
/datum/admins/proc/end_round()
set category = "Server"
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index b886232e00..d288c63483 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -60,7 +60,7 @@
message_admins("[key_name_admin(ghost)] has taken control of ([key_name_admin(body)])")
body.ghostize(0)
body.key = ghost.key
- new /obj/effect/overlay/temp/gravpush(get_turf(body))
+ new /obj/effect/temp_visual/gravpush(get_turf(body))
/obj/effect/fun_balloon/sentience/emergency_shuttle
name = "shuttle sentience fun balloon"
@@ -79,7 +79,7 @@
/obj/effect/fun_balloon/scatter/effect()
for(var/mob/living/M in range(effect_range, get_turf(src)))
var/turf/T = find_safe_turf()
- new /obj/effect/overlay/temp/gravpush(get_turf(M))
+ new /obj/effect/temp_visual/gravpush(get_turf(M))
M.forceMove(T)
to_chat(M, "Pop!")
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 06f6e5e993..dcdf1538fe 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -442,7 +442,7 @@
dat += ""
for(var/datum/gang/G in SSticker.mode.gangs)
- dat += "
| [G.name] Gang: [G.points] Influence | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control | |
"
+ dat += "
| [G.name] Gang: [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control | |
"
for(var/datum/mind/N in G.bosses)
var/mob/M = N.current
if(!M)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c1780e4a34..4756318ee7 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -282,6 +282,11 @@
message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.")
href_list["secrets"] = "check_antagonist"
+ else if(href_list["trigger_centcom_recall"])
+ if(!check_rights(R_ADMIN))
+ return
+
+ usr.client.trigger_centcom_recall()
else if(href_list["toggle_continuous"])
if(!check_rights(R_ADMIN))
return
@@ -1170,7 +1175,7 @@
if(!check_rights(R_ADMIN))
return
- if(SSticker.HasRoundStarted())
+ if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
var/dat = {"What mode do you wish to play?
"}
for(var/mode in config.modes)
@@ -1184,7 +1189,7 @@
if(!check_rights(R_ADMIN))
return
- if(SSticker.HasRoundStarted())
+ if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1199,21 +1204,21 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
- if (SSticker.HasRoundStarted())
+ if (SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
GLOB.master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].")
message_admins("[key_name_admin(usr)] set the mode as [GLOB.master_mode].")
to_chat(world, "The mode is now: [GLOB.master_mode]")
Game() // updates the main game menu
- world.save_mode(GLOB.master_mode)
+ SSticker.save_mode(GLOB.master_mode)
.(href, list("c_mode"=1))
else if(href_list["f_secret2"])
if(!check_rights(R_ADMIN|R_SERVER))
return
- if(SSticker.HasRoundStarted())
+ if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1511,17 +1516,6 @@
usr.client.cmd_admin_animalize(M)
- else if(href_list["gangpoints"])
- var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs
- if(G)
- var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num
- if(!newpoints)
- return
- message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].")
- log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].")
- G.points = newpoints
- G.message_gangtools("Your gang now has [G.points] influence.")
-
else if(href_list["adminplayeropts"])
var/mob/M = locate(href_list["adminplayeropts"])
show_player_panel(M)
@@ -1799,18 +1793,18 @@
if(!check_rights(R_ADMIN))
return
- var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list
- if(!ismob(M))
- to_chat(usr, "This can only be used on instances of type /mob.")
+ var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list
+ if(!ismob(M))
+ to_chat(usr, "This can only be used on instances of type /mob.")
return
- var/datum/language_holder/H = M.get_language_holder()
- H.open_language_menu(usr)
+ var/datum/language_holder/H = M.get_language_holder()
+ H.open_language_menu(usr)
else if(href_list["traitor"])
if(!check_rights(R_ADMIN))
return
- if(!SSticker.HasRoundStarted())
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
@@ -2161,7 +2155,7 @@
else if(href_list["kick_all_from_lobby"])
if(!check_rights(R_ADMIN))
return
- if(SSticker.IsRoundInProgress())
+ if(SSticker.IsRoundInProgress())
var/afkonly = text2num(href_list["afkonly"])
if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
to_chat(usr, "Kick clients from lobby aborted")
@@ -2242,20 +2236,20 @@
if(href_list["viewruntime_backto"])
error_viewer.show_to(owner, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
else
- error_viewer.show_to(owner, null, href_list["viewruntime_linear"])
- else if(href_list["showrelatedacc"])
- var/client/C = locate(href_list["client"]) in GLOB.clients
- var/list/thing_to_check
- if(href_list["showrelatedacc"] == "cid")
- thing_to_check = C.related_accounts_cid
- else
- thing_to_check = C.related_accounts_ip
- thing_to_check = splittext(thing_to_check, ", ")
-
-
- var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:
"
- for(var/thing in thing_to_check)
- dat += "[thing]
"
-
- usr << browse(dat, "size=420x300")
-
+ error_viewer.show_to(owner, null, href_list["viewruntime_linear"])
+ else if(href_list["showrelatedacc"])
+ var/client/C = locate(href_list["client"]) in GLOB.clients
+ var/list/thing_to_check
+ if(href_list["showrelatedacc"] == "cid")
+ thing_to_check = C.related_accounts_cid
+ else
+ thing_to_check = C.related_accounts_ip
+ thing_to_check = splittext(thing_to_check, ", ")
+
+
+ var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:
"
+ for(var/thing in thing_to_check)
+ dat += "[thing]
"
+
+ usr << browse(dat, "size=420x300")
+
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 2397f6c4a5..f359085941 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -52,10 +52,7 @@
if(!check_rights(R_SOUNDS))
return
- if(SSticker)
- SSticker.round_end_sound = fcopy_rsc(S)
- else
- return
+ SSticker.SetRoundEndSound(S)
log_admin("[key_name(src)] set the round end sound to [S]")
message_admins("[key_name_admin(src)] set the round end sound to [S]")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index b82d1f65e2..09dfcf4d69 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1194,3 +1194,16 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
message_admins(msg)
admin_ticket_log(target, msg)
log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].")
+
+
+/client/proc/trigger_centcom_recall()
+ if(!holder)
+ return
+ var/message = pick(GLOB.admiral_messages)
+ message = input("Enter message from the on-call admiral to be put in the recall report.", "Admiral Message", message) as text|null
+
+ if(!message)
+ return
+
+ message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]")
+ log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]")
\ No newline at end of file
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 6928139829..6f68a962dd 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -172,11 +172,11 @@
/obj/item/device/assembly/flash/cyborg/attack(mob/living/M, mob/user)
..()
- new /obj/effect/overlay/temp/borgflash(get_turf(src))
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attack_self(mob/user)
..()
- new /obj/effect/overlay/temp/borgflash(get_turf(src))
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attackby(obj/item/weapon/W, mob/user, params)
return
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index bd9f3e35df..a403210242 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -19,7 +19,7 @@
/obj/machinery/meter/Initialize(mapload)
. = ..()
SSair.atmos_machinery += src
- if (mapload && !target)
+ if (!target)
target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/meter/Destroy()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 93b9b6b3f9..b06c9a5579 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -433,7 +433,7 @@
/obj/item/projectile/beam/ctf/red
icon_state = "laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
// BLUE TEAM GUNS
@@ -448,7 +448,7 @@
/obj/item/projectile/beam/ctf/blue
icon_state = "bluelaser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
/datum/outfit/ctf
name = "CTF"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 0d5e93fba7..d236558ddf 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -672,3 +672,7 @@ GLOBAL_LIST(external_rsc_urls)
CRASH("change_view called without argument.")
view = new_size
+
+/client/proc/AnnouncePR(announcement)
+ if(prefs && prefs.chat_toggles & CHAT_PULLR)
+ to_chat(src, announcement)
\ No newline at end of file
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index f287870ef6..8a943b4c26 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -271,6 +271,8 @@ BLIND // can't see anything
/obj/item/clothing/head
name = "head"
icon = 'icons/obj/clothing/hats.dmi'
+ icon_state = "top_hat"
+ item_state = "that"
body_parts_covered = HEAD
slot_flags = SLOT_HEAD
var/blockTracking = 0 //For AI tracking
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 6a9ac41a0d..2f70c3bfdf 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -7,25 +7,34 @@
actions_types = list(/datum/action/item_action/toggle_mode)
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
- var/mode = 0 //0 - regular mesons mode 1 - t-ray mode
+ mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode
var/range = 1
-/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
+/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary)
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING && mode)
+ if(picked_excuse)
+ to_chat(user, "Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.")
+ return
mode = !mode
if(mode)
- START_PROCESSING(SSobj, src)
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
lighting_alpha = null
- to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
+ if(voluntary)
+ to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
+ else
+ to_chat(user, "The goggles abruptly toggle to \[T-Ray] mode!")
else
- STOP_PROCESSING(SSobj, src)
vision_flags = SEE_TURFS
darkness_view = 1
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
- to_chat(loc, "You toggle the goggles' scanning mode to \[Meson].")
+ if(voluntary)
+ to_chat(user, "You toggle the goggles' scanning mode to \[Meson].")
+ else
+ to_chat(user, "The goggles abruptly toggle to \[Meson] mode!")
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -37,8 +46,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
+ toggle_mode(user, TRUE)
+
/obj/item/clothing/glasses/meson/engine/process()
if(!mode)
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING)
+ toggle_mode(loc)
return
if(!ishuman(loc))
@@ -47,7 +62,6 @@
var/mob/living/carbon/human/user = loc
if(user.glasses != src)
return
-
scan()
/obj/item/clothing/glasses/meson/engine/proc/scan()
@@ -89,13 +103,17 @@
icon_state = "trayson-tray_off"
origin_tech = "materials=3;magnets=2;engineering=2"
- mode = 1
- var/on = 0
+ mode = TRUE
+ var/on = FALSE
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
range = 2
+/obj/item/clothing/glasses/meson/engine/tray/Initialize()
+ . = ..()
+ picked_excuse = null
+
/obj/item/clothing/glasses/meson/engine/tray/process()
if(!on)
return
@@ -108,15 +126,10 @@
if(user.glasses == src)
user.update_inv_glasses()
-/obj/item/clothing/glasses/meson/engine/tray/attack_self(mob/user)
+/obj/item/clothing/glasses/meson/engine/tray/toggle_mode(mob/user, voluntary)
on = !on
- if(on)
- START_PROCESSING(SSobj, src)
- to_chat(user, "You turn the goggles on.")
- else
- STOP_PROCESSING(SSobj, src)
- to_chat(user, "You turn the goggles off.")
+ to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [on ? "on":"off"][voluntary ? ".":"!"]")
update_icon()
for(var/X in actions)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 2f6089bc56..1cc0cc6163 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -31,14 +31,60 @@
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions."
icon_state = "meson"
item_state = "meson"
origin_tech = "magnets=1;engineering=2"
darkness_view = 2
vision_flags = SEE_TURFS
- lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/lightgreen
+ var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
+ "gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
+ var/picked_excuse
+ var/mode = FALSE //if FALSE, is in normal meson mode.
+
+/obj/item/clothing/glasses/meson/Initialize()
+ . = ..()
+ picked_excuse = pick(meson_mining_failure_excuses)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/clothing/glasses/meson/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/clothing/glasses/meson/examine(mob/user)
+ ..()
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING && mode && picked_excuse)
+ to_chat(user, "Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.")
+
+/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user)
+ if(vision_flags & SEE_TURFS)
+ mode = TRUE
+ vision_flags &= ~SEE_TURFS
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(picked_excuse)
+ to_chat(H, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.")
+ if(H.glasses == src)
+ H.update_sight()
+ else if(!(vision_flags & SEE_TURFS))
+ mode = FALSE
+ vision_flags |= SEE_TURFS
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ to_chat(H, "Your Meson Scanners have reactivated.")
+ if(H.glasses == src)
+ H.update_sight()
+
+/obj/item/clothing/glasses/meson/process()
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING)
+ if(!mode)
+ toggle_mode(loc)
+ else if(mode)
+ toggle_mode(loc)
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
@@ -47,7 +93,7 @@
item_state = "nvgmeson"
origin_tech = "magnets=4;engineering=5;plasmatech=4"
darkness_view = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
/obj/item/clothing/glasses/meson/gar
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index a8ed4d2100..1cadd5cc0d 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -14,14 +14,14 @@
/obj/item/clothing/suit/armor/vest
name = "armor vest"
- desc = "A slim armored vest that protects against most types of damage."
+ desc = "A slim Type I armored vest that provides decent protection against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
- desc = "An armored vest that protects against most types of damage."
+ desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor"
item_state = "armor"
@@ -31,7 +31,7 @@
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
- desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence."
+ desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
@@ -77,7 +77,7 @@
/obj/item/clothing/suit/armor/vest/capcarapace
name = "captain's carapace"
- desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
+ desc = "An fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
@@ -93,7 +93,7 @@
/obj/item/clothing/suit/armor/riot
name = "riot suit"
- desc = "A suit of armor with heavy padding to protect against melee attacks."
+ desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -115,7 +115,7 @@
/obj/item/clothing/suit/armor/bulletproof
name = "bulletproof armor"
- desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
+ desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 6aedfc13e6..8a06ebd0da 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -211,6 +211,14 @@
item_state = "black_suit_fem"
item_color = "black_suit_fem"
+/obj/item/clothing/under/suit_jacket/green
+ name = "green suit"
+ desc = "A green suit and yellow necktie. Baller."
+ icon_state = "green_suit"
+ item_state = "dg_suit"
+ item_color = "green_suit"
+ can_adjust = 0
+
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm
index 4e18e45e9a..0e15d24e03 100644
--- a/code/modules/fields/fields.dm
+++ b/code/modules/fields/fields.dm
@@ -28,7 +28,6 @@
var/square_depth_up = 0
var/square_depth_down = 0
//Processing
- var/requires_processing = FALSE
var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary
var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup.
var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU.
@@ -40,11 +39,7 @@
var/list/turf/field_turfs_new = list()
var/list/turf/edge_turfs_new = list()
-/datum/proximity_monitor/advanced/New()
- SSfields.register_new_field(src)
-
/datum/proximity_monitor/advanced/Destroy()
- SSfields.unregister_field(src)
full_cleanup()
return ..()
diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm
index 9cfc34f127..5d2d2829a9 100644
--- a/code/modules/fields/peaceborg_dampener.dm
+++ b/code/modules/fields/peaceborg_dampener.dm
@@ -3,7 +3,6 @@
//Only use square radius for this!
/datum/proximity_monitor/advanced/peaceborg_dampener
name = "\improper Hyperkinetic Dampener Field"
- requires_processing = TRUE
setup_edge_turfs = TRUE
setup_field_turfs = TRUE
field_shape = FIELD_SHAPE_RADIUS_SQUARE
@@ -22,10 +21,15 @@
use_host_turf = TRUE
/datum/proximity_monitor/advanced/peaceborg_dampener/New()
+ START_PROCESSING(SSfields, src)
tracked = list()
staging = list()
..()
+/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy()
+ STOP_PROCESSING(SSfields, src)
+ return ..()
+
/datum/proximity_monitor/advanced/peaceborg_dampener/process()
if(!istype(projector))
qdel(src)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 84bf984ca9..918f179591 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -125,7 +125,7 @@
/datum/language_holder/synthetic
languages = list(/datum/language/common)
- shadow_languages = list(/datum/language/machine, /datum/language/draconic)
+ shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
/datum/language_holder/universal/New()
..()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index dc443cf265..68665e2d81 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -270,7 +270,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
if(5)
dat += "Upload a New Title
"
if(!scanner)
- findscanner(9)
+ scanner = findscanner(9)
if(!scanner)
dat += "No scanner found within wireless network range.
"
else if(!scanner.cache)
@@ -314,7 +314,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
popup.open()
/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
- for(var/obj/machinery/libraryscanner/S in range(viewrange))
+ for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src)))
return S
return null
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
index dd8766bdc9..a9315b7bea 100644
--- a/code/modules/mining/equipment.dm
+++ b/code/modules/mining/equipment.dm
@@ -169,7 +169,7 @@
icon = 'icons/obj/mining.dmi'
icon_state = "resonator"
item_state = "resonator"
- desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
+ desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
w_class = WEIGHT_CLASS_NORMAL
force = 15
throwforce = 10
@@ -188,18 +188,6 @@
fieldlimit = 6
quick_burst_mod = 1
-/obj/item/weapon/resonator/proc/CreateResonance(target, creator)
- var/turf/T = get_turf(target)
- var/obj/effect/resonance/R = locate(/obj/effect/resonance) in T
- if(R)
- R.resonance_damage *= quick_burst_mod
- R.burst()
- return
- if(fields.len < fieldlimit)
- playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
- var/obj/effect/resonance/RE = new(T, creator, burst_time, src)
- fields += RE
-
/obj/item/weapon/resonator/attack_self(mob/user)
if(burst_time == 50)
burst_time = 30
@@ -208,57 +196,76 @@
burst_time = 50
to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
-/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag)
- if(proximity_flag)
- if(!check_allowed_items(target, 1))
- return
+/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
+ var/turf/T = get_turf(target)
+ var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
+ if(R)
+ R.damage_multiplier = quick_burst_mod
+ R.burst()
+ return
+ if(LAZYLEN(fields) < fieldlimit)
+ new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
user.changeNext_move(CLICK_CD_MELEE)
- CreateResonance(target, user)
-/obj/effect/resonance
+/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
+ if(check_allowed_items(target, 1))
+ CreateResonance(target, user)
+ return TRUE
+
+/obj/effect/temp_visual/resonance
name = "resonance field"
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
- icon = 'icons/effects/effects.dmi'
icon_state = "shield1"
layer = ABOVE_ALL_MOB_LAYER
- anchored = TRUE
- mouse_opacity = 0
+ duration = 50
var/resonance_damage = 20
+ var/damage_multiplier = 1
var/creator
var/obj/item/weapon/resonator/res
-/obj/effect/resonance/New(loc, set_creator, timetoburst, set_resonator)
- ..()
+/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
+ duration = set_duration
+ . = ..()
creator = set_creator
res = set_resonator
- check_pressure()
- addtimer(CALLBACK(src, .proc/burst), timetoburst)
+ if(res)
+ res.fields += src
+ playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
+ transform = matrix()*0.75
+ animate(src, transform = matrix()*1.5, time = duration)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
-/obj/effect/resonance/Destroy()
+/obj/effect/temp_visual/resonance/Destroy()
if(res)
res.fields -= src
+ res = null
+ creator = null
. = ..()
-/obj/effect/resonance/proc/check_pressure()
- var/turf/proj_turf = get_turf(src)
+/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
+ if(!proj_turf)
+ proj_turf = get_turf(src)
if(!istype(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
+ resonance_damage = initial(resonance_damage)
if(pressure < 50)
name = "strong [initial(name)]"
- resonance_damage = 60
+ resonance_damage *= 3
else
name = initial(name)
- resonance_damage = initial(resonance_damage)
+ resonance_damage *= damage_multiplier
-/obj/effect/resonance/proc/burst()
- check_pressure()
+/obj/effect/temp_visual/resonance/proc/burst()
var/turf/T = get_turf(src)
- playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
+ new /obj/effect/temp_visual/resonance_crush(T)
if(ismineralturf(T))
var/turf/closed/mineral/M = T
M.gets_drilled(creator)
+ check_pressure(T)
+ playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
for(var/mob/living/L in T)
if(creator)
add_logs(creator, L, "used a resonator field on", "resonator")
@@ -266,6 +273,16 @@
L.apply_damage(resonance_damage, BRUTE)
qdel(src)
+/obj/effect/temp_visual/resonance_crush
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/resonance_crush/Initialize()
+ . = ..()
+ transform = matrix()*1.5
+ animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
+
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
@@ -345,28 +362,23 @@
/**********************Mining Scanners**********************/
/obj/item/device/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
- var/cooldown = 0
+ var/cooldown = 35
+ var/current_cooldown = 0
origin_tech = "engineering=1;magnets=1"
/obj/item/device/mining_scanner/attack_self(mob/user)
if(!user.client)
return
- if(!cooldown)
- cooldown = TRUE
- addtimer(CALLBACK(src, .proc/clear_cooldown), 40)
- var/list/mobs = list()
- mobs |= user
- mineral_scan_pulse(mobs, get_turf(user))
-
-/obj/item/device/mining_scanner/proc/clear_cooldown()
- cooldown = FALSE
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ mineral_scan_pulse(get_turf(user))
//Debug item to identify all ore spread quickly
@@ -379,7 +391,7 @@
qdel(src)
/obj/item/device/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
@@ -387,77 +399,47 @@
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
- var/on_cooldown = 0
+ var/current_cooldown = 0
var/range = 7
- var/meson = TRUE
origin_tech = "engineering=3;magnets=3"
-/obj/item/device/t_scanner/adv_mining_scanner/material
- meson = FALSE
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
-
/obj/item/device/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
range = 4
cooldown = 50
-/obj/item/device/t_scanner/adv_mining_scanner/lesser/material
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
- meson = FALSE
-
/obj/item/device/t_scanner/adv_mining_scanner/scan()
- if(!on_cooldown)
- on_cooldown = 1
- spawn(cooldown)
- on_cooldown = 0
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
var/turf/t = get_turf(src)
- var/list/mobs = recursive_mob_check(t, 1,0,0)
- if(!mobs.len)
- return
- if(meson)
- mineral_scan_pulse(mobs, t, range)
- else
- mineral_scan_pulse_material(mobs, t, range)
+ mineral_scan_pulse(t, range)
-//For use with mesons
-/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
+/proc/mineral_scan_pulse(turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/closed/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
- if(minerals.len)
- for(var/mob/user in mobs)
- if(user.client)
- var/client/C = user.client
- for(var/turf/closed/mineral/M in minerals)
- var/turf/F = get_turf(M)
- var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER)
- I.plane = FULLSCREEN_PLANE
- C.images += I
- spawn(30)
- if(C)
- C.images -= I
-
-//For use with material scanners
-/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/closed/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(minerals.len)
+ if(LAZYLEN(minerals))
for(var/turf/closed/mineral/M in minerals)
- var/obj/effect/overlay/temp/mining_overlay/C = new /obj/effect/overlay/temp/mining_overlay(M)
+ var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
+ if(oldC)
+ qdel(oldC)
+ var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
C.icon_state = M.scan_state
-/obj/effect/overlay/temp/mining_overlay
+/obj/effect/temp_visual/mining_overlay
+ plane = FULLSCREEN_PLANE
layer = FLASH_LAYER
- icon = 'icons/turf/smoothrocks.dmi'
- anchored = 1
- mouse_opacity = 0
- duration = 30
- pixel_x = -4
- pixel_y = -4
+ icon = 'icons/effects/ore_visuals.dmi'
+ appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
+ duration = 35
+ pixel_x = -224
+ pixel_y = -224
+
+/obj/effect/temp_visual/mining_overlay/Initialize()
+ . = ..()
+ animate(src, alpha = 0, time = duration, easing = EASE_IN)
/**********************Xeno Warning Sign**********************/
@@ -510,79 +492,66 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
sharpness = IS_SHARP
- var/charged = 1
- var/charge_time = 16
- var/atom/mark = null
- var/mutable_appearance/marked_underlay
+ var/charged = TRUE
+ var/charge_time = 14
/obj/item/projectile/destabilizer
name = "destabilizing force"
icon_state = "pulse1"
+ nodamage = TRUE
damage = 0 //We're just here to mark people. This is still a melee weapon.
damage_type = BRUTE
flag = "bomb"
range = 6
- var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced = null
log_override = TRUE
+ var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
+
+/obj/item/projectile/destabilizer/Destroy()
+ hammer_synced = null
+ return ..()
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
- if(hammer_synced)
- if(hammer_synced.mark == target)
- return ..()
- if(isliving(target))
- if(hammer_synced.mark && hammer_synced.marked_underlay)
- hammer_synced.mark.underlays -= hammer_synced.marked_underlay
- hammer_synced.marked_underlay = null
- var/mob/living/L = target
- if(L.mob_size >= MOB_SIZE_LARGE)
- hammer_synced.mark = L
- hammer_synced.marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
- hammer_synced.marked_underlay.pixel_x = -L.pixel_x
- hammer_synced.marked_underlay.pixel_y = -L.pixel_y
- L.underlays += hammer_synced.marked_underlay
- var/target_turf = get_turf(target)
- if(ismineralturf(target_turf))
- var/turf/closed/mineral/M = target_turf
- new /obj/effect/overlay/temp/kinetic_blast(M)
- M.gets_drilled(firer)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ CM.hammer_synced = hammer_synced
+ var/target_turf = get_turf(target)
+ if(ismineralturf(target_turf))
+ var/turf/closed/mineral/M = target_turf
+ new /obj/effect/temp_visual/kinetic_blast(M)
+ M.gets_drilled(firer)
..()
/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
if(!proximity_flag && charged)//Mark a target, or mine a tile.
- var/turf/proj_turf = get_turf(src)
+ var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure > 50)
- playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- return
- var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(user.loc)
- D.preparePixelProjectile(target,get_turf(target), user)
+ var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
+ D.preparePixelProjectile(target, get_turf(target), user)
D.hammer_synced = src
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
D.fire()
- charged = 0
+ charged = FALSE
icon_state = "mining_hammer1_uncharged"
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
return
- if(proximity_flag && target == mark && isliving(target))
+ if(proximity_flag && isliving(target))
var/mob/living/L = target
- new /obj/effect/overlay/temp/kinetic_blast(get_turf(L))
- mark = 0
- if(L.mob_size >= MOB_SIZE_LARGE)
- L.underlays -= marked_underlay
- QDEL_NULL(marked_underlay)
- var/backstab_dir = get_dir(user, L)
- var/def_check = L.getarmor(type = "bomb")
- if((user.dir & backstab_dir) && (L.dir & backstab_dir))
- L.apply_damage(80, BRUTE, blocked = def_check)
- playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
- else
- L.apply_damage(50, BRUTE, blocked = def_check)
+ var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
+ return
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
+ var/backstab_dir = get_dir(user, L)
+ var/def_check = L.getarmor(type = "bomb")
+ if((user.dir & backstab_dir) && (L.dir & backstab_dir))
+ L.apply_damage(80, BRUTE, blocked = def_check)
+ playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
+ else
+ L.apply_damage(50, BRUTE, blocked = def_check)
/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
if(!charged)
- charged = 1
+ charged = TRUE
icon_state = "mining_hammer1"
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 9e4996135d..8a3f4ee633 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -673,7 +673,7 @@
if(!istype(T))
return
if(!istype(T, turf_type))
- var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T)
+ var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T)
L.alpha = 0
animate(L, alpha = 255, time = create_delay)
user.visible_message("[user] points [src] at [T]!")
@@ -696,7 +696,7 @@
timer = world.time + reset_cooldown
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
-/obj/effect/overlay/temp/lavastaff
+/obj/effect/temp_visual/lavastaff
icon_state = "lavastaff_warn"
duration = 50
@@ -821,7 +821,7 @@
timer = world.time + cooldown_time
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
chaser_timer = world.time + chaser_cooldown
- var/obj/effect/overlay/temp/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
C.damage = 30
C.monster_damage_boost = FALSE
add_logs(user, target, "fired a chaser at", src)
@@ -878,7 +878,7 @@
if(do_after(user, 50, target = user) && !beacon)
var/turf/T = get_turf(user)
playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
beacon = new/obj/effect/hierophant(T)
user.update_action_buttons_icon()
user.visible_message("[user] places a strange machine beneath [user.p_their()] feet!", \
@@ -905,8 +905,8 @@
timer = world.time + 50
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_on"
- var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE1 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(user.loc)
- var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE2 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(beacon.loc)
+ var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc)
+ var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc)
if(do_after(user, 40, target = user) && user && beacon)
var/turf/T = get_turf(beacon)
var/turf/source = get_turf(user)
@@ -918,8 +918,8 @@
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_off"
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
- new /obj/effect/overlay/temp/hierophant/telegraph(source, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(source, user)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord
@@ -940,13 +940,13 @@
beacon.icon_state = "hierophant_tele_off"
return
add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to")
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //No friendly fire, this is a utility tool
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
B.damage = 30
for(var/mob/living/L in range(1, source))
INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
@@ -991,10 +991,10 @@
/obj/item/weapon/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check)
+ new /obj/effect/temp_visual/hierophant/blast(T, user, friendly_fire_check)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d, user)
@@ -1007,18 +1007,15 @@
for(var/i in 1 to range)
if(!J)
return
- var/obj/effect/overlay/temp/hierophant/blast/B = new(J, user, friendly_fire_check)
- B.damage = 30
- B.monster_damage_boost = FALSE
+ new /obj/effect/temp_visual/hierophant/blast(J, user, friendly_fire_check)
previousturf = J
J = get_step(previousturf, dir)
/obj/item/weapon/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new(t, user, friendly_fire_check)
- B.damage = 15 //keeps monster damage boost due to lower damage
+ new /obj/effect/temp_visual/hierophant/blast(t, user, friendly_fire_check)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index ae0ad90dfe..371fb11fec 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -19,7 +19,7 @@
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400),
- new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
+ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index cef87fc57d..7ee5ed51c7 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -24,7 +24,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
attacktext = "drills"
@@ -44,7 +44,6 @@
var/light_on = 0
var/datum/action/innate/minedrone/toggle_light/toggle_light_action
- var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
var/datum/action/innate/minedrone/dump_ore/dump_ore_action
@@ -52,8 +51,6 @@
..()
toggle_light_action = new()
toggle_light_action.Grant(src)
- toggle_meson_vision_action = new()
- toggle_meson_vision_action.Grant(src)
toggle_mode_action = new()
toggle_mode_action.Grant(src)
dump_ore_action = new()
@@ -189,23 +186,6 @@
user.light_on = !user.light_on
to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].")
-/datum/action/innate/minedrone/toggle_meson_vision
- name = "Toggle Meson Vision"
- button_icon_state = "meson"
-
-/datum/action/innate/minedrone/toggle_meson_vision/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
- if(user.sight & SEE_TURFS)
- user.sight &= ~SEE_TURFS
- user.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
- else
- user.sight |= SEE_TURFS
- user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
-
- user.sync_lighting_plane_alpha()
-
- to_chat(user, "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")
-
/datum/action/innate/minedrone/toggle_mode
name = "Toggle Mode"
button_icon_state = "mech_cycle_equip_off"
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 9cb2965dfc..8118476c69 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -5,10 +5,10 @@
new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
/mob/living/carbon/alien/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-a")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
/mob/living/carbon/alien/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-a")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-a")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 26634d86dd..4d337606f5 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -13,10 +13,10 @@
new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
/mob/living/carbon/alien/larva/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-l")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
/mob/living/carbon/alien/larva/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/larva/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-l")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-l")
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index e272680418..c17126656f 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/human/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-h")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
/mob/living/carbon/human/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-h")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index be7e851a8e..8f597f5531 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -36,7 +36,8 @@
//initialise organs
create_internal_organs()
- martial_art = default_martial_art
+ if(mind)
+ mind.martial_art = mind.default_martial_art
handcrafting = new()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 0623921d63..46f5bc3d4f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -40,12 +40,13 @@
if(spec_return)
return spec_return
- if(martial_art && martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
- if(prob(martial_art.deflection_chance))
- if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
- visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!")
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return 0
+ if(mind)
+ if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
+ if(prob(mind.martial_art.deflection_chance))
+ if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
+ visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
+ return 0
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
@@ -103,10 +104,11 @@
return 0
/mob/living/carbon/human/proc/check_block()
- if(martial_art && martial_art.block_chance \
- && prob(martial_art.block_chance) && in_throw_mode \
- && !stat && !weakened && !stunned)
- return TRUE
+ if(mind)
+ if(mind.martial_art && mind.martial_art.block_chance \
+ && prob(mind.martial_art.block_chance) && in_throw_mode \
+ && !stat && !weakened && !stunned)
+ return TRUE
return FALSE
/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index f697215a4a..c1f5075b43 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -39,9 +39,6 @@
var/bleed_rate = 0 //how much are we bleeding
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
- var/datum/martial_art/martial_art = null
- var/static/default_martial_art = new/datum/martial_art
-
var/name_override //For temporary visible name changes
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 3a4b241f10..0620ebd062 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -144,9 +144,9 @@
if(NOGUNS in src.dna.species.species_traits)
to_chat(src, "Your fingers don't fit in the trigger guard!")
return 0
-
- if(martial_art && martial_art.no_guns) //great dishonor to famiry
- to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.")
- return 0
+ if(mind)
+ if(mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
+ to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.")
+ return 0
return .
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
new file mode 100644
index 0000000000..1ac24cffa9
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -0,0 +1,9 @@
+/mob/living/carbon/human/Login()
+ ..()
+ if(src.martial_art == default_martial_art && mind.stored_martial_art) //If the mind has a martial art stored and the body has the default one.
+ src.mind.stored_martial_art.teach(src) //Running teach so that it deals with help verbs.
+ else if(src.martial_art != default_martial_art && src.martial_art != mind.stored_martial_art) //If the body has a martial art which is not the default one and is not stored in the mind.
+ if(src.martial_art_owner != mind)
+ src.martial_art.remove(src)
+ else
+ src.mind.stored_martial_art = src.martial_art
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b3f436ec68..cf92de53e1 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1304,7 +1304,7 @@
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
return
-/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
+/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
if(!istype(M))
return
CHECK_DNA_AND_SPECIES(M)
@@ -1312,6 +1312,8 @@
if(!istype(M)) //sanity check for drones.
return
+ if(M.mind)
+ attacker_style = M.mind.martial_art
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]!")
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index aba76f570a..09c566e6a4 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -406,7 +406,7 @@
else
reactive_teleport(H)
-/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
+/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
..()
if(world.time > last_teleport + teleport_cooldown && M != H && M.a_intent != INTENT_HELP)
reactive_teleport(H)
@@ -490,7 +490,7 @@
var/golem_name = "[uppertext(clown_name)]"
return golem_name
-/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
+/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
..()
if(world.time > last_banana + banana_cooldown && M != H && M.a_intent != INTENT_HELP)
new/obj/item/weapon/grown/bananapeel/specialpeel(get_turf(H))
@@ -664,7 +664,7 @@
return
invisibility = INVISIBILITY_MAXIMUM //disappear before the animation
- new /obj/effect/overlay/temp/mummy_animation(get_turf(src))
+ new /obj/effect/temp_visual/mummy_animation(get_turf(src))
if(cloth_golem.revive(full_heal = TRUE, admin_revive = TRUE))
cloth_golem.grab_ghost() //won't pull if it's a suicide
sleep(20)
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index b8867af9e9..8eeadd6608 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/monkey/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-m")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m")
/mob/living/carbon/monkey/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-m")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-m")
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 6376ae4857..7baa1a3912 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/robot/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-r")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r")
/mob/living/silicon/robot/dust()
if(mmi)
@@ -11,7 +11,7 @@
new /obj/effect/decal/remains/robot(loc)
/mob/living/silicon/robot/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-r")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-r")
/mob/living/silicon/robot/death(gibbed)
if(stat == DEAD)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 4fbe56361e..cdbb5e77aa 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -198,9 +198,9 @@
/obj/item/weapon/robot_module/proc/do_transform_animation()
var/mob/living/silicon/robot/R = loc
R.notransform = TRUE
- var/obj/effect/overlay/temp/decoy/fading/fivesecond/ANM = new /obj/effect/overlay/temp/decoy/fading/fivesecond(R.loc, R)
+ var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
ANM.layer = R.layer - 0.01
- new /obj/effect/overlay/temp/small_smoke(R.loc)
+ new /obj/effect/temp_visual/small_smoke(R.loc)
if(R.hat)
R.hat.forceMove(get_turf(R))
R.hat = null
@@ -526,7 +526,6 @@
name = "Miner"
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
- /obj/item/borg/sight/meson,
/obj/item/weapon/storage/bag/ore/cyborg,
/obj/item/weapon/pickaxe/drill/cyborg,
/obj/item/weapon/shovel,
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 25a2f83266..5b17ab7d6e 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -299,7 +299,7 @@
/mob/living/simple_animal/bot/emp_act(severity)
var/was_on = on
stat |= EMPED
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
if(paicard)
paicard.emp_act(severity)
src.visible_message("[paicard] is flies out of [bot_name]!","You are forcefully ejected from [bot_name]!")
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 32db638542..4a79476bf0 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -9,7 +9,7 @@
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
obj_damage = 60
- environment_smash = 2 //Walls can't stop THE LAW
+ environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
radio_key = /obj/item/device/encryptionkey/headset_sec
@@ -444,7 +444,7 @@ Auto Patrol[]"},
if(severity==2 && prob(70))
..(severity-1)
else
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
if(C.stat==2)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 75948d2eb2..afcf1d4c33 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -115,7 +115,7 @@
melee_damage_upper = 30
attacktext = "smashes their armored gauntlet into"
speed = 3
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
attack_sound = 'sound/weapons/punch3.ogg'
status_flags = 0
mob_size = MOB_SIZE_LARGE
@@ -126,7 +126,7 @@
/mob/living/simple_animal/hostile/construct/armored/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
- environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
@@ -218,7 +218,7 @@
retreat_distance = 10
minimum_distance = 10 //AI artificers will flee like fuck
attacktext = "rams"
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
attack_sound = 'sound/weapons/punch2.ogg'
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
@@ -272,7 +272,7 @@
/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs
AIStatus = AI_ON
- environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////Non-cult Artificer/////////////////////////
/mob/living/simple_animal/hostile/construct/builder/noncult
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 159aec35af..5f3c8f6183 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -216,7 +216,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD)
- new /obj/effect/overlay/temp/heart(loc)
+ new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "purrs!")
else
if(M && stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index eb6feb00be..a2ae3b4b2d 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -553,7 +553,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
- new /obj/effect/overlay/temp/heart(loc)
+ new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 2594700770..e4daeb66d1 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -24,7 +24,7 @@
maxHealth = 40
melee_damage_lower = 1
melee_damage_upper = 2
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
stop_automated_movement_when_pulled = 1
blood_volume = BLOOD_VOLUME_NORMAL
var/obj/item/udder/udder = null
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 5297391462..8de57f1a85 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -20,7 +20,7 @@
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
var/list/edibles = list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach) //list of atoms, however turfs won't affect AI, but will affect consumption.
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index cd427ba33c..7a6204c7c9 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
health = INFINITY
healable = FALSE //don't brusepack the guardian
damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
- environment_smash = 1
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
obj_damage = 40
melee_damage_lower = 15
melee_damage_upper = 15
@@ -175,9 +175,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if(istype(summoner.loc, /obj/effect))
Recall(TRUE)
else
- new /obj/effect/overlay/temp/guardian/phase/out(loc)
+ new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner.loc)
- new /obj/effect/overlay/temp/guardian/phase(loc)
+ new /obj/effect/temp_visual/guardian/phase(loc)
/mob/living/simple_animal/hostile/guardian/canSuicide()
return 0
@@ -315,7 +315,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
return FALSE
if(loc == summoner)
forceMove(summoner.loc)
- new /obj/effect/overlay/temp/guardian/phase(loc)
+ new /obj/effect/temp_visual/guardian/phase(loc)
cooldown = world.time + 10
return TRUE
return FALSE
@@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
/mob/living/simple_animal/hostile/guardian/proc/Recall(forced)
if(!summoner || loc == summoner || (cooldown > world.time && !forced))
return FALSE
- new /obj/effect/overlay/temp/guardian/phase/out(loc)
+ new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner)
cooldown = world.time + 10
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index 1fa54dfd21..71ae19695c 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -71,8 +71,11 @@
melee_damage_upper = 50
armour_penetration = 100
obj_damage = 0
- environment_smash = 0
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
+
+
+ environment_smash = ENVIRONMENT_SMASH_NONE
+
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(src))
alpha = 15
if(!forced)
to_chat(src, "You enter stealth, empowering your next attack.")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index 708a1e2ce6..c1be82b820 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -40,7 +40,7 @@
/mob/living/simple_animal/hostile/guardian/charger/Move()
if(charging)
- new /obj/effect/overlay/temp/decoy/fading(loc,src)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
. = ..()
/mob/living/simple_animal/hostile/guardian/charger/snapback()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index 9da40c0c7c..1e6fa727b9 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -21,14 +21,14 @@
if(. && prob(40) && isliving(target))
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
L.apply_damage(15, BRUTE)
- new /obj/effect/overlay/temp/explosion(get_turf(M))
+ new /obj/effect/temp_visual/explosion(get_turf(M))
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
@@ -75,7 +75,7 @@
var/turf/T = get_turf(src)
stored_obj.forceMove(T)
playsound(T,'sound/effects/Explosion2.ogg', 200, 1)
- new /obj/effect/overlay/temp/explosion(T)
+ new /obj/effect/temp_visual/explosion(T)
user.ex_act(2)
qdel(src)
else
diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
index eacf58410b..cabb6854b2 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
@@ -63,6 +63,6 @@
else
to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!")
summoner.visible_message("\The [summoner] jumps back to [summoner.p_their()] protector.")
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner))
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
summoner.forceMove(get_turf(src))
- new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))
+ new /obj/effect/temp_visual/guardian/phase(get_turf(summoner))
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 f7c14f336a..37777a5ead 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -45,7 +45,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
alpha = 45
range = 255
incorporeal_move = 1
diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
index 1d2cfdea6f..72bb57513e 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
@@ -4,7 +4,7 @@
melee_damage_upper = 20
obj_damage = 80
next_move_modifier = 0.8 //attacks 20% faster
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index 159e6df5f4..3d7ae48443 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -34,7 +34,7 @@
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
- var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
if(C == summoner)
@@ -136,11 +136,11 @@
to_chat(src, "You need to hold still!")
return
- new /obj/effect/overlay/temp/guardian/phase/out(T)
+ new /obj/effect/temp_visual/guardian/phase/out(T)
if(isliving(A))
var/mob/living/L = A
L.flash_act()
A.visible_message("[A] disappears in a flash of light!", \
"Your vision is obscured by a flash of light!")
do_teleport(A, beacon, 0)
- new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
+ new /obj/effect/temp_visual/guardian/phase(get_turf(A))
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index b2cb16efa2..2d511004e7 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -158,7 +158,7 @@
a_intent = INTENT_HELP
friendly = "caresses"
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = 1
icon_state = "maid"
icon_living = "maid"
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 51e782b019..6e60f6b958 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -31,7 +31,7 @@
faction = list("hostile")
move_to_delay = 0
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 951589daaf..59177857cd 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -8,7 +8,7 @@
icon = 'icons/mob/simple_human.dmi'
icon_state = "paperwizard"
ranged = 1
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
minimum_distance = 3
retreat_distance = 3
obj_damage = 0
@@ -16,7 +16,7 @@
melee_damage_upper = 20
health = 1000
maxHealth = 1000
- loot = list(/obj/effect/overlay/temp/paperwiz_dying)
+ loot = list(/obj/effect/temp_visual/paperwiz_dying)
projectiletype = /obj/item/projectile/temp
projectilesound = 'sound/weapons/emitter.ogg'
attack_sound = 'sound/hallucinations/growl1.ogg'
@@ -129,7 +129,7 @@
qdel(src) //I see through your ruse!
//fancy effects
-/obj/effect/overlay/temp/paper_scatter
+/obj/effect/temp_visual/paper_scatter
name = "scattering paper"
desc = "Pieces of paper scattering to the wind."
layer = ABOVE_OPEN_TURF_LAYER
@@ -139,7 +139,7 @@
duration = 5
randomdir = FALSE
-/obj/effect/overlay/temp/paperwiz_dying
+/obj/effect/temp_visual/paperwiz_dying
name = "craft portal"
desc = "A wormhole sucking the wizard into the void. Neat."
layer = ABOVE_OPEN_TURF_LAYER
@@ -149,18 +149,18 @@
duration = 18
randomdir = FALSE
-/obj/effect/overlay/temp/paperwiz_dying/Initialize()
+/obj/effect/temp_visual/paperwiz_dying/Initialize()
. = ..()
visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!")
playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1)
playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1)
-/obj/effect/overlay/temp/paperwiz_dying/Destroy()
+/obj/effect/temp_visual/paperwiz_dying/Destroy()
for(var/mob/M in range(7,src))
shake_camera(M, 7, 1)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Summon_Magic.ogg', 50, 1, 1)
- new /obj/effect/overlay/temp/paper_scatter(T)
+ new /obj/effect/temp_visual/paper_scatter(T)
new /obj/item/clothing/suit/wizrobe/paper(T)
new /obj/item/clothing/head/collectable/paper(T)
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/flan.dm b/code/modules/mob/living/simple_animal/hostile/flan.dm
index c77fff881e..cb581b6ec5 100644
--- a/code/modules/mob/living/simple_animal/hostile/flan.dm
+++ b/code/modules/mob/living/simple_animal/hostile/flan.dm
@@ -8,7 +8,7 @@
icon_living = "flan"
icon_dead = "flan_dead"
turns_per_move = 5
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
speed = -2
maxHealth = 50
health = 50
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 77b68a936d..5f2c011665 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -17,7 +17,7 @@
robust_searching = 1
stat_attack = 2
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
speak_emote = list("squeaks")
ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 994dcb96d3..48e756e408 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -2,7 +2,7 @@
faction = list("hostile")
stop_automated_movement_when_pulled = 0
obj_damage = 40
- environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
var/rapid = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index e09336059c..25ce0fc0ec 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -67,7 +67,7 @@
melee_damage_upper = 0
speed = -1
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
index de1bf0b308..363753ee62 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
@@ -4,7 +4,7 @@
faction = list("jungle")
weather_immunities = list("acid")
obj_damage = 30
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
maxbodytemp = 450
response_help = "pokes"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index fa61a16e51..2645ebcef7 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -134,7 +134,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
if(charging)
- new /obj/effect/overlay/temp/decoy/fading(loc,src)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
DestroySurroundings()
. = ..()
if(!stat && .)
@@ -150,12 +150,12 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!T || T == loc)
return
- new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T)
+ new /obj/effect/temp_visual/dragon_swoop/bubblegum(T)
charging = TRUE
DestroySurroundings()
walk(src, 0)
setDir(get_dir(src, T))
- var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc,src)
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3)
sleep(3)
throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges))
@@ -245,9 +245,9 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
if(handedness)
- new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
else
- new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
sleep(2.5)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -259,11 +259,11 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
if(handedness)
- new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T)
- new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
else
- new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T)
- new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T)
sleep(6)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -276,31 +276,31 @@ Difficulty: Hard
addtimer(CALLBACK(src, .proc/devour, L), 2)
sleep(1)
-/obj/effect/overlay/temp/dragon_swoop/bubblegum
+/obj/effect/temp_visual/dragon_swoop/bubblegum
duration = 10
-/obj/effect/overlay/temp/bubblegum_hands
+/obj/effect/temp_visual/bubblegum_hands
icon = 'icons/effects/bubblegum.dmi'
duration = 9
-/obj/effect/overlay/temp/bubblegum_hands/rightthumb
+/obj/effect/temp_visual/bubblegum_hands/rightthumb
icon_state = "rightthumbgrab"
-/obj/effect/overlay/temp/bubblegum_hands/leftthumb
+/obj/effect/temp_visual/bubblegum_hands/leftthumb
icon_state = "leftthumbgrab"
-/obj/effect/overlay/temp/bubblegum_hands/rightpaw
+/obj/effect/temp_visual/bubblegum_hands/rightpaw
icon_state = "rightpawgrab"
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/bubblegum_hands/leftpaw
+/obj/effect/temp_visual/bubblegum_hands/leftpaw
icon_state = "leftpawgrab"
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/bubblegum_hands/rightsmack
+/obj/effect/temp_visual/bubblegum_hands/rightsmack
icon_state = "rightsmack"
-/obj/effect/overlay/temp/bubblegum_hands/leftsmack
+/obj/effect/temp_visual/bubblegum_hands/leftsmack
icon_state = "leftsmack"
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
@@ -316,7 +316,7 @@ Difficulty: Hard
if(!pools.len)
return FALSE
- var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc,src)
+ var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src)
DA.color = "#FF0000"
var/oldtransform = DA.transform
DA.transform = matrix()*2
@@ -358,7 +358,7 @@ Difficulty: Hard
new /obj/effect/decal/cleanable/blood/bubblegum(J)
for(var/i in 1 to range)
J = get_step(previousturf, targetdir)
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1)
if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J])
break
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index a390ecae71..fd42582317 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -95,7 +95,7 @@ Difficulty: Very Hard
..()
internal = new/obj/item/device/gps/internal/colossus(src)
-/obj/effect/overlay/temp/at_shield
+/obj/effect/temp_visual/at_shield
name = "anti-toolbox field"
desc = "A shimmering forcefield protecting the colossus."
icon = 'icons/effects/effects.dmi'
@@ -105,14 +105,14 @@ Difficulty: Very Hard
duration = 8
var/target
-/obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target)
+/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target)
. = ..()
target = new_target
INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
if(!stat)
- var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(src.loc, src)
+ var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(src.loc, src)
var/random_x = rand(-32, 32)
AT.pixel_x += random_x
@@ -123,8 +123,9 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L)
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.martial_art && prob(H.martial_art.deflection_chance))
- . = TRUE
+ if(H.mind)
+ if(H.mind.martial_art && prob(H.mind.martial_art.deflection_chance))
+ . = TRUE
/mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots()
dir_shots(GLOB.diagonals)
@@ -581,7 +582,7 @@ Difficulty: Very Hard
if(..())
for(var/i in range(1, src))
if(isturf(i))
- new /obj/effect/overlay/temp/cult/sparks(i)
+ new /obj/effect/temp_visual/cult/sparks(i)
continue
if(ishuman(i))
var/mob/living/carbon/human/H = i
@@ -657,7 +658,7 @@ Difficulty: Very Hard
minbodytemp = 0
maxbodytemp = 1500
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
AIStatus = AI_OFF
stop_automated_movement = 1
var/heal_power = 5
@@ -675,7 +676,7 @@ Difficulty: Very Hard
var/mob/living/L = target
if(L.stat != DEAD)
L.heal_overall_damage(heal_power, heal_power)
- new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
/mob/living/simple_animal/hostile/lightgeist/ghostize()
. = ..()
@@ -699,7 +700,7 @@ Difficulty: Very Hard
if(..())
var/list/L = list()
var/turf/T = get_step(src, dir)
- new /obj/effect/overlay/temp/emp/pulse(T)
+ new /obj/effect/temp_visual/emp/pulse(T)
for(var/i in T)
if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache))
var/obj/item/W = i
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 45139747fa..1c1fc8fb9e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -124,7 +124,7 @@ Difficulty: Medium
target.visible_message("Fire rains from the sky!")
for(var/turf/turf in range(9,get_turf(target)))
if(prob(11))
- new /obj/effect/overlay/temp/target(turf)
+ new /obj/effect/temp_visual/target(turf)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
@@ -179,7 +179,7 @@ Difficulty: Medium
negative = FALSE
else if(target.x == initial_x) //if their x is the same, pick a direction
negative = prob(50)
- var/obj/effect/overlay/temp/dragon_flight/F = new /obj/effect/overlay/temp/dragon_flight(loc, negative)
+ var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(loc, negative)
negative = !negative //invert it for the swoop down later
@@ -208,7 +208,7 @@ Difficulty: Medium
if(L.stat == DEAD)
break //target is dead and we're on em, slam they
if(fire_rain)
- new /obj/effect/overlay/temp/target(loc, flame_hit)
+ new /obj/effect/temp_visual/target(loc, flame_hit)
forceMove(get_step(src, get_dir(src, target)))
if(loc == get_turf(target))
if(!fire_rain)
@@ -228,8 +228,8 @@ Difficulty: Medium
else
if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1))
negative = TRUE
- new /obj/effect/overlay/temp/dragon_flight/end(loc, negative)
- new /obj/effect/overlay/temp/dragon_swoop(loc)
+ new /obj/effect/temp_visual/dragon_flight/end(loc, negative)
+ new /obj/effect/temp_visual/dragon_swoop(loc)
animate(src, transform = oldtransform, time = 5)
sleep(5)
swooping &= ~SWOOP_INVULNERABLE
@@ -271,7 +271,7 @@ Difficulty: Medium
invisibility = 100
-/obj/effect/overlay/temp/fireball
+/obj/effect/temp_visual/fireball
icon = 'icons/obj/wizard.dmi'
icon_state = "fireball"
name = "fireball"
@@ -281,28 +281,28 @@ Difficulty: Medium
duration = 9
pixel_z = DRAKE_SWOOP_HEIGHT
-/obj/effect/overlay/temp/fireball/Initialize()
+/obj/effect/temp_visual/fireball/Initialize()
. = ..()
animate(src, pixel_z = 0, time = duration)
-/obj/effect/overlay/temp/target
+/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
light_range = 2
duration = 9
-/obj/effect/overlay/temp/target/ex_act()
+/obj/effect/temp_visual/target/ex_act()
return
-/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit)
+/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit)
. = ..()
INVOKE_ASYNC(src, .proc/fall, flame_hit)
-/obj/effect/overlay/temp/target/proc/fall(list/flame_hit)
+/obj/effect/temp_visual/target/proc/fall(list/flame_hit)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Fireball.ogg', 80, 1)
- new /obj/effect/overlay/temp/fireball(T)
+ new /obj/effect/temp_visual/fireball(T)
sleep(duration)
if(ismineralturf(T))
var/turf/closed/mineral/M = T
@@ -320,7 +320,7 @@ Difficulty: Medium
else
L.adjustFireLoss(10) //if we've already hit them, do way less damage
-/obj/effect/overlay/temp/dragon_swoop
+/obj/effect/temp_visual/dragon_swoop
name = "certain death"
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
@@ -331,7 +331,7 @@ Difficulty: Medium
color = "#FF0000"
duration = 5
-/obj/effect/overlay/temp/dragon_flight
+/obj/effect/temp_visual/dragon_flight
icon = 'icons/mob/lavaland/dragon.dmi'
icon_state = "dragon"
layer = ABOVE_ALL_MOB_LAYER
@@ -339,11 +339,11 @@ Difficulty: Medium
duration = 10
randomdir = FALSE
-/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative)
+/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative)
. = ..()
INVOKE_ASYNC(src, .proc/flight, negative)
-/obj/effect/overlay/temp/dragon_flight/proc/flight(negative)
+/obj/effect/temp_visual/dragon_flight/proc/flight(negative)
if(negative)
animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING)
else
@@ -355,12 +355,12 @@ Difficulty: Medium
else
animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7)
-/obj/effect/overlay/temp/dragon_flight/end
+/obj/effect/temp_visual/dragon_flight/end
pixel_x = DRAKE_SWOOP_HEIGHT
pixel_z = DRAKE_SWOOP_HEIGHT
duration = 5
-/obj/effect/overlay/temp/dragon_flight/end/flight(negative)
+/obj/effect/temp_visual/dragon_flight/end/flight(negative)
if(negative)
pixel_x = -DRAKE_SWOOP_HEIGHT
animate(src, pixel_x = -16, pixel_z = 0, time = 5)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 79ac234ab9..fad0ab17df 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -150,7 +150,7 @@ Difficulty: Hard
var/prevloc = loc
. = ..()
if(!stat && .)
- var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(prevloc)
+ var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(prevloc)
HS.dir = dir
playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)
if(target)
@@ -250,7 +250,7 @@ Difficulty: Hard
pickedtarget = pick_n_take(targets)
if(!istype(pickedtarget) || pickedtarget.stat == DEAD)
pickedtarget = target
- var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
C.moving = 3
C.moving_dir = pick_n_take(cardinal_copy)
sleep(10)
@@ -280,10 +280,10 @@ Difficulty: Hard
else
INVOKE_ASYNC(src, .proc/diagonal_blasts, target)
else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some!
- var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
chaser_cooldown = world.time + initial(chaser_cooldown)
if((prob(anger_modifier) || target.Adjacent(src)) && target != src)
- var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
OC.moving = 4
OC.moving_dir = pick(GLOB.cardinal - C.moving_dir)
else //just release a burst of power
@@ -293,10 +293,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.diagonals)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -304,10 +304,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -315,10 +315,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.alldirs)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -327,7 +327,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to range)
- new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(J, src, FALSE)
previousturf = J
J = get_step(previousturf, set_dir)
@@ -342,8 +342,8 @@ Difficulty: Hard
INVOKE_ASYNC(src, .proc/arena_squares, T, d)
for(var/t in RANGE_TURFS(11, T))
if(t && get_dist(t, T) == 11)
- new /obj/effect/overlay/temp/hierophant/wall(t)
- new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/wall(t)
+ new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
INVOKE_ASYNC(src, .proc/blink, T)
@@ -351,7 +351,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to 10)
- var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(J)
+ var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(J)
HS.dir = set_dir
previousturf = J
J = get_step(previousturf, set_dir)
@@ -362,19 +362,19 @@ Difficulty: Hard
return
var/turf/T = get_turf(victim)
var/turf/source = get_turf(src)
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
- new /obj/effect/overlay/temp/hierophant/telegraph(source, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
blinking = TRUE
sleep(2) //short delay before we start...
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
sleep(1)
@@ -396,11 +396,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
- new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
@@ -413,7 +413,7 @@ Difficulty: Hard
if(dist > last_dist)
last_dist = dist
sleep(1 + min(burst_range - last_dist, 12) * 0.5) //gets faster as it gets further out
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
@@ -421,29 +421,29 @@ Difficulty: Hard
blink(A)
//Hierophant overlays
-/obj/effect/overlay/temp/hierophant
+/obj/effect/temp_visual/hierophant
name = "vortex energy"
layer = BELOW_MOB_LAYER
var/mob/living/caster //who made this, anyway
-/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/Initialize(mapload, new_caster)
. = ..()
if(new_caster)
caster = new_caster
-/obj/effect/overlay/temp/hierophant/squares
+/obj/effect/temp_visual/hierophant/squares
icon_state = "hierophant_squares"
duration = 3
light_range = 1
randomdir = FALSE
-/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/squares/Initialize(mapload, new_caster)
. = ..()
if(ismineralturf(loc))
var/turf/closed/mineral/M = loc
M.gets_drilled(caster)
-/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
+/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
name = "vortex wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
icon_state = "wall"
@@ -451,21 +451,21 @@ Difficulty: Hard
duration = 100
smooth = SMOOTH_TRUE
-/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster)
. = ..()
queue_smooth_neighbors(src)
queue_smooth(src)
-/obj/effect/overlay/temp/hierophant/wall/Destroy()
+/obj/effect/temp_visual/hierophant/wall/Destroy()
queue_smooth_neighbors(src)
return ..()
-/obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
+/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
if(mover == caster)
return TRUE
return FALSE
-/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
+/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
duration = 98
var/mob/living/target //what it's following
var/turf/targetturf //what turf the target is actually on
@@ -479,9 +479,9 @@ Difficulty: Hard
var/currently_seeking = FALSE
var/friendly_fire_check = FALSE //if blasts produced apply friendly fire
var/monster_damage_boost = TRUE
- var/damage = 10
+ var/damage = 10
-/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
+/obj/effect/temp_visual/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
. = ..()
target = new_target
friendly_fire_check = is_friendly_fire
@@ -489,14 +489,14 @@ Difficulty: Hard
speed = new_speed
addtimer(CALLBACK(src, .proc/seek_target), 1)
-/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir()
+/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir()
. = get_cardinal_dir(src, targetturf)
if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate
var/list/cardinal_copy = GLOB.cardinal.Copy()
cardinal_copy -= more_previouser_moving_dir
. = pick(cardinal_copy)
-/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target()
+/obj/effect/temp_visual/hierophant/chaser/proc/seek_target()
if(!currently_seeking)
currently_seeking = TRUE
targetturf = get_turf(target)
@@ -523,33 +523,34 @@ Difficulty: Hard
moving--
sleep(speed)
targetturf = get_turf(target)
-/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
- var/obj/effect/overlay/temp/hierophant/blast/B = new(loc, caster, friendly_fire_check)
+
+/obj/effect/temp_visual/hierophant/chaser/proc/make_blast()
+ var/obj/effect/temp_visual/hierophant/blast/B = new(loc, caster, friendly_fire_check)
B.damage = damage
B.monster_damage_boost = monster_damage_boost
-/obj/effect/overlay/temp/hierophant/telegraph
+/obj/effect/temp_visual/hierophant/telegraph
icon = 'icons/effects/96x96.dmi'
icon_state = "hierophant_telegraph"
pixel_x = -32
pixel_y = -32
duration = 3
-/obj/effect/overlay/temp/hierophant/telegraph/diagonal
+/obj/effect/temp_visual/hierophant/telegraph/diagonal
icon_state = "hierophant_telegraph_diagonal"
-/obj/effect/overlay/temp/hierophant/telegraph/cardinal
+/obj/effect/temp_visual/hierophant/telegraph/cardinal
icon_state = "hierophant_telegraph_cardinal"
-/obj/effect/overlay/temp/hierophant/telegraph/teleport
+/obj/effect/temp_visual/hierophant/telegraph/teleport
icon_state = "hierophant_telegraph_teleport"
duration = 9
-/obj/effect/overlay/temp/hierophant/telegraph/edge
+/obj/effect/temp_visual/hierophant/telegraph/edge
icon_state = "hierophant_telegraph_edge"
duration = 40
-/obj/effect/overlay/temp/hierophant/blast
+/obj/effect/temp_visual/hierophant/blast
icon_state = "hierophant_blast"
name = "vortex blast"
light_range = 1
@@ -561,7 +562,7 @@ Difficulty: Hard
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
-/obj/effect/overlay/temp/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
+/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
. = ..()
friendly_fire_check = friendly_fire
if(new_caster)
@@ -571,7 +572,7 @@ Difficulty: Hard
M.gets_drilled(caster)
INVOKE_ASYNC(src, .proc/blast)
-/obj/effect/overlay/temp/hierophant/blast/proc/blast()
+/obj/effect/temp_visual/hierophant/blast/proc/blast()
var/turf/T = get_turf(src)
if(!T)
return
@@ -582,12 +583,12 @@ Difficulty: Hard
sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
bursting = FALSE //we no longer damage crossers
-/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM)
+/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM)
..()
if(bursting)
do_damage(get_turf(src))
-/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T)
+/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
hit_things += L
if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD)
@@ -634,7 +635,7 @@ Difficulty: Hard
INVOKE_ASYNC(H, /obj/item/weapon/hierophant_club.proc/prepare_icon_update)
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user)
to_chat(user, "You collect [src], reattaching it to the club!")
H.beacon = null
user.update_action_buttons_icon()
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 0a0ff6bdd3..9b8e037d61 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -8,7 +8,7 @@
maxHealth = 1000
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
- environment_smash = 3
+ environment_smash = ENVIRONMENT_SMASH_RWALLS
obj_damage = 400
light_range = 3
faction = list("mining", "boss")
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 16df9e4c7a..da45e31d1e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -203,7 +203,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
if(..())
emote_see = list("aims menacingly")
obj_damage = 0
- environment_smash = 0 //needed? seems weird for them to do so
+ environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
minimum_distance = 6
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 a68ccc4884..e3e4e37396 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -4,7 +4,7 @@
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
maxbodytemp = INFINITY
response_help = "pokes"
@@ -215,7 +215,7 @@
ranged_cooldown = 0
ranged_cooldown_time = 20
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
retreat_distance = 3
minimum_distance = 3
pass_flags = PASSTABLE
@@ -334,7 +334,7 @@
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "falls right through the strange body of the"
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
pass_flags = PASSTABLE
del_on_death = 1
@@ -595,7 +595,7 @@
aggro_vision_range = 9
idle_vision_range = 5
mob_size = MOB_SIZE_SMALL
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
var/wumbo = 0
var/inflate_cooldown = 0
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
@@ -640,7 +640,7 @@
minimum_distance = 1
move_to_delay = 6
transform *= 2
- environment_smash = 2
+ environment_smash = ENVIRONMENT_SMASH_WALLS
mob_size = MOB_SIZE_LARGE
speed = 1
addtimer(CALLBACK(src, .proc/Deflate), 100)
@@ -660,7 +660,7 @@
move_to_delay = 2
transform /= 2
inflate_cooldown = 4
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
mob_size = MOB_SIZE_SMALL
speed = 0
@@ -800,11 +800,12 @@
del_on_death = 1
stat_attack = 1
robust_searching = 1
+ var/can_infest_dead = FALSE
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
if(isturf(loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
- if(H.stat == UNCONSCIOUS)
+ if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD))
infest(H)
..()
@@ -818,6 +819,58 @@
H.forceMove(L)
qdel(src)
+//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
+ stat_attack = 2
+ maxHealth = 120
+ health = 120
+ brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
+ icon_state = "dwarf_legion"
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
+ stat_attack = 2
+ can_infest_dead = TRUE
+
+//Legion that spawns Legions
+
+/mob/living/simple_animal/hostile/spawner/legion
+ name = "legion"
+ desc = "One of many."
+ icon = 'icons/mob/lavaland/dragon.dmi'
+ icon_state = "legion"
+ icon_living = "legion"
+ icon_dead = "legion"
+ health = 450
+ maxHealth = 450
+ max_mobs = 3
+ spawn_time = 200
+ spawn_text = "peels itself off from"
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ anchored = FALSE
+ AIStatus = AI_ON
+ stop_automated_movement = FALSE
+ wander = TRUE
+ maxbodytemp = INFINITY
+ layer = MOB_LAYER
+ del_on_death = TRUE
+ sentience_type = SENTIENCE_BOSS
+ loot = list(/obj/item/organ/hivelord_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged = 5)
+ move_to_delay = 14
+ vision_range = 5
+ aggro_vision_range = 9
+ idle_vision_range = 5
+ speed = 3
+ faction = list("mining")
+ weather_immunities = list("lava","ash")
+ obj_damage = 30
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
+ see_in_dark = 8
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+
+//Organ
+
/obj/item/organ/hivelord_core/legion
name = "legion's soul"
desc = "A strange rock that still crackles with power... its \
@@ -871,7 +924,7 @@
speak_chance = 1
turns_per_move = 8
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
move_to_delay = 15
response_help = "pets"
response_disarm = "gently pushes aside"
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index d82a332027..125f96384b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -20,7 +20,7 @@
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("mushroom")
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
stat_attack = 2
mouse_opacity = 1
speed = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 3eb8e85c93..57d016ae68 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -22,7 +22,7 @@
faction = list("hostile")
attack_sound = 'sound/weapons/bite.ogg'
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
movement_type = FLYING
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index f0029af0d3..fb365aeb87 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -23,7 +23,7 @@
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 1
loot = list(/obj/effect/mob_spawn/human/clown/corpse)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
index 4a8c99a111..563c5a3d03 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -20,6 +20,6 @@
attacktext = "hits"
attack_sound = 'sound/weapons/punch1.ogg'
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 3f4267e164..15dfd7ad9d 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -14,7 +14,7 @@
speed = 0
stat_attack = 1
robust_searching = 1
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
maxHealth = 100
health = 100
harm_intent_damage = 5
@@ -52,7 +52,7 @@
/mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned)
..()
- new /obj/effect/overlay/temp/paper_scatter(src)
+ new /obj/effect/temp_visual/paper_scatter(src)
summoned_by_wizard = wizard_summoned
/mob/living/simple_animal/hostile/stickman/death()
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 20724fe179..b7b8b5aa85 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -131,7 +131,7 @@
minimum_distance = 10
retreat_distance = 10
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
..()
@@ -150,7 +150,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
attacktext = "cuts"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("syndicate")
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 831058a284..31aa1ea589 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -51,7 +51,7 @@
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
- var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
+ var/environment_smash = ENVIRONMENT_SMASH_NONE //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
@@ -249,7 +249,7 @@
/mob/living/simple_animal/gib_animation()
if(icon_gib)
- new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
+ new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib)
/mob/living/simple_animal/say_mod(input, message_mode)
if(speak_emote && speak_emote.len)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c6680a28f0..b890208d2b 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -293,14 +293,14 @@
if(!src || !isturf(src.loc) || !(A in view(src.loc)))
return 0
- if(istype(A, /obj/effect/overlay/temp/point))
+ if(istype(A, /obj/effect/temp_visual/point))
return 0
var/tile = get_turf(A)
if (!tile)
return 0
- new /obj/effect/overlay/temp/point(A,invisibility)
+ new /obj/effect/temp_visual/point(A,invisibility)
return 1
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index f9d1f59717..e85dca9cad 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -242,12 +242,12 @@
L.loc = locate(locx,locy,mobloc.z)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
- new /obj/effect/overlay/temp/dir_setting/ninja/shadow(T, L.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
limit--
if(limit<=0)
break
else
- new /obj/effect/overlay/temp/dir_setting/ninja/shadow(mobloc, L.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.loc = get_step(L, direct)
L.setDir(direct)
if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
@@ -295,8 +295,12 @@
return A
else
var/atom/movable/AM = A
- if(AM == buckled) //Kind of unnecessary but let's just be sure
+ if(AM == buckled)
continue
+ if(ismob(AM))
+ var/mob/M = AM
+ if(M.buckled)
+ continue
if(!AM.CanPass(src) || AM.density)
if(AM.anchored)
return AM
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 9e5e86836b..58db8cb848 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -36,7 +36,7 @@
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
- new /obj/effect/overlay/temp/monkeyify(loc)
+ new /obj/effect/temp_visual/monkeyify(loc)
sleep(22)
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
@@ -186,7 +186,7 @@
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
- new /obj/effect/overlay/temp/monkeyify/humanify(loc)
+ new /obj/effect/temp_visual/monkeyify/humanify(loc)
sleep(22)
var/mob/living/carbon/human/O = new( loc )
for(var/obj/item/C in O.loc)
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 1f5fdc6ea0..619ae359d3 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -72,7 +72,7 @@ It is possible to destroy the net by the occupant or someone else.
M.dropItemToGround(W)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(M), M.dir)
visible_message("[M] suddenly vanishes!")
M.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility.
@@ -86,7 +86,7 @@ It is possible to destroy the net by the occupant or someone else.
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(M), M.dir)
qdel(src)
else//And they are free.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
index 42f1af6c0e..74dcec12ce 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
@@ -27,7 +27,7 @@ Contents:
if(destination && isturf(mobloc))//So we don't teleport out of containers
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(destination, H)
H.loc = destination
@@ -35,7 +35,7 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
@@ -55,7 +55,7 @@ Contents:
var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
if(!T.density && isturf(mobloc))
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(T, H)
H.forceMove(T)
@@ -63,7 +63,7 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 0dc080bd19..976e48707b 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -44,8 +44,8 @@
..()
-/obj/item/weapon/paper/New()
- ..()
+/obj/item/weapon/paper/Initialize()
+ . = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
update_icon()
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index cf7c28d2ba..0818c7c32f 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -110,7 +110,7 @@
papers.Add(P)
total_paper++
update_icon()
- else if(istype(I, /obj/item/weapon/pen))
+ else if(istype(I, /obj/item/weapon/pen) && !bin_pen)
var/obj/item/weapon/pen/P = I
if(!user.transferItemToLoc(P, src))
return
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 7f4777e300..866041d883 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -53,8 +53,8 @@
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure."
icon = 'icons/obj/supermatter.dmi'
icon_state = "darkmatter_shard"
- density = 1
- anchored = 0
+ density = TRUE
+ anchored = FALSE
light_range = 4
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
@@ -74,7 +74,7 @@
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
var/explosion_point = 900
- var/emergency_issued = 0
+ var/emergency_issued = FALSE
var/explosion_power = 12
var/temp_factor = 30
@@ -116,12 +116,12 @@
var/common_channel = null
//for logging
- var/has_been_powered = 0
- var/has_reached_emergency = 0
+ var/has_been_powered = FALSE
+ var/has_reached_emergency = FALSE
// For making hugbox supermatter
- var/takes_damage = 1
- var/produces_gas = 1
+ var/takes_damage = TRUE
+ var/produces_gas = TRUE
var/obj/effect/countdown/supermatter/countdown
/obj/machinery/power/supermatter_shard/make_frozen_visual()
@@ -385,7 +385,7 @@
/obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj)
var/turf/L = loc
if(!istype(L)) // We don't run process() when we are in space
- return 0 // This stops people from being able to really power up the supermatter
+ return FALSE // This stops people from being able to really power up the supermatter
// Then bring it inside to explode instantly upon landing on a valid turf.
if(!istype(Proj.firer, /obj/machinery/power/emitter))
investigate_log("has been hit by [Proj] fired by [Proj.firer]", "supermatter")
@@ -394,10 +394,10 @@
if(!has_been_powered)
investigate_log("has been powered for the first time.", "supermatter")
message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
- has_been_powered = 1
+ has_been_powered = TRUE
else if(takes_damage)
damage += Proj.damage * config_bullet_energy
- return 0
+ return FALSE
/obj/machinery/power/supermatter_shard/singularity_act()
var/gain = 100
@@ -409,7 +409,7 @@
M << 'sound/effects/supermatter.ogg' //everyone goan know bout this
to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...")
qdel(src)
- return(gain)
+ return gain
/obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B)
if(B && !isspaceturf(loc)) //does nothing in space
@@ -450,7 +450,7 @@
user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their()] body starts to glow and bursts into flames before flashing into ash.",\
"You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\
"You hear an unearthly noise as a wave of heat washes over you.")
-
+ investigate_log("has been attacked (hand) by [user]", "supermatter")
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
Consume(user)
@@ -464,11 +464,11 @@
if(!istype(W) || (W.flags & ABSTRACT) || !istype(user))
return
if(user.drop_item(W))
- Consume(W)
user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\
"You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\
"Everything suddenly goes silent.")
-
+ investigate_log("has been attacked ([W]) by [user]", "supermatter")
+ Consume(W)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
radiation_pulse(get_turf(src), 1, 1, 150, 1)
@@ -517,15 +517,15 @@
// When you wanna make a supermatter shard for the dramatic effect, but
// don't want it exploding suddenly
/obj/machinery/power/supermatter_shard/hugbox
- takes_damage = 0
- produces_gas = 0
+ takes_damage = FALSE
+ produces_gas = FALSE
/obj/machinery/power/supermatter_shard/crystal
name = "supermatter crystal"
desc = "A strangely translucent and iridescent crystal."
base_icon_state = "darkmatter"
icon_state = "darkmatter"
- anchored = 1
+ anchored = TRUE
gasefficency = 0.15
explosion_power = 35
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index f873ef6083..18eb546b6c 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -16,7 +16,7 @@
var/randomspread = 0 //Randomspread for automatics
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
- var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
+ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
/obj/item/ammo_casing/New()
diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless.dm
index 9ba066ef95..0480476a74 100644
--- a/code/modules/projectiles/ammunition/caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless.dm
@@ -45,7 +45,7 @@
icon_state = "s-casing-live"
projectile_type = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/caseless/laser/gatling
projectile_type = /obj/item/projectile/beam/weak
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index ba4770ebba..7da945a5b8 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -6,7 +6,7 @@
var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/Laser.ogg'
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/energy/chameleon
projectile_type = /obj/item/projectile/energy/chameleon
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index 16ec87e043..bd57d7c07a 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -2,7 +2,7 @@
name = "magic casing"
desc = "I didn't even know magic needed ammo..."
projectile_type = /obj/item/projectile/magic
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/magic
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
/obj/item/ammo_casing/magic/change
projectile_type = /obj/item/projectile/magic/change
@@ -89,4 +89,4 @@
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 20
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index 11112ec974..8733cd2e1e 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -13,6 +13,21 @@
max_ammo = 8
multiple_sprites = 2
+/obj/item/ammo_box/magazine/m10mm/rifle
+ name = "rifle magazine (10mm)"
+ desc = "A well-worn magazine fitted for the surplus rifle."
+ icon_state = "75-8"
+ origin_tech = "combat=2"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
+ if(ammo_count())
+ icon_state = "75-8"
+ else
+ icon_state = "75-0"
+
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
desc = "A gun magazine. Loaded with rounds which ignite the target."
@@ -52,16 +67,31 @@
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
+ icon_state = "46x30mmtA-20"
ammo_type = /obj/item/ammo_casing/c46x30mmap
+/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
+ ..()
+ icon_state = "46x30mmtA-[round(ammo_count(),4)]"
+
/obj/item/ammo_box/magazine/wt550m9/wttx
name = "wt550 magazine (Toxin Tipped 4.6x30mm)"
+ icon_state = "46x30mmtT-20"
ammo_type = /obj/item/ammo_casing/c46x30mmtox
+/obj/item/ammo_box/magazine/wt550m9/wttx/update_icon()
+ ..()
+ icon_state = "46x30mmtT-[round(ammo_count(),4)]"
+
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incindiary 4.6x30mm)"
+ icon_state = "46x30mmtI-20"
ammo_type = /obj/item/ammo_casing/c46x30mminc
+/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
+ ..()
+ icon_state = "46x30mmtI-[round(ammo_count(),4)]"
+
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
icon_state = "uzi9mm-32"
diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm
index 3e7112ffed..9476d728a6 100644
--- a/code/modules/projectiles/boxes_magazines/internal_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/internal_mag.dm
@@ -109,6 +109,11 @@
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
max_ammo = 6
+/obj/item/ammo_box/magazine/internal/shot/com/compact
+ name = "compact combat shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ max_ammo = 4
+
/obj/item/ammo_box/magazine/internal/shot/dual
name = "double-barrel shotgun internal magazine"
max_ammo = 2
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 1ffdaf0d29..0235bbe84d 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -375,8 +375,29 @@
pin = /obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=7;syndicate=6"
+// Old Semi-Auto Rifle //
+/obj/item/weapon/gun/ballistic/automatic/surplus
+ name = "Surplus Rifle"
+ desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing."
+ origin_tech = "combat=3;materials=2"
+ icon_state = "surplus"
+ item_state = "moistnugget"
+ weapon_weight = WEAPON_HEAVY
+ mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
+ fire_delay = 30
+ burst_size = 1
+ can_unsuppress = 1
+ can_suppress = 1
+ w_class = WEIGHT_CLASS_HUGE
+ slot_flags = SLOT_BACK
+ actions_types = list()
+/obj/item/weapon/gun/ballistic/automatic/surplus/update_icon()
+ if(magazine)
+ icon_state = "surplus"
+ else
+ icon_state = "surplus-e"
// Laser rifle (rechargeable magazine) //
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 6ce52748ec..ac3c56b88a 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -344,6 +344,15 @@
slung = 0
update_icon()
+/obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
+ name = "sawn-off improvised shotgun"
+ desc = "A single-shot shotgun, better not miss"
+ icon_state = "ishotgun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ sawn_state = SAWN_OFF
+ slot_flags = SLOT_BELT
+
/obj/item/weapon/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
clumsy_check = 0
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7195afd146..5f376370d4 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -192,6 +192,14 @@
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
+/obj/item/weapon/gun/ballistic/shotgun/automatic/combat/compact
+ name = "compact combat shotgun"
+ desc = "A compact version of the semi automatic combat shotgun. For close encounters."
+ icon_state = "cshotgunc"
+ origin_tech = "combat=4;materials=2"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
+ w_class = WEIGHT_CLASS_BULKY
+
//Dual Feed Shotgun
/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 0a886a76d1..0f108fcc76 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -198,7 +198,7 @@
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
- var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
+ var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules)
if(QDELETED(M)) //whoever shot this was very, very unfortunate.
@@ -358,7 +358,7 @@
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
if(stats_stolen)
return
- new /obj/effect/overlay/temp/explosion/fast(target_turf)
+ new /obj/effect/temp_visual/explosion/fast(target_turf)
if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
if(ismineralturf(T))
@@ -370,7 +370,6 @@
L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
to_chat(L, "You're struck by a [K.name]!")
-
/obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion"
desc = "Causes the kinetic accelerator to destroy rock in an AoE."
@@ -392,11 +391,11 @@
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
- desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
+ desc = "A syndicate modification kit that increases the damage a kinetic accelerator does in a high pressure environment."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 2
- cost = 40
+ cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index b938e399df..b3e55f2423 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -5,7 +5,7 @@
item_state = null
w_class = WEIGHT_CLASS_BULKY
force = 10
- modifystate = TRUE
+ modifystate = TRUE
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
@@ -40,7 +40,7 @@
w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
icon_state = "pulse_carbine"
- item_state = null
+ item_state = null
cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine"
can_flashlight = 1
flight_x_offset = 18
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index 32646ee1e8..37d576a8ff 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -113,7 +113,7 @@
/obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
- new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
target.adjustBruteLoss(-4)
target.adjustFireLoss(-4)
return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3dedaa9ae1..3dbadc85c5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -90,9 +90,9 @@
if(starting)
splatter_dir = get_dir(starting, target_loca)
if(isalien(L))
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
if(prob(33))
L.add_splatter_floor(target_loca)
else if(impact_effect_type)
@@ -224,7 +224,7 @@
pixel_y_offset += 32
old_pixel_y += 32
new_y--
-
+
pixel_x = old_pixel_x
pixel_y = old_pixel_y
step_towards(src, locate(new_x, new_y, z))
@@ -237,7 +237,7 @@
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
old_pixel_x = pixel_x_offset
old_pixel_y = pixel_y_offset
-
+
if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 6dbd01d372..766d8b5e39 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -9,7 +9,7 @@
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
flag = "laser"
eyeblur = 2
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/laser
@@ -25,7 +25,7 @@
var/mob/living/carbon/M = target
M.IgniteMob()
else if(isturf(target))
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser/wall
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall
/obj/item/projectile/beam/weak
damage = 15
@@ -48,7 +48,7 @@
irradiate = 30
range = 15
forcedodge = 1
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/disabler
@@ -59,14 +59,14 @@
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
@@ -94,7 +94,7 @@
damage = 30
legacy = 1
animate_movement = SLIDE_STEPS
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/singularity_pull()
@@ -108,7 +108,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
@@ -122,7 +122,7 @@
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/lasertag/bluetag
@@ -134,17 +134,17 @@
icon_state = "purple_laser"
damage = 200
damage_type = BURN
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
light_color = LIGHT_COLOR_PURPLE
/obj/item/projectile/beam/instakill/blue
icon_state = "blue_laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/instakill/red
icon_state = "red_laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/instakill/on_hit(atom/target)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index cceb77bee1..73355cd326 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -6,7 +6,7 @@
nodamage = 0
flag = "bullet"
hitsound_wall = "ricochet"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect
+ impact_effect_type = /obj/effect/temp_visual/impact_effect
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
@@ -190,7 +190,7 @@
name = "dart"
icon_state = "cbbolt"
damage = 6
- var/piercing = FALSE
+ var/piercing = FALSE
/obj/item/projectile/bullet/dart/New()
..()
@@ -201,15 +201,15 @@
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100) // not completely blocked
- if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ if(M.can_inject(null, FALSE, def_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)
- return TRUE
+ return TRUE
else
blocked = 100
- target.visible_message("\The [src] was deflected!", \
- "You were protected against \the [src]!")
+ target.visible_message("\The [src] was deflected!", \
+ "You were protected against \the [src]!")
..(target, blocked)
reagents.set_reacting(TRUE)
@@ -240,28 +240,28 @@
nodamage = 1
. = ..() // Execute the rest of the code.
-/obj/item/projectile/bullet/dnainjector
- name = "\improper DNA injector"
- icon_state = "syringeproj"
- var/obj/item/weapon/dnainjector/injector
-
-/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(blocked != 100)
- if(M.can_inject(null, FALSE, def_zone, FALSE))
- if(injector.inject(M, firer))
- QDEL_NULL(injector)
- return TRUE
- else
- blocked = 100
- target.visible_message("\The [src] was deflected!", \
- "You were protected against \the [src]!")
- return ..()
-
-/obj/item/projectile/bullet/dnainjector/Destroy()
- QDEL_NULL(injector)
- return ..()
+/obj/item/projectile/bullet/dnainjector
+ name = "\improper DNA injector"
+ icon_state = "syringeproj"
+ var/obj/item/weapon/dnainjector/injector
+
+/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(blocked != 100)
+ if(M.can_inject(null, FALSE, def_zone, FALSE))
+ if(injector.inject(M, firer))
+ QDEL_NULL(injector)
+ return TRUE
+ else
+ blocked = 100
+ target.visible_message("\The [src] was deflected!", \
+ "You were protected against \the [src]!")
+ return ..()
+
+/obj/item/projectile/bullet/dnainjector/Destroy()
+ QDEL_NULL(injector)
+ return ..()
//// SNIPER BULLETS
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index cfa7727186..f82fcca3e3 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -135,7 +135,7 @@
damage = 20
damage_type = CLONE
irradiate = 10
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/dart //ninja throwing dart
name = "dart"
@@ -164,7 +164,7 @@
/obj/item/projectile/energy/tesla
name = "tesla bolt"
icon_state = "tesla_projectile"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
var/chain
/obj/item/projectile/energy/tesla/fire(setAngle)
diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm
index 50d96cc7b9..b5d8958f64 100644
--- a/code/modules/projectiles/projectile/plasma.dm
+++ b/code/modules/projectiles/projectile/plasma.dm
@@ -7,7 +7,6 @@ obj/item/projectile/energy/plasmabolt
damage_type = BURN
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
light_range = 3
light_color = LIGHT_COLOR_GREEN
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index f5df46cb7b..57b339178f 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -5,7 +5,7 @@
damage_type = BURN
nodamage = 1
flag = "energy"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/ion
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
/obj/item/projectile/ion/on_hit(atom/target, blocked = 0)
@@ -202,7 +202,8 @@
damage = 5
range = 3.5 //works as 4, but doubles to 7
dismemberment = 20
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
+ var/mine_range = 3 //mines this many additional tiles
/obj/item/projectile/plasma/Initialize()
. = ..()
@@ -215,24 +216,27 @@
if(pressure < 60)
name = "full strength [name]"
damage *= 4
- range *= 2
/obj/item/projectile/plasma/on_hit(atom/target)
. = ..()
if(ismineralturf(target))
var/turf/closed/mineral/M = target
M.gets_drilled(firer)
- Range()
+ if(mine_range)
+ mine_range--
+ range++
if(range > 0)
return -1
/obj/item/projectile/plasma/adv
damage = 7
range = 5
+ mine_range = 5
/obj/item/projectile/plasma/adv/mech
damage = 10
- range = 6
+ range = 9
+ mine_range = 3
/obj/item/projectile/plasma/turret
//Between normal and advanced for damage, made a beam so not the turret does not destroy glass
@@ -270,7 +274,7 @@
A.throw_at(throwtarget,power+1,1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
- new /obj/effect/overlay/temp/gravpush(F)
+ new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravityattract
name = "attraction bolt"
@@ -300,7 +304,7 @@
A.throw_at(T, power+1, 1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
- new /obj/effect/overlay/temp/gravpush(F)
+ new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravitychaos
name = "gravitational blast"
@@ -330,5 +334,5 @@
A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinal)), power+1, 1)
thrown_items[A] = A
for(var/turf/Z in range(T,power))
- new /obj/effect/overlay/temp/gravpush(Z)
+ new /obj/effect/temp_visual/gravpush(Z)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 2c8ef5e065..55a59bed61 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -453,14 +453,14 @@
/datum/reagents/proc/check_ignoreslow(mob/M)
if(istype(M, /mob))
- if(M.reagents.has_reagent("morphine")||M.reagents.has_reagent("ephedrine"))
+ if(M.reagents.has_reagent("morphine"))
return 1
else
M.status_flags &= ~IGNORESLOWDOWN
/datum/reagents/proc/check_gofast(mob/M)
if(istype(M, /mob))
- if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants"))
+ if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants")||M.reagents.has_reagent("ephedrine"))
return 1
else
M.status_flags &= ~GOTTAGOFAST
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 5a73c5dcf4..481704ac41 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -1,285 +1,183 @@
/obj/machinery/computer/pandemic
name = "PanD.E.M.I.C 2200"
desc = "Used to work with viruses."
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
circuit = /obj/item/weapon/circuitboard/computer/pandemic
- use_power = 1
+ use_power = TRUE
idle_power_usage = 20
resistance_flags = ACID_PROOF
- var/temp_html = ""
- var/wait = null
- var/obj/item/weapon/reagent_containers/beaker = null
+ var/wait
+ var/obj/item/weapon/reagent_containers/beaker
/obj/machinery/computer/pandemic/Initialize()
. = ..()
update_icon()
-/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index)
- if(beaker && beaker.reagents)
- if(beaker.reagents.reagent_list.len)
- var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list
- if(BL)
- if(BL.data && BL.data["viruses"])
- var/list/viruses = BL.data["viruses"]
- return viruses[index]
- return null
+/obj/machinery/computer/pandemic/Destroy()
+ QDEL_NULL(beaker)
+ return ..()
-/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index)
- if(beaker && beaker.reagents)
- if(beaker.reagents.reagent_list.len)
- var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list
- if(BL)
- if(BL.data && BL.data["resistances"])
- var/list/resistances = BL.data["resistances"]
- return resistances[index]
- return null
+/obj/machinery/computer/pandemic/proc/get_by_index(thing, index)
+ if(!beaker || !beaker.reagents)
+ return
+ var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list
+ if(B && B.data[thing])
+ return B.data[thing][index]
-/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index)
- var/datum/disease/D = GetVirusByIndex(index)
+/obj/machinery/computer/pandemic/proc/get_virus_id_by_index(index)
+ var/datum/disease/D = get_by_index("viruses", index)
if(D)
return D.GetDiseaseID()
- return null
-/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime)
- wait = 1
+/obj/machinery/computer/pandemic/proc/get_viruses_data(datum/reagent/blood/B)
+ . = list()
+ if(!islist(B.data["viruses"]))
+ return
+ var/list/V = B.data["viruses"]
+ var/index = 1
+ for(var/virus in V)
+ var/datum/disease/D = virus
+ if(!istype(D) || D.visibility_flags & HIDDEN_PANDEMIC)
+ continue
+
+ var/list/this = list()
+ this["name"] = D.name
+ if(istype(D, /datum/disease/advance))
+ var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()]
+ if(A.name == "Unknown")
+ this["can_rename"] = TRUE
+ this["name"] = A.name
+ this["is_adv"] = TRUE
+ this["resistance"] = A.totalResistance()
+ this["stealth"] = A.totalStealth()
+ this["stage_speed"] = A.totalStageSpeed()
+ this["transmission"] = A.totalTransmittable()
+ this["symptoms"] = list()
+ for(var/symptom in A.symptoms)
+ var/datum/symptom/S = symptom
+ var/list/this_symptom = list()
+ this_symptom["name"] = S.name
+ this["symptoms"] += list(this_symptom)
+ this["index"] = index++
+ this["agent"] = D.agent
+ this["description"] = D.desc || "none"
+ this["spread"] = D.spread_text || "none"
+ this["cure"] = D.cure_text || "none"
+
+ . += list(this)
+
+/obj/machinery/computer/pandemic/proc/get_resistance_data(datum/reagent/blood/B)
+ . = list()
+ if(!islist(B.data["resistances"]))
+ return
+ var/list/resistances = B.data["resistances"]
+ for(var/id in resistances)
+ var/list/this = list()
+ var/datum/disease/D = SSdisease.archive_diseases[id]
+ if(D)
+ this["id"] = id
+ this["name"] = D.name
+ . += list(this)
+
+/obj/machinery/computer/pandemic/proc/reset_replicator_cooldown()
+ wait = FALSE
update_icon()
- spawn(waittime)
- wait = null
- update_icon()
- playsound(src.loc, 'sound/machines/ping.ogg', 30, 1)
+ playsound(loc, 'sound/machines/ping.ogg', 30, 1)
/obj/machinery/computer/pandemic/update_icon()
if(stat & BROKEN)
icon_state = (beaker ? "mixer1_b" : "mixer0_b")
return
- icon_state = "mixer[(beaker)?"1":"0"][(powered()) ? "" : "_nopower"]"
-
+ icon_state = "mixer[(beaker) ? "1" : "0"][powered() ? "" : "_nopower"]"
if(wait)
cut_overlays()
else
add_overlay("waitlight")
-/obj/machinery/computer/pandemic/Topic(href, href_list)
+/obj/machinery/computer/pandemic/proc/eject_beaker()
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ update_icon()
+
+/obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "pandemic", name, 575, 500, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/pandemic/ui_data(mob/user)
+ var/list/data = list()
+ data["is_ready"] = !wait
+ if(beaker)
+ data["has_beaker"] = TRUE
+ if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list)
+ data["beaker_empty"] = TRUE
+ var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list
+ if(B)
+ data["has_blood"] = TRUE
+ data["blood"] = list()
+ data["blood"]["dna"] = B.data["blood_DNA"] || "none"
+ data["blood"]["type"] = B.data["blood_type"] || "none"
+ data["viruses"] = get_viruses_data(B)
+ data["resistances"] = get_resistance_data(B)
+
+ return data
+
+/obj/machinery/computer/pandemic/ui_act(action, params)
if(..())
return
-
- usr.set_machine(src)
- if(!beaker) return
-
- if (href_list["create_vaccine"])
- if(!src.wait)
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- if(B)
- B.pixel_x = rand(-3, 3)
- B.pixel_y = rand(-3, 3)
- var/path = GetResistancesByIndex(text2num(href_list["create_vaccine"]))
- var/vaccine_type = path
- var/vaccine_name = "Unknown"
-
- if(!ispath(vaccine_type))
- if(SSdisease.archive_diseases[path])
- var/datum/disease/D = SSdisease.archive_diseases[path]
- if(D)
- vaccine_name = D.name
- vaccine_type = path
- else if(vaccine_type)
- var/datum/disease/D = new vaccine_type(0, null)
- if(D)
- vaccine_name = D.name
-
- if(vaccine_type)
-
- B.name = "[vaccine_name] vaccine bottle"
- B.reagents.add_reagent("vaccine", 15, list(vaccine_type))
- replicator_cooldown(200)
- else
- temp_html = "The replicator is not ready yet."
- updateUsrDialog()
- return
- else if (href_list["create_virus_culture"])
- if(!wait)
- var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting
- var/datum/disease/D = null
- if(!ispath(type))
- D = GetVirusByIndex(text2num(href_list["create_virus_culture"]))
- var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()]
- if(A)
- D = new A.type(0, A)
- else if(type)
- if(type in SSdisease.diseases) // Make sure this is a disease
- D = new type(0, null)
- if(!D)
- return
- var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN)
- if(name == null || wait)
- return
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- B.icon_state = "bottle3"
- B.pixel_x = rand(-3, 3)
- B.pixel_y = rand(-3, 3)
- replicator_cooldown(50)
- var/list/data = list("viruses"=list(D))
- B.name = "[name] culture bottle"
- B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
- B.reagents.add_reagent("blood",20,data)
- updateUsrDialog()
- else
- temp_html = "The replicator is not ready yet."
- updateUsrDialog()
- return
- else if (href_list["empty_beaker"])
- beaker.reagents.clear_reagents()
- updateUsrDialog()
- return
- else if (href_list["eject"])
- beaker.forceMove(get_turf(loc))
- beaker = null
- icon_state = "mixer0"
- updateUsrDialog()
- return
- else if (href_list["emptyeject_beaker"])
- beaker.reagents.clear_reagents()
- beaker.forceMove(get_turf(loc))
- beaker = null
- icon_state = "mixer0"
- updateUsrDialog()
- return
- else if(href_list["clear"])
- temp_html = ""
- updateUsrDialog()
- return
- else if(href_list["name_disease"])
- var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN)
- if(!new_name)
- return
- if(..())
- return
- var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"]))
- if(SSdisease.archive_diseases[id])
+ switch(action)
+ if("eject_beaker")
+ eject_beaker()
+ . = TRUE
+ if("empty_beaker")
+ beaker.reagents.clear_reagents()
+ . = TRUE
+ if("empty_eject_beaker")
+ beaker.reagents.clear_reagents()
+ eject_beaker()
+ . = TRUE
+ if("rename_disease")
+ var/id = get_virus_id_by_index(text2num(params["index"]))
var/datum/disease/advance/A = SSdisease.archive_diseases[id]
- A.AssignName(new_name)
- for(var/datum/disease/advance/AD in SSdisease.processing)
- AD.Refresh()
- updateUsrDialog()
-
-
- else
- usr << browse(null, "window=pandemic")
- updateUsrDialog()
- return
-
- add_fingerprint(usr)
- return
-
-/obj/machinery/computer/pandemic/attack_hand(mob/user)
- if(..())
- return
- user.set_machine(src)
- var/dat = ""
- if(temp_html)
- dat = "[src.temp_html]
Main Menu"
- else if(!beaker)
- dat += "Please insert beaker.
"
- dat += "Close"
- else
- var/datum/reagents/R = beaker.reagents
- var/datum/reagent/blood/Blood = null
- for(var/datum/reagent/blood/B in R.reagent_list)
- if(B)
- Blood = B
- break
- if(!R.total_volume||!R.reagent_list.len)
- dat += "The beaker is empty
"
- else if(!Blood)
- dat += "No blood sample found in beaker."
- else if(!Blood.data)
- dat += "No blood data found in beaker."
- else
- dat += "Blood sample data:
"
- dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
"
- dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
"
-
-
- if(Blood.data["viruses"])
- var/list/vir = Blood.data["viruses"]
- if(vir.len)
- var/i = 0
- for(var/datum/disease/D in Blood.data["viruses"])
- i++
- if(!(D.visibility_flags & HIDDEN_PANDEMIC))
-
- if(istype(D, /datum/disease/advance))
-
- var/datum/disease/advance/A = D
- D = SSdisease.archive_diseases[A.GetDiseaseID()]
- if(D && D.name == "Unknown")
- dat += "Name Disease
"
-
- if(!D)
- CRASH("We weren't able to get the advance disease from the archive.")
-
- dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
"
- dat += "Common name: [(D.name||"none")]
"
- dat += "Description: [(D.desc||"none")]
"
- dat += "Spread: [(D.spread_text||"none")]
"
- dat += "Possible cure: [(D.cure_text||"none")]
"
- if(istype(D, /datum/disease/advance))
- var/datum/disease/advance/A = D
- dat += "Stealth: [(A.totalStealth())]
"
- dat += "Resistance: [(A.totalResistance())]
"
- dat += "Stage Speed: [(A.totalStageSpeed())]
"
- dat += "Transmission: [(A.totalTransmittable())]
"
- dat += "Symptoms: "
- var/english_symptoms = list()
- for(var/datum/symptom/S in A.symptoms)
- english_symptoms += S.name
- dat += english_list(english_symptoms)
-
- else
- dat += "No detectable virus in the sample."
- else
- dat += "No detectable virus in the sample."
-
- dat += "
Contains antibodies to: "
- if(Blood.data["resistances"])
- var/list/res = Blood.data["resistances"]
- if(res.len)
- dat += ""
- var/i = 0
- for(var/type in Blood.data["resistances"])
- i++
- var/disease_name = "Unknown"
-
- if(!ispath(type))
- var/datum/disease/advance/A = SSdisease.archive_diseases[type]
- if(A)
- disease_name = A.name
- else
- var/datum/disease/D = new type(0, null)
- disease_name = D.name
-
- dat += "- [disease_name] - Create vaccine bottle
"
- dat += "
"
- else
- dat += "nothing
"
- else
- dat += "nothing
"
- dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]"
- dat += "[((R.total_volume&&R.reagent_list.len) ? "-- Empty and Eject beaker":"")]
"
- dat += "Close"
-
- user << browse("[src.name]
[dat]", "window=pandemic;size=575x400")
- onclose(user, "pandemic")
- return
-
+ if(A)
+ var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN)
+ if(!new_name || ..())
+ return
+ A.AssignName(new_name)
+ for(var/datum/disease/advance/AD in SSdisease.processing)
+ AD.Refresh()
+ . = TRUE
+ if("create_culture_bottle")
+ var/id = get_virus_id_by_index(text2num(params["index"]))
+ var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id])
+ var/list/data = list("viruses" = list(A))
+ var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src))
+ B.name = "[A.name] culture bottle"
+ B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium."
+ B.reagents.add_reagent("blood", 20, data)
+ wait = TRUE
+ update_icon()
+ addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50)
+ . = TRUE
+ if("create_vaccine_bottle")
+ var/index = params["index"]
+ var/datum/disease/D = SSdisease.archive_diseases[index]
+ var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src))
+ B.name = "[D.name] vaccine bottle"
+ B.reagents.add_reagent("vaccine", 15, list(index))
+ wait = TRUE
+ update_icon()
+ addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200)
+ . = TRUE
/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers) && (I.container_type & OPENCONTAINER))
- . = 1 //no afterattack
+ . = TRUE //no afterattack
if(stat & (NOPOWER|BROKEN))
return
if(beaker)
@@ -288,15 +186,15 @@
if(!user.drop_item())
return
- beaker = I
- beaker.loc = src
+ beaker = I
+ beaker.forceMove(src)
to_chat(user, "You add the beaker to the machine.")
- updateUsrDialog()
- icon_state = "mixer1"
+ update_icon()
else
return ..()
/obj/machinery/computer/pandemic/on_deconstruction()
if(beaker)
- beaker.loc = get_turf(src)
- ..()
\ No newline at end of file
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 948da607f8..9b1117bcc5 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -298,7 +298,7 @@
var/initial_volume = reac_volume
reac_volume = ..()
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
- var/obj/effect/overlay/temp/explosion/fast/E = new /obj/effect/overlay/temp/explosion/fast(get_turf(M))
+ var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M))
E.alpha = 150
for(var/mob/living/L in orange(get_turf(M), 1))
if("blob" in L.faction) //no friendly fire
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index b30207eaf3..f3cc8b8620 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -160,6 +160,12 @@
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
+ else if(istype(O, /obj/item/stack/sheet/hairlesshide))
+ var/obj/item/stack/sheet/hairlesshide/HH = O
+ var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
+ WL.amount = HH.amount
+ qdel(HH)
+
/*
* Water reaction to a mob
*/
@@ -367,11 +373,15 @@
if(ishuman(M))
var/mob/living/carbon/human/N = M
- if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
+ N.hair_style = "Spiky"
+ N.facial_hair_style = "Shaved"
+ N.facial_hair_color = "000"
+ N.hair_color = "000"
+ if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem!
+ N.dna.species.species_traits += HAIR
+ if(N.dna.species.use_skintones)
N.skin_tone = "orange"
- N.hair_style = "Spiky"
- N.hair_color = "000"
- if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
+ else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
N.dna.features["mcolor"] = "f80"
N.regenerate_icons()
if(prob(7))
@@ -380,7 +390,7 @@
else
M.visible_message("[M] flexes [M.p_their()] arms.")
if(prob(10))
- M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
+ M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."))
..()
return
@@ -1126,7 +1136,7 @@
/datum/reagent/nitrous_oxide/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == VAPOR)
M.drowsyness += max(round(reac_volume, 1), 2)
-
+
/datum/reagent/nitrous_oxide/on_mob_life(mob/living/M)
M.drowsyness += 2
if(ishuman(M))
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 28e8550b45..72e42b500f 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -104,11 +104,12 @@
if(!operating)
return
use_power(100)
-
affecting = loc.contents - src // moved items will be all in loc
- sleep(1)
+ addtimer(CALLBACK(src, .proc/convey, affecting), 1)
+
+/obj/machinery/conveyor/proc/convey(list/affecting)
for(var/atom/movable/A in affecting)
- if(A.loc == loc)
+ if((A.loc == loc) && A.has_gravity())
A.ConveyorMove(movedir)
// attack with item, place item on conveyor
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 834b79d4dc..cb00bf6ea1 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -249,16 +249,6 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/borg/upgrade/modkit/range
category = list("Mining Designs", "Cyborg Upgrade Modules")
-/datum/design/superaccelerator
- name = "Kinetic Accelerator Pressure Mod"
- desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors."
- id = "indoormod"
- req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
- build_type = PROTOLATHE | MECHFAB
- materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
- build_path = /obj/item/borg/upgrade/modkit/indoors
- category = list("Mining Designs", "Cyborg Upgrade Modules")
-
/datum/design/hyperaccelerator
name = "Kinetic Accelerator Mining AoE Mod"
desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock."
diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm
index ca49f50ae5..a757a86430 100644
--- a/code/modules/shuttle/ripple.dm
+++ b/code/modules/shuttle/ripple.dm
@@ -1,4 +1,4 @@
-/obj/effect/overlay/temp/ripple
+/obj/effect/temp_visual/ripple
name = "hyperspace ripple"
desc = "Something is coming through hyperspace, you can see the \
visual disturbances. It's probably best not to be on top of these \
@@ -13,10 +13,10 @@
duration = 3 * SHUTTLE_RIPPLE_TIME
-/obj/effect/overlay/temp/ripple/Initialize(mapload, time_left)
+/obj/effect/temp_visual/ripple/Initialize(mapload, time_left)
. = ..()
animate(src, alpha=255, time=time_left)
addtimer(CALLBACK(src, .proc/stop_animation), 8, TIMER_CLIENT_TIME)
-/obj/effect/overlay/temp/ripple/proc/stop_animation()
+/obj/effect/temp_visual/ripple/proc/stop_animation()
icon_state = "medi_holo_no_anim"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index a5d60b1e8d..96db9d0ac3 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -404,7 +404,7 @@
/obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1, animate_time)
var/list/turfs = ripple_area(S1)
for(var/t in turfs)
- ripples += new /obj/effect/overlay/temp/ripple(t, animate_time)
+ ripples += new /obj/effect/temp_visual/ripple(t, animate_time)
/obj/docking_port/mobile/proc/remove_ripples()
for(var/R in ripples)
@@ -764,6 +764,6 @@
if(T in block(T0,T1))
return TRUE
return FALSE
-
+
#undef DOCKING_PORT_HIGHLIGHT
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index aa28f2402c..72e7b5bb3f 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -254,7 +254,7 @@
/mob/living/simple_animal/hostile/bear/fightpit
name = "fight pit bear"
desc = "This bear's trained through ancient Russian secrets to fear the walls of its glass prison."
- environment_smash = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
/obj/effect/decal/hammerandsickle
name = "hammer and sickle"
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index b6898afdef..c8a7c387ee 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -128,8 +128,8 @@
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
jaunt_in_time = 12
- jaunt_in_type = /obj/effect/overlay/temp/dir_setting/wraith
- jaunt_out_type = /obj/effect/overlay/temp/dir_setting/wraith/out
+ jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith
+ jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
return
@@ -256,7 +256,7 @@
S.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY)
S.faction = list("cult")
playsound(get_turf(S), 'sound/effects/ghost.ogg', 100, 1)
- new /obj/effect/overlay/temp/cult/sac(get_turf(S))
+ new /obj/effect/temp_visual/cult/sac(get_turf(S))
/obj/effect/proc_holder/spell/targeted/dominate/can_target(mob/living/target)
if(!isanimal(target) || target.stat)
@@ -267,5 +267,5 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem
charge_max = 800
- jaunt_in_type = /obj/effect/overlay/temp/dir_setting/cult/phase
- jaunt_out_type = /obj/effect/overlay/temp/dir_setting/cult/phase/out
\ No newline at end of file
+ jaunt_in_type = /obj/effect/temp_visual/dir_setting/cult/phase
+ jaunt_out_type = /obj/effect/temp_visual/dir_setting/cult/phase/out
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index f1e959fd6f..940967adeb 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -13,8 +13,8 @@
nonabstract_req = 1
var/jaunt_duration = 50 //in deciseconds
var/jaunt_in_time = 5
- var/jaunt_in_type = /obj/effect/overlay/temp/wizard
- var/jaunt_out_type = /obj/effect/overlay/temp/wizard/out
+ var/jaunt_in_type = /obj/effect/temp_visual/wizard
+ var/jaunt_out_type = /obj/effect/temp_visual/wizard/out
action_icon_state = "jaunt"
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index b8296a1da5..f62259f67b 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -257,7 +257,7 @@
selection_type = "view"
sound = 'sound/magic/Repulse.ogg'
var/maxthrow = 5
- var/sparkle_path = /obj/effect/overlay/temp/gravpush
+ var/sparkle_path = /obj/effect/temp_visual/gravpush
action_icon_state = "repulse"
@@ -300,7 +300,7 @@
range = 2
cooldown_min = 150
invocation_type = "none"
- sparkle_path = /obj/effect/overlay/temp/dir_setting/tailsweep
+ sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 2bc650656f..9a787f9fda 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -83,14 +83,18 @@
//sometimes we want to ignore that we don't have the required amount of legs.
/mob/proc/get_leg_ignore()
- return 0
+ return FALSE
/mob/living/carbon/alien/larva/get_leg_ignore()
- return 1
+ return TRUE
/mob/living/carbon/human/get_leg_ignore()
if(movement_type & FLYING)
- return 1
+ return TRUE
+ var/obj/item/weapon/tank/jetpack/J = get_jetpack()
+ if(J && J.on && !has_gravity())
+ return TRUE
+ return FALSE
/mob/living/proc/get_missing_limbs()
return list()
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 3f5b4b4ca4..667742afc4 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -914,8 +914,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 3
/datum/uplink_item/device_tools/military_belt
- name = "Military Belt"
- desc = "A robust seven-slot red belt that is capable of holding all manner of tatical equipment."
+ name = "Chest Rig"
+ desc = "A robust seven-slot set of webbing that is capable of holding all manner of tatical equipment."
item = /obj/item/weapon/storage/belt/military
cost = 1
exclude_modes = list(/datum/game_mode/nuclear)
@@ -1282,7 +1282,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 10
item = /obj/item/weapon/pneumatic_cannon/pie/selfcharge
restricted_roles = list("Clown")
- surplus = 0 //No fun unless you're the clown!
+ surplus = 0 //No fun unless you're the clown!
/datum/uplink_item/role_restricted/ancient_jumpsuit
name = "Ancient Jumpsuit"
@@ -1298,8 +1298,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/toy/eightball/haunted
cost = 2
restricted_roles = list("Curator")
- limited_stock = 1 // please don't spam deadchat
-
+ limited_stock = 1 //please don't spam deadchat
+
/datum/uplink_item/role_restricted/modified_syringe_gun
name = "Modified Syringe Gun"
desc = "A syringe gun that fires DNA injectors instead of normal syringes."
@@ -1307,6 +1307,14 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 14
restricted_roles = list("Geneticist", "Chief Medical Officer")
+/datum/uplink_item/role_restricted/pressure_mod
+ name = "Kinetic Accelerator Pressure Mod"
+ desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
+ item = /obj/item/borg/upgrade/modkit/indoors
+ cost = 5 //you need two for full damage, so total of 10 for maximum damage
+ limited_stock = 2 //you can't use more than two!
+ restricted_roles = list("Shaft Miner")
+
// Pointless
/datum/uplink_item/badass
category = "(Pointless) Badassery"
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 15337d8a28..7cd2839b4b 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -19,7 +19,7 @@
/obj/vehicle/space/speedbike/Move(newloc,move_dir)
if(has_buckled_mobs())
- new /obj/effect/overlay/temp/dir_setting/speedbike_trail(loc,move_dir)
+ new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc,move_dir)
. = ..()
/obj/vehicle/space/speedbike/red
diff --git a/code/world.dm b/code/world.dm
index b8fbd4eddf..566c9e213c 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -16,6 +16,33 @@
/world/New()
log_world("World loaded at [time_stamp()]")
+ SetupExternalRSC()
+
+ GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
+
+ make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
+
+ config = new
+
+ SetRoundID()
+
+ SetupLogs()
+
+ GLOB.revdata.DownloadPRDetails()
+
+ load_motd()
+ load_admins()
+// load_mentors()
+ load_menu()
+ if(config.usewhitelist)
+ load_whitelist()
+ LoadBans()
+
+ GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
+
+ Master.Initialize(10, FALSE)
+
+/world/proc/SetupExternalRSC()
#if (PRELOAD_RSC == 0)
external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
var/i=1
@@ -25,10 +52,8 @@
else
external_rsc_urls.Cut(i,i+1)
#endif
- GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
- config = new
- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+
+/world/proc/SetRoundID()
if(config.sql_enabled)
if(SSdbcore.Connect())
log_world("Database connection established.")
@@ -38,10 +63,14 @@
query_feedback_max_id.Execute()
if(query_feedback_max_id.NextRow())
GLOB.round_id = query_feedback_max_id.item[1]
- GLOB.log_directory += "[GLOB.round_id]"
else
log_world("Your server failed to establish a connection with the database.")
- if(!GLOB.round_id)
+
+/world/proc/SetupLogs()
+ GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+ if(GLOB.round_id)
+ GLOB.log_directory += "[GLOB.round_id]"
+ else
GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
@@ -54,27 +83,10 @@
if(fexists(GLOB.config_error_log))
fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
fdel(GLOB.config_error_log)
-
+
if(GLOB.round_id)
log_game("Round ID: [GLOB.round_id]")
- GLOB.revdata.DownloadPRDetails()
- load_mode()
- load_motd()
- load_admins()
- load_menu()
- if(config.usewhitelist)
- load_whitelist()
-//disabled to prevent runtimes until it's fixed
-// load_mentors()
- LoadBans()
-
- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
-
- GLOB.data_core = new /datum/datacore()
-
- Master.Initialize(10, FALSE)
-
#define IRC_STATUS_THROTTLE 50
/world/Topic(T, addr, master, key)
if(config && config.log_world_topic)
@@ -200,99 +212,21 @@
if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
return
-#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
+ var/final_composed = "PR: [announcement]"
for(var/client/C in GLOB.clients)
- if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
- C << "PR: [announcement]"
-#undef CHAT_PULLR
+ C.AnnouncePR(final_composed)
-#define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return;
-
-/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
- if (reason == 1) //special reboot, do none of the normal stuff
+/world/Reboot(reason = 0, fast_track = FALSE)
+ if (reason || fast_track) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
to_chat(world, "Rebooting World immediately due to host request")
- WORLD_REBOOT(1)
- var/delay
- if(time)
- delay = time
else
- delay = config.round_end_countdown * 10
- if(SSticker.delay_end)
- to_chat(world, "An admin has delayed the round end.")
- return
- to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]")
- var/round_end_sound_sent = FALSE
- if(SSticker.round_end_sound)
- round_end_sound_sent = TRUE
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if (!C)
- continue
- C.Export("##action=load_rsc", SSticker.round_end_sound)
- sleep(delay)
- if(SSticker.delay_end)
- to_chat(world, "Reboot was cancelled by an admin.")
- return
- OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent)
- WORLD_REBOOT(0)
-#undef WORLD_REBOOT
-
-/world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent)
- SSblackbox.set_details("[feedback_c]","[feedback_r]")
- log_game("Rebooting World. [reason]")
- SSblackbox.set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len)
- Master.Shutdown() //run SS shutdowns
- RoundEndAnimation(round_end_sound_sent)
- kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked
- to_chat(world, "Rebooting world...")
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
- C << link("byond://[config.server]")
-
-/world/proc/RoundEndAnimation(round_end_sound_sent)
- set waitfor = FALSE
- var/round_end_sound
- if(SSticker.round_end_sound)
- round_end_sound = SSticker.round_end_sound
- if (!round_end_sound_sent)
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if (!C)
- continue
- C.Export("##action=load_rsc", round_end_sound)
- else
- round_end_sound = pick(\
- 'sound/roundend/newroundsexy.ogg',
- 'sound/roundend/apcdestroyed.ogg',
- 'sound/roundend/bangindonk.ogg',
- 'sound/roundend/leavingtg.ogg',
- 'sound/roundend/its_only_game.ogg',
- 'sound/roundend/yeehaw.ogg',
- 'sound/roundend/disappointed.ogg'\
- )
-
- for(var/thing in GLOB.clients)
- var/obj/screen/splash/S = new(thing, FALSE)
- S.Fade(FALSE,FALSE)
-
- world << sound(round_end_sound)
-
-/world/proc/load_mode()
- var/mode = trim(file2text("data/mode.txt"))
- if(mode)
- GLOB.master_mode = mode
- else
- GLOB.master_mode = "extended"
- log_game("Saved mode is '[GLOB.master_mode]'")
-
-/world/proc/save_mode(the_mode)
- var/F = file("data/mode.txt")
- fdel(F)
- F << the_mode
+ to_chat(world, "Rebooting world...")
+ Master.Shutdown() //run SS shutdowns
+ log_world("World rebooted at [time_stamp()]");
+ ..()
/world/proc/load_motd()
GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
@@ -346,4 +280,4 @@
if (features)
s += ": [jointext(features, ", ")]"
- status = s
+ status = s
\ No newline at end of file
diff --git a/config/game_options.txt.rej b/config/game_options.txt.rej
deleted file mode 100644
index bb860ac94d..0000000000
--- a/config/game_options.txt.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/config/game_options.txt b/config/game_options.txt (rejected hunks)
-@@ -482,7 +482,7 @@ Space_Budget 16
- #Must be at least 30 to not break parallax I recommended at least 55 to be visually/aurally appropriate
- ARRIVALS_SHUTTLE_DOCK_WINDOW 55
-
--#Set this to 1 to prevent late join players from spawning if the arrivals shuttle is depressurized
-+#Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized
- #ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN
-
- # How many wirechewing rodents you want to spawn on exposed maintenane wires at the start of the round. You may wish to set this to 0 if you're testing powernets.
diff --git a/html/changelogs/AutoChangeLog-pr-1087.yml b/html/changelogs/AutoChangeLog-pr-1087.yml
new file mode 100644
index 0000000000..c94c89bed0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1087.yml
@@ -0,0 +1,4 @@
+author: "Lzimann"
+delete-after: True
+changes:
+ - rscadd: "Pandemic is now tgui!"
diff --git a/html/changelogs/AutoChangeLog-pr-1091.yml b/html/changelogs/AutoChangeLog-pr-1091.yml
new file mode 100644
index 0000000000..b8d5699997
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1091.yml
@@ -0,0 +1,5 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Resonator fields now visually show how long they have until they burst."
+ - bugfix: "Hitting a legion skull with a resonator will now produce a field."
diff --git a/html/changelogs/AutoChangeLog-pr-1096.yml b/html/changelogs/AutoChangeLog-pr-1096.yml
new file mode 100644
index 0000000000..fff14de59e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1096.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "The Warden's Cycler Shotgun has been replaced with a Compact Combat Shotgun. A unique weapon, it can fit in armour slots but at the sacrifice of a smaller ammo capacity of four shells."
diff --git a/html/changelogs/AutoChangeLog-pr-1101.yml b/html/changelogs/AutoChangeLog-pr-1101.yml
new file mode 100644
index 0000000000..f57bf23e13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1101.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Spessmen seems to have stopped suffering from the mental condition that makes them believe they can't move fast if they have only one leg, even if they're in space and using a jetpack!"
diff --git a/html/changelogs/AutoChangeLog-pr-1102.yml b/html/changelogs/AutoChangeLog-pr-1102.yml
new file mode 100644
index 0000000000..8e01bbc5ad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1102.yml
@@ -0,0 +1,4 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - bugfix: "Martial arts are no longer lost when mind-swapping, cloning, moving your brain, et cetera."
diff --git a/html/changelogs/AutoChangeLog-pr-1103.yml b/html/changelogs/AutoChangeLog-pr-1103.yml
new file mode 100644
index 0000000000..39ae5952ab
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1103.yml
@@ -0,0 +1,7 @@
+author: "coiax"
+delete-after: True
+changes:
+ - rscadd: "Galactic Common has been added to silicon's internal language
+database, meaning even if a cyborg is created from someone who
+previously did not know Galactic Common, they will be able to speak it
+as a silicon."
diff --git a/html/changelogs/AutoChangeLog-pr-1109.yml b/html/changelogs/AutoChangeLog-pr-1109.yml
new file mode 100644
index 0000000000..f1c4acbc0e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1109.yml
@@ -0,0 +1,6 @@
+author: "Joan, Repukan"
+delete-after: True
+changes:
+ - rscadd: "Traitor miners can now buy up to 2 KA Pressure Mods for 5 TC each.
+balance: KA Pressure Mods now only take up 35 mod capacity each, allowing traitor miners to use 2 and have space for 1 other mod."
+ - rscdel: "R&D can no longer build KA Pressure Mods."
diff --git a/html/changelogs/AutoChangeLog-pr-1112.yml b/html/changelogs/AutoChangeLog-pr-1112.yml
new file mode 100644
index 0000000000..dcd84158cc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1112.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Ripleys will collect all ore in front of them when they move with a clamp and stored ore box."
diff --git a/html/changelogs/AutoChangeLog-pr-1116.yml b/html/changelogs/AutoChangeLog-pr-1116.yml
new file mode 100644
index 0000000000..d63e6e64ba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1116.yml
@@ -0,0 +1,4 @@
+author: "ma44"
+delete-after: True
+changes:
+ - rscadd: "Reports of syndicate base on lavaland has been outfitted with a state of the art donksoft toy weapon dispenser."
diff --git a/html/changelogs/AutoChangeLog-pr-1117.yml b/html/changelogs/AutoChangeLog-pr-1117.yml
new file mode 100644
index 0000000000..a5cdcb8039
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1117.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - tweak: "Chasms will glow dimly, like lava."
diff --git a/html/changelogs/AutoChangeLog-pr-1119.yml b/html/changelogs/AutoChangeLog-pr-1119.yml
new file mode 100644
index 0000000000..e41fb408be
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1119.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Auto Rifle alt ammo mags (AP, Incendiary, Uranium Tipped) now have a coloured stripe to denote them."
diff --git a/html/changelogs/AutoChangeLog-pr-1121.yml b/html/changelogs/AutoChangeLog-pr-1121.yml
new file mode 100644
index 0000000000..18f8cc544e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1121.yml
@@ -0,0 +1,6 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscdel: "Nanotrasen has taken a lower bid for their meson suppliers, and meson scanners will no longer display terrain layouts while on the planet."
+ - tweak: "However, they have discovered that, with some tweaks, mineral scanners will no longer actually require you to be wearing mesons."
+ - tweak: "The cheaper mesons will not completely remove reliance on light."
diff --git a/html/changelogs/AutoChangeLog-pr-1129.yml b/html/changelogs/AutoChangeLog-pr-1129.yml
new file mode 100644
index 0000000000..695dc0b148
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1129.yml
@@ -0,0 +1,4 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - bugfix: "Fixed a bug where paper bins could swallow up pens into the void."
diff --git a/html/changelogs/AutoChangeLog-pr-1130.yml b/html/changelogs/AutoChangeLog-pr-1130.yml
new file mode 100644
index 0000000000..c7dacb5662
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1130.yml
@@ -0,0 +1,10 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - rscadd: "Gang influence is now decentralized, each gangster has their own influence that they can increase by spraying (and protecting) their tags and new influence-enhancing bling."
+ - rscadd: "Gang uniforms are now created based on your gang's color and can be purchased by any gang member. They will increase the wearer's influence and provide protection, but will make it fairly obvious which gang you belong to."
+ - rscadd: "Gangs have access to a new surplus rifle; it is a semi-automatic rifle that is very bulky and has a very low rate of fire. Gang members can buy this gun for just 8 influence."
+ - rscadd: "Gangs have access to the new machine gun turret; it unleashes a volley of bullets with an extended view range. It does not run out of ammo, but a significant delay between volleys and its stationary nature leaves the gunner vulnerable to flanking and return fire. Holding down the trigger will allow you to aim the gun while firing. It will cost gangs 50 influence."
+ - rscadd: "The sawn-off improvised shotgun is now available to gangs for 6 influence. With buckshot shells being easy to produce or purchase, this gun gives the most \"bang for your buck\" but its single-shell capacity will leave you vulnerable during a pitched gunfight."
+ - rscadd: "The Wetwork boots give gangs access to a lightly armored noslip variant."
+ - tweak: "The armored gang outfits are now slightly more resistant to ballistic and bomb damage"
diff --git a/html/changelogs/AutoChangeLog-pr-1141.yml b/html/changelogs/AutoChangeLog-pr-1141.yml
new file mode 100644
index 0000000000..2b8841490d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1141.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard"
+delete-after: True
+changes:
+ - tweak: "Station based armour is slightly more descriptive of what it does."
diff --git a/html/changelogs/AutoChangeLog-pr-1146.yml b/html/changelogs/AutoChangeLog-pr-1146.yml
new file mode 100644
index 0000000000..c7b4db56f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1146.yml
@@ -0,0 +1,4 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - tweak: "Changed spray tan overdoses to be more realistic."
diff --git a/html/changelogs/AutoChangeLog-pr-1147.yml b/html/changelogs/AutoChangeLog-pr-1147.yml
new file mode 100644
index 0000000000..6c524da4aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1147.yml
@@ -0,0 +1,5 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - rscadd: "Hairless hides now become wet when exposed to water"
+ - rscadd: "You can microwave wet leather to dry it"
diff --git a/html/changelogs/AutoChangeLog-pr-1149.yml b/html/changelogs/AutoChangeLog-pr-1149.yml
new file mode 100644
index 0000000000..4a5c010dd4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1149.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Boxstation armoury weapon racks now have glass panes to help prevent the weapons easily flying out of a breached hull."
diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi
new file mode 100644
index 0000000000..30a05b043a
Binary files /dev/null and b/icons/effects/ore_visuals.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index b9ddf04153..8fbd06a23b 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi
index 911d7288d1..2a5e20a671 100644
Binary files a/icons/mob/lavaland/dragon.dmi and b/icons/mob/lavaland/dragon.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index c45d49fdc5..7c41752024 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi
index 53bc261686..de13308f37 100644
Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 87d4e5ed22..33149a3e2e 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 263e51400a..441f334ca7 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index fd078d775c..48f37887cf 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 7a3c416b94..c0f2d46f62 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 90e4ee5332..d936e41df4 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index dfb1f4c51b..611a27e6a7 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index c4077b6601..b186c3f224 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 8e08060f0d..c7b9bbcdc8 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi
index 66c07a8146..8770f77cd9 100644
Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ
diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi
index a7e9864617..ba2bbce955 100644
Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index ad998e8286..2d2e35f59e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -14,7 +14,6 @@
// BEGIN_INCLUDE
#include "_maps\basemap.dm"
-#include "_maps\loadallmaps.dm"
#include "_maps\tgstation2.dm"
#include "code\_compile_options.dm"
#include "code\world.dm"
@@ -197,7 +196,6 @@
#include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\disease.dm"
#include "code\controllers\subsystem\events.dm"
-#include "code\controllers\subsystem\fields.dm"
#include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
@@ -232,6 +230,7 @@
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
#include "code\controllers\subsystem\processing\fastprocess.dm"
+#include "code\controllers\subsystem\processing\fields.dm"
#include "code\controllers\subsystem\processing\flightpacks.dm"
#include "code\controllers\subsystem\processing\obj.dm"
#include "code\controllers\subsystem\processing\overlays.dm"
@@ -324,7 +323,11 @@
#include "code\datums\helper_datums\icon_snapshot.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
+#include "code\datums\martial\boxing.dm"
+#include "code\datums\martial\cqc.dm"
#include "code\datums\martial\krav_maga.dm"
+#include "code\datums\martial\plasma_fist.dm"
+#include "code\datums\martial\sleeping_carp.dm"
#include "code\datums\martial\wrestling.dm"
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
diff --git a/tgui/assets/tgui.css.rej b/tgui/assets/tgui.css.rej
deleted file mode 100644
index bc960c1251..0000000000
--- a/tgui/assets/tgui.css.rej
+++ /dev/null
@@ -1,6 +0,0 @@
-diff a/tgui/assets/tgui.css b/tgui/assets/tgui.css (rejected hunks)
-@@ -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.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork 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 #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork 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.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:after,body.clockwork 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.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork 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.clockwork div[data-tooltip].tooltip-left:after,body.clockwork 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.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork 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.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork 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 #5f380e;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,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.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork 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.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") 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;min-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.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.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+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") 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;min-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.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.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
-+@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.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork 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 #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork 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 #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,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.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){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.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right: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;min-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.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.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:-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(2n){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;min-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.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.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:-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(2n){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 d7b7e7f257..c609f0d32b 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,16 +1,16 @@
-require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >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 a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(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))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=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";r(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,a=x(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.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[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}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!!_(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:_,setStrong:function(t,e,n){c(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?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(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 a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(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,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{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 a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(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||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,r(r.G+r.W+r.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 a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}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 a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}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 a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(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 a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(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 a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?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 a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(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 a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=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,b,y,x,_){p(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[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",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var R=l(T.call(new t));c(R,S,!0),!a&&s(A,h)&&o(R,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),e,w);return w}},{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 a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}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 a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[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 a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.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 a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{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 a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=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(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||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 a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(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 a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u="
",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.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)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,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 a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,R=r.getDesc,M=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return R(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=M=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:M});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("i;)c(r,a=t[i++])&&(~S(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:M(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=x(t,n),i=x(e,n),o=_(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var U=function(t){return function(e,n){m(e);var a=w(this),r=_(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},G=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||G(E(0)),map:G(E(1)),filter:G(E(2)),some:G(E(3)),every:G(E(4)),reduce:U(!1),reduceRight:U(!0),indexOf:G(S),lastIndexOf:function(t,e){var n=b(this),a=_(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=_(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.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(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(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 a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(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,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.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 a=t(3),r=t(44),i=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,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.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,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.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:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.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){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(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 a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),P=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},R=function(t){try{t()}catch(e){return{error:e}}},M=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?_.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(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(),M(e,!0))},N=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=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,M(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(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(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&M(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,x),t(65)(x),a=t(16)[x],p(p.S+p.F*!C,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||S(!0)),x,{resolve:function(t){if(t instanceof k&&P(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=R(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=R(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.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 a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(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 r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"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}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"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 a=t(46);t(19)&&"g"!=/./g.flags&&a.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 a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=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=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+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 a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=a.getDesc,w=a.setDesc,k=a.create,E=m.get,S=r.Symbol,C=r.JSON,P=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,R=c("symbol-registry"),M=c("symbols"),j="function"==typeof S,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=_(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&A&&N(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),N(this,t,x(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(M,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,O)||w(t,O,x(1,{})),t[O][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},U=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(M,t)||i(this,O)&&this[O][t]?e:!0},G=function(t,e){var n=_(t=y(t),e);return!n||!i(M,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(M,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(M,e=n[r++])&&a.push(M[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,P.apply(C,a)}},H=p(function(){var t=S();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))});j||(S=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof S},a.create=q,a.isEnum=U,a.getDesc=G,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",U,!0));var Q={"for":function(t){return i(R,t+="")?R[t]:R[t]=S(t)},keyFor:function(t){return h(R,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=j?e:D(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",Q),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:G,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(S,"Symbol"),l(Math,"Math",!0),l(r.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 a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},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(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(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 a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(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"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.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 a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?S:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=S,i="throw",o=p.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[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("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 c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-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(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.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 a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(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&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function c(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,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",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="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){l=!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:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,c(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,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(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 p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(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 l=!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 a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),C=document.documentElement,P=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(_,null,"nodeValue"),a(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)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:p},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,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(p))&&P.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.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&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,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%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},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,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(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 l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[x(n),_(a)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=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)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===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,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Mo.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.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 p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Mv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(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 a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=_(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function S(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},S(t,E(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Xo);
-return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function R(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(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 L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(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,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=G(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function G(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 V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(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;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.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,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(P(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(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,_t(this)}function _t(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var a,r;return t=E(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=S(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(P(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Rt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Rt(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 a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Ru.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&&jt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Mu.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("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,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("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 Gt(t){var e=Eo(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(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 i;)c(r,a=t[i++])&&(~S(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in M)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";M[e]=Function("F,a","return new F("+a.join(",")+")")}return M[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=x(t,n),i=x(e,n),o=_(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var U=function(t){return function(e,n){m(e);var a=w(this),r=_(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},G=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||G(E(0)),map:G(E(1)),filter:G(E(2)),some:G(E(3)),every:G(E(4)),reduce:U(!1),reduceRight:U(!0),indexOf:G(S),lastIndexOf:function(t,e){var n=b(this),a=_(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=_(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.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(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(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 a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(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,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.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 a=t(3),r=t(44),i=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,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.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,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.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:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.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){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(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 a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),P=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},j=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;M(r)&&(w?_.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},M=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],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(),R(e,!0))},N=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=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(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(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,x),t(65)(x),a=t(16)[x],p(p.S+p.F*!C,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||S(!0)),x,{resolve:function(t){if(t instanceof k&&P(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=j(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=j(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.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 a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(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 r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"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}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"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 a=t(46);t(19)&&"g"!=/./g.flags&&a.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 a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=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=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+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 a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=a.getDesc,w=a.setDesc,k=a.create,E=m.get,S=r.Symbol,C=r.JSON,P=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,j=c("symbol-registry"),R=c("symbols"),M="function"==typeof S,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=_(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=R[t]=k(S.prototype);return e._k=t,o&&A&&N(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),N(this,t,x(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,O)||w(t,O,x(1,{})),t[O][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},U=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},G=function(t,e){var n=_(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,P.apply(C,a)}},H=p(function(){var t=S();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))});M||(S=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof S},a.create=q,a.isEnum=U,a.getDesc=G,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",U,!0));var Q={"for":function(t){return i(j,t+="")?j[t]:j[t]=S(t)},keyFor:function(t){return h(j,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=M?e:D(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",Q),s(s.S+s.F*!M,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:G,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!M||H),"JSON",{stringify:W}),l(S,"Symbol"),l(Math,"Math",!0),l(r.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 a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},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(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(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 a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(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"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.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 a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?S:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=S,i="throw",o=p.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[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("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 c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-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(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.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 a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(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&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function c(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,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",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="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){l=!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:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,c(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,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(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 p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(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 l=!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 a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),C=document.documentElement,P=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(_,null,"nodeValue"),a(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)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:p},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,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(p))&&P.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.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&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,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%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},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,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(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 l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[x(n),_(a)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=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)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===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,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Mo.call(t)}function o(t){return Lo.test(Mo.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 p(t){return t&&"[object Object]"===Mo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=_(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function S(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},S(t,E(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Xo);return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}
+function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function M(t,e){var n;if(!i(t)||!i(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 L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(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,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=G(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function G(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 V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(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;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.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,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(P(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(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,_t(this)}function _t(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var a,r;return t=E(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=S(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(P(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=jt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}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 Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.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&&Mt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function Mt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("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,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("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 Gt(t){var e=Eo(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(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 i;)c(r,a=t[i++])&&(~E(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(F,F.length,!0),create:r.create=r.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:R(n,e)},keys:r.getKeys=r.getKeys||I(j,N,!1)});var U=function(t,e,n){if(!(e in L)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";L[e]=Function("F,a","return new F("+a.join(",")+")")}return L[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?U(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var q=function(t){return function(e,n){m(e);var a=w(this),r=x(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},G=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||G(P(0)),map:G(P(1)),filter:G(P(2)),some:G(P(3)),every:G(P(4)),reduce:q(!1),reduceRight:q(!0),indexOf:G(E),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.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(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(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 a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(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,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.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 a=t(3),r=t(44),i=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,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.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,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.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:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
--var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.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){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(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 a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],P=function(){},E=function(t){var e,n=new k(P);return t&&(n.constructor=function(t){t(P,P)}),(e=k.resolve(n))["catch"](P),e===n},C=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=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),S=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;L(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},L=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!L(e.promise))return!1;return!0},j=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(),R(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=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(F,a,1),s(j,a,1))}catch(r){j.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){j.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(F,e,1),s(j,e,1))}catch(n){j.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!C,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||E(!0)),_,{resolve:function(t){if(t instanceof k&&S(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=M(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.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 a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(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 r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"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}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"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 a=t(46);t(19)&&"g"!=/./g.flags&&a.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 a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=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=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+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 a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,P=m.get,E=r.Symbol,C=r.JSON,S=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),L="function"==typeof E,j=Object.prototype,F=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(j,e);a&&delete j[e],w(t,e,n),a&&t!==j&&w(j,e,a)}:w,N=function(t){var e=R[t]=k(E.prototype);return e._k=t,o&&A&&F(j,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),F(this,t,_(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,O)||w(t,O,_(1,{})),t[O][e]=!0),F(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},U=function(t,e){return void 0===e?k(t):B(k(t),e)},q=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},G=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!D(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[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}),a[1]=e,S.apply(C,a)}},H=p(function(){var t=E();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});L||(E=function(){if(D(this))throw TypeError("Symbol is not a constructor");return N(f(arguments.length>0?arguments[0]:void 0))},u(E.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof E},a.create=U,a.isEnum=q,a.getDesc=G,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(j,"propertyIsEnumerable",q,!0));var K={"for":function(t){return i(M,t+="")?M[t]:M[t]=E(t)},keyFor:function(t){return h(M,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:N(e)}),A=!0,s(s.G+s.W,{Symbol:E}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:U,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:G,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!L||H),"JSON",{stringify:W}),l(E,"Symbol"),l(Math,"Math",!0),l(r.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 a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},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(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(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 a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(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"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.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 a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===P)throw Error("Generator is already running");if(a===E){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=E,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=P;var p=r(t,e,n);if("normal"===p.type){a=n.done?E:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=E,i="throw",o=p.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[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("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 c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(U=this.length;U--&&this[U]!==t;);return U}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.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 a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,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",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="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){l=!0,f=!0}}();var _={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:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(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 p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(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 l=!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 a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,P={},E=document.createElement("div"),C=document.documentElement,S=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(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)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},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,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(P,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&E.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),P[p]=!0}catch(r){for(P[p]=!1;E.hasChildNodes();)E.removeChild(E.firstChild)}null!=o&&A.call(u,p,o)}else P[p]=!1;(f.n=P[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.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&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.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%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},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,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(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 l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=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)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===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,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return jo.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 p(t){return t&&"[object Object]"===Lo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),Fo[t]||(Fo[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function P(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[$o];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===$o?o[0]=P(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,P(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);
--return t.set(e,+a+n)}function O(t,e){return Yo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!i(t)||!i(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 j(t){return"string"==typeof t?[t]:void 0===t?[]:t}function F(t){return t[t.length-1]}function N(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 U(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,U(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function q(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=P(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=G(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,P(e),n),a}function G(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return P(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),P(n.join("."))}return P(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=P(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=P(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function X(t){t.cancel()}function $(t){t.detach()}function Y(t){t.detachNodes()}function J(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;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=P(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=P(S(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(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,xt(this)}function xt(t){Xs.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=P(S(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Pt(t,e,n,a){var r,i,o;e=P(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(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 Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.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&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(H)}function jt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Ft(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Dt),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=Uu.test(t)?t.replace(Uu,a):t.replace(Du,"").replace(Nu,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(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?l("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,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?Ut(e,this):e,i=n?Ut(t,this):t;return qt(r,i)}:qt(e,t)}function Ut(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("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 qt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Gt(t){var e=Po(Qu);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Ji){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(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 i;)c(r,a=t[i++])&&(~C(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?E:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var G=function(t){return function(e,n){m(e);var a=w(this),r=x(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||U(P(0)),map:U(P(1)),filter:U(P(2)),some:U(P(3)),every:U(P(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(C),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.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(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(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 a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(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,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.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 a=t(3),r=t(44),i=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,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.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,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.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:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.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 a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
-+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.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){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(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 a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],P=function(){},C=function(t){var e,n=new k(P);return t&&(n.constructor=function(t){t(P,P)}),(e=k.resolve(n))["catch"](P),e===n},E=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&C(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),S=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(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(),R(e,!0))},N=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=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};E||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!E,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!E,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!E||C(!0)),_,{resolve:function(t){if(t instanceof k&&S(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(E&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=M(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.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 a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(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 r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"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}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"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 a=t(46);t(19)&&"g"!=/./g.flags&&a.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 a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=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=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+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 a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,P=m.get,C=r.Symbol,E=r.JSON,S=E&&E.stringify,A=!1,O=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof C,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=R[t]=k(C.prototype);return e._k=t,o&&A&&N(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),N(this,t,_(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,O)||w(t,O,_(1,{})),t[O][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},G=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},U=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,S.apply(E,a)}},H=p(function(){var t=C();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});j||(C=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(C.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof C},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var K={"for":function(t){return i(M,t+="")?M[t]:M[t]=C(t)},keyFor:function(t){return h(M,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=j?e:D(e)}),A=!0,s(s.G+s.W,{Symbol:C}),s(s.S,"Symbol",K),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),E&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(C,"Symbol"),l(Math,"Math",!0),l(r.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 a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},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(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(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 a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(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"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.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 a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===P)throw Error("Generator is already running");if(a===C){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=C,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=P;var p=r(t,e,n);if("normal"===p.type){a=n.done?C:k;var c={value:p.arg,done:n.done};if(p.arg!==E)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=C,i="throw",o=p.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[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),E}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},E}}}("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 c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-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(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.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 a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,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",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="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){l=!0,f=!0}}();var _={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:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(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 p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(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 l=!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 a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,P={},C=document.createElement("div"),E=document.documentElement,S=E.removeAttribute,A=E.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(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)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},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,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(P,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&C.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),P[p]=!0}catch(r){for(P[p]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&A.call(u,p,o)}else P[p]=!1;(f.n=P[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.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&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.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%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},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,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(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 l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=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)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===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,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.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 p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function P(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function C(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=P(r):o=o.map(E(r));return o}function E(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},C(t,P(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);
-+return t.set(e,+a+n)}function O(t,e){return Xo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(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 L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(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,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=P(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,P(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return P(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),P(n.join("."))}return P(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=P(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=P(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function X(t){t.detachNodes()}function J(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;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=P(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=P(S(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(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,xt(this)}function xt(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=P(S(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=C(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Pt(t,e,n,a){var r,i,o;e=P(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Ct(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Et(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(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 Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.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&&jt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("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,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Gt(r,i)}:Gt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("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 Gt(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=Po(Qu);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Ji){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(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