diff --git a/README.md b/README.md
index 671c4a1ed99..27e3846a524 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-## /tg/station
+## /tg/station server and codebase
[](https://travis-ci.org/tgstation/tgstation) [](http://www.krihelinator.xyz)
diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
new file mode 100644
index 00000000000..785d2e9456b
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
@@ -0,0 +1,6741 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/closed/mineral/random/low_chance,
+/area/ruin/unpowered)
+"ac" = (
+/turf/closed/wall/mineral/iron,
+/area/ruin/deepstorage)
+"ad" = (
+/obj/structure/closet/cardboard,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ae" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/storage/box/monkeycubes,
+/obj/item/weapon/storage/box/monkeycubes,
+/obj/item/weapon/storage/box/monkeycubes,
+/obj/item/weapon/storage/toolbox/drone,
+/obj/item/weapon/storage/toolbox/drone,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"af" = (
+/obj/structure/closet/cardboard,
+/obj/item/stack/sheet/cardboard,
+/obj/item/stack/cable_coil,
+/obj/item/stack/sheet/mineral/wood,
+/obj/item/stack/sheet/mineral/wood,
+/obj/item/stack/packageWrap,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ag" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/storage/box/mousetraps,
+/obj/item/weapon/storage/box/mousetraps,
+/obj/item/weapon/storage/box/drinkingglasses,
+/obj/item/weapon/storage/box/zipties,
+/obj/item/weapon/switchblade,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ah" = (
+/obj/structure/closet/cardboard,
+/obj/item/stack/sheet/metal{
+ amount = 50;
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/sheet/metal{
+ amount = 50;
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/sheet/metal{
+ amount = 50;
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/sheet/metal{
+ amount = 50;
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/rods{
+ amount = 50
+ },
+/obj/item/stack/rods{
+ amount = 50
+ },
+/obj/item/stack/rods{
+ amount = 50
+ },
+/obj/item/stack/rods{
+ amount = 50
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ai" = (
+/obj/structure/closet/cardboard,
+/obj/item/stack/sheet/glass{
+ amount = 50
+ },
+/obj/item/stack/sheet/glass{
+ amount = 50
+ },
+/obj/item/stack/sheet/glass{
+ amount = 50
+ },
+/obj/item/stack/sheet/glass{
+ amount = 50
+ },
+/obj/item/stack/sheet/plasteel{
+ amount = 10
+ },
+/obj/item/stack/sheet/plasteel{
+ amount = 10
+ },
+/obj/item/stack/sheet/plasteel{
+ amount = 10
+ },
+/obj/item/stack/sheet/plasteel{
+ amount = 10
+ },
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aj" = (
+/obj/structure/closet/cardboard,
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight,
+/obj/item/device/flashlight,
+/obj/item/device/flashlight,
+/obj/item/weapon/shovel,
+/obj/item/weapon/pickaxe/drill,
+/obj/item/weapon/pickaxe/drill,
+/obj/item/weapon/pickaxe/drill,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ak" = (
+/obj/structure/closet/cardboard,
+/obj/item/device/flashlight/lantern,
+/obj/item/device/flashlight/lantern,
+/obj/item/device/flashlight/lantern,
+/obj/item/device/tape/random,
+/obj/item/device/tape/random,
+/obj/item/device/tape/random,
+/obj/item/weapon/storage/box/rxglasses,
+/obj/item/weapon/extinguisher,
+/obj/item/weapon/extinguisher,
+/obj/item/clothing/glasses/night,
+/obj/item/clothing/glasses/night,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"al" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/storage/box/syringes,
+/obj/item/weapon/storage/box/syringes,
+/obj/item/weapon/storage/box/beakers,
+/obj/item/weapon/storage/box/beakers,
+/obj/item/weapon/storage/box/matches,
+/obj/item/weapon/storage/box/bodybags,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"am" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/kitchen/knife,
+/obj/item/weapon/kitchen/knife,
+/obj/item/weapon/cultivator,
+/obj/item/weapon/hatchet,
+/obj/item/weapon/kitchen/rollingpin,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"an" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/defibrillator,
+/obj/item/weapon/storage/box/medipens,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ao" = (
+/obj/structure/closet/cardboard,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/obj/item/ammo_box/c9mm,
+/obj/item/ammo_box/c9mm,
+/obj/item/ammo_box/c9mm,
+/obj/item/ammo_box/c9mm,
+/obj/item/ammo_box/c9mm,
+/obj/item/ammo_box/c9mm,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ap" = (
+/obj/structure/closet/crate/freezer,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/obj/item/weapon/reagent_containers/blood/random,
+/obj/item/weapon/reagent_containers/blood/random,
+/obj/item/weapon/reagent_containers/blood/random,
+/obj/item/weapon/reagent_containers/blood/random,
+/obj/item/weapon/reagent_containers/blood/random,
+/obj/item/weapon/reagent_containers/blood/random,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aq" = (
+/obj/machinery/iv_drip,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"ar" = (
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"as" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"at" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"au" = (
+/obj/machinery/door/airlock/highsecurity{
+ name = "Bunker"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"av" = (
+/obj/structure/toilet{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"aw" = (
+/obj/structure/mirror{
+ pixel_x = 30
+ },
+/obj/structure/sink{
+ dir = 4;
+ icon_state = "sink";
+ pixel_x = 11;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"ax" = (
+/obj/structure/table,
+/obj/item/weapon/storage/toolbox/drone,
+/obj/item/device/flashlight,
+/obj/item/device/flashlight,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"ay" = (
+/obj/structure/table,
+/obj/item/weapon/gun/ballistic/automatic/wt550{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/weapon/gun/ballistic/automatic/wt550{
+ pixel_x = 2;
+ pixel_y = 0
+ },
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"az" = (
+/obj/structure/table,
+/obj/item/weapon/storage/backpack/dufflebag/sec{
+ contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgical_drapes,/obj/item/clothing/mask/surgical);
+ desc = "A large dufflebag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools.";
+ name = "dufflebag";
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aA" = (
+/obj/structure/table,
+/obj/item/device/radio{
+ pixel_x = -4
+ },
+/obj/item/device/radio,
+/obj/item/device/radio{
+ pixel_x = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aB" = (
+/obj/structure/table,
+/obj/item/stack/sheet/metal{
+ amount = 50;
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/rods{
+ amount = 50
+ },
+/obj/item/stack/cable_coil,
+/obj/item/stack/cable_coil,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aC" = (
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid/brute{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/firstaid/brute,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aD" = (
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid/regular{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/firstaid/regular,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aE" = (
+/obj/structure/closet/crate/radiation,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aF" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aG" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aH" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aI" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/wood,
+/area/ruin/deepstorage)
+"aJ" = (
+/turf/open/floor/wood{
+ icon_state = "wood-broken3"
+ },
+/area/ruin/deepstorage)
+"aK" = (
+/obj/structure/bed,
+/turf/open/floor/wood,
+/area/ruin/deepstorage)
+"aL" = (
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"aM" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"aN" = (
+/obj/structure/table,
+/obj/item/clothing/gloves/combat{
+ pixel_x = -3;
+ pixel_y = 4
+ },
+/obj/item/clothing/gloves/combat{
+ pixel_x = 3;
+ pixel_y = -2
+ },
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aO" = (
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aP" = (
+/obj/structure/table,
+/obj/item/device/mass_spectrometer/adv,
+/obj/item/device/mass_spectrometer/adv,
+/obj/item/device/healthanalyzer,
+/obj/item/device/healthanalyzer,
+/obj/item/stack/medical/gauze,
+/obj/item/stack/medical/gauze,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aQ" = (
+/obj/structure/closet/radiation,
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aR" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aS" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"aT" = (
+/obj/structure/closet/wardrobe/pink,
+/turf/open/floor/wood{
+ icon_state = "wood-broken"
+ },
+/area/ruin/deepstorage)
+"aU" = (
+/turf/open/floor/wood,
+/area/ruin/deepstorage)
+"aV" = (
+/obj/structure/bed,
+/turf/open/floor/wood{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/deepstorage)
+"aW" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"aX" = (
+/obj/machinery/shower{
+ dir = 8
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"aY" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid/toxin{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/firstaid/toxin,
+/obj/item/weapon/storage/pill_bottle/charcoal,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"aZ" = (
+/obj/structure/table,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare,
+/obj/item/device/flashlight/flare{
+ pixel_y = 6
+ },
+/obj/item/device/flashlight/flare,
+/obj/item/weapon/crowbar/red,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"ba" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bb" = (
+/obj/structure/closet/wardrobe/pjs,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/deepstorage)
+"bc" = (
+/turf/open/floor/wood{
+ icon_state = "wood-broken4"
+ },
+/area/ruin/deepstorage)
+"bd" = (
+/obj/structure/bed,
+/turf/open/floor/wood{
+ icon_state = "wood-broken3"
+ },
+/area/ruin/deepstorage)
+"be" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/item/weapon/soap,
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"bf" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"bg" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bh" = (
+/obj/structure/closet/cardboard,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/obj/item/weapon/storage/box/donkpockets,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bi" = (
+/obj/machinery/door/airlock/highsecurity{
+ name = "Bunker"
+ },
+/turf/open/floor/wood,
+/area/ruin/deepstorage)
+"bj" = (
+/obj/machinery/door/airlock/highsecurity{
+ name = "Bunker"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/deepstorage)
+"bk" = (
+/obj/structure/fireaxecabinet{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bl" = (
+/obj/machinery/sleeper{
+ icon_state = "sleeper-open";
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bm" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bn" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bo" = (
+/obj/machinery/sleeper{
+ icon_state = "sleeper-open";
+ dir = 4
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bp" = (
+/obj/machinery/door/airlock/highsecurity{
+ name = "Bunker"
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bq" = (
+/obj/machinery/processor{
+ name = "processor"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"br" = (
+/obj/structure/table,
+/obj/item/weapon/storage/box/matches,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bs" = (
+/obj/structure/table,
+/obj/machinery/reagentgrinder,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bt" = (
+/obj/structure/table,
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bu" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/light,
+/area/ruin/deepstorage)
+"bv" = (
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/light,
+/area/ruin/deepstorage)
+"bw" = (
+/obj/machinery/blackbox_recorder,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bx" = (
+/obj/structure/cable{
+ icon_state = "0-4";
+ d2 = 4
+ },
+/obj/machinery/power/port_gen/pacman,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"by" = (
+/obj/machinery/power/smes/magical{
+ desc = "A high-capacity superconducting magnetic energy storage (SMES) unit.";
+ name = "power storage unit"
+ },
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bz" = (
+/obj/machinery/telecomms/relay/preset/telecomms,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bA" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bB" = (
+/obj/machinery/biogenerator,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bC" = (
+/obj/machinery/light,
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/light,
+/area/ruin/deepstorage)
+"bD" = (
+/obj/machinery/autolathe,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bE" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/power/terminal{
+ icon_state = "term";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bF" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bG" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bH" = (
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bI" = (
+/obj/structure/table,
+/obj/item/weapon/storage/box/donkpockets,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bJ" = (
+/obj/structure/table,
+/obj/item/weapon/reagent_containers/food/snacks/beans,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bK" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bL" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bM" = (
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Bunker APC";
+ pixel_x = -24;
+ pixel_y = 0
+ },
+/obj/structure/cable{
+ icon_state = "0-4";
+ d2 = 4
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bN" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0;
+ tag = ""
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bO" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8";
+ tag = ""
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bP" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bQ" = (
+/obj/structure/table,
+/obj/item/weapon/kitchen/knife,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bR" = (
+/obj/structure/table,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bS" = (
+/obj/structure/table,
+/obj/item/weapon/kitchen/fork,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bT" = (
+/obj/machinery/vending/hydronutrients,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bU" = (
+/obj/machinery/space_heater,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"bV" = (
+/obj/structure/chair/office/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bW" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"bX" = (
+/obj/machinery/smartfridge,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bY" = (
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/bar,
+/area/ruin/deepstorage)
+"bZ" = (
+/obj/machinery/vending/hydroseeds{
+ slogan_delay = 700
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"ca" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"cb" = (
+/obj/structure/chair/office/dark,
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"cc" = (
+/obj/structure/frame/computer,
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"cd" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/security/telescreen{
+ dir = 1;
+ name = "Bunker Entrance";
+ network = list("Bunker1");
+ pixel_x = 0;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel,
+/area/ruin/deepstorage)
+"ce" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "bunker1";
+ name = "Inner Doors";
+ pixel_y = 6
+ },
+/obj/machinery/button/door{
+ id = "bunker2";
+ name = "Outer Doors";
+ pixel_y = -4
+ },
+/turf/open/floor/plasteel/floorgrime,
+/area/ruin/deepstorage)
+"cf" = (
+/obj/machinery/door/poddoor{
+ id = "bunker1";
+ name = "Bunker Door";
+ tag = "inner"
+ },
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"cg" = (
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"ch" = (
+/obj/machinery/camera{
+ network = list("Bunker1")
+ },
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"ci" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"cj" = (
+/obj/machinery/door/poddoor{
+ id = "bunker2";
+ name = "Bunker Door";
+ tag = "outer"
+ },
+/turf/open/floor/plating,
+/area/ruin/deepstorage)
+"ck" = (
+/turf/open/floor/plating/asteroid/airless,
+/area/ruin/deepstorage)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(5,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(6,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(7,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(8,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(9,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(10,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(11,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(12,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(13,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(14,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(15,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(16,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(17,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(18,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(19,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(20,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(21,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(22,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(23,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ck
+ck
+ck
+ab
+ab
+ab
+ab
+ab
+"}
+(24,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ab
+ab
+ab
+"}
+(25,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+bl
+bo
+ac
+bw
+bD
+bM
+bU
+ca
+ar
+cf
+cg
+cg
+ac
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ab
+ab
+"}
+(26,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ar
+ar
+ac
+bx
+ar
+bN
+ar
+aO
+ar
+cf
+cg
+cg
+ac
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+"}
+(27,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+bp
+ac
+by
+bE
+bO
+aO
+ar
+aO
+ac
+cg
+cg
+ac
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+ck
+"}
+(28,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aI
+aT
+bb
+ac
+ar
+aO
+ac
+bz
+aO
+aO
+ar
+aO
+cd
+ac
+ch
+cg
+cj
+ck
+ck
+ck
+ck
+ab
+ab
+ab
+ck
+ck
+ck
+ck
+ck
+"}
+(29,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aJ
+aU
+bc
+bi
+ar
+ar
+ac
+aO
+ar
+aO
+ar
+cb
+cc
+ac
+ci
+cg
+cj
+ck
+ck
+ck
+ck
+ab
+ab
+ab
+ab
+ck
+ck
+ck
+ck
+"}
+(30,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aK
+aV
+bd
+ac
+ar
+aO
+au
+ar
+ar
+aO
+bV
+aO
+ce
+ac
+ac
+ac
+ac
+ck
+ck
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ck
+ck
+"}
+(31,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+bm
+aO
+ac
+bA
+bF
+bP
+bW
+cc
+bW
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(32,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+av
+aL
+aW
+be
+ac
+aO
+aO
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(33,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aw
+aM
+aX
+aX
+bj
+aO
+aO
+ar
+ar
+bG
+bQ
+bX
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(34,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+aO
+aO
+aO
+ar
+bH
+bH
+bY
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(35,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ax
+aN
+aY
+ac
+bk
+ar
+bq
+ac
+ar
+bI
+bR
+bH
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(36,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ay
+ar
+ar
+bf
+ar
+ar
+br
+ac
+aO
+bJ
+bS
+bH
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(37,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+az
+aO
+aO
+bf
+aO
+ar
+bs
+ac
+aO
+bK
+bK
+bH
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(38,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aA
+ar
+aO
+au
+aO
+aO
+bt
+ac
+ar
+ar
+ar
+ar
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(39,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aB
+ar
+aO
+bf
+aO
+aO
+aO
+aO
+aO
+ar
+ar
+aO
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(40,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+aC
+aO
+ar
+bf
+aO
+bn
+aO
+aO
+bB
+bL
+bT
+bZ
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(41,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+aD
+aP
+aZ
+ac
+au
+ac
+ac
+au
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(42,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ad
+aj
+ap
+ac
+ac
+ac
+ac
+ac
+aO
+ac
+bu
+aO
+bC
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(43,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ae
+ak
+aq
+ac
+aE
+aQ
+ba
+ba
+aO
+ac
+bv
+aO
+bv
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(44,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+af
+al
+ar
+au
+ar
+ar
+aO
+aO
+ar
+ac
+bv
+aO
+bv
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(45,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ag
+am
+ar
+ac
+aF
+aR
+aR
+bg
+bg
+ac
+bu
+aO
+bC
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(46,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ah
+an
+as
+ac
+aG
+aR
+aR
+bh
+bh
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(47,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ai
+ao
+at
+ac
+aH
+aS
+aH
+aH
+aH
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(48,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+aH
+aH
+aH
+aH
+aH
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(49,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(50,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(51,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(52,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(53,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(54,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(55,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(56,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(57,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(58,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(59,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(60,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(61,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(62,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(63,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(64,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(65,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(66,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(67,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(68,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(69,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(70,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(71,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(72,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(73,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(74,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(75,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+"}
+(76,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+"}
+(77,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(78,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(79,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(80,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(81,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(82,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(83,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(84,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+aa
+aa
+ab
+ab
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(85,1,1) = {"
+aa
+aa
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm
index cf2c5614634..23fc961f770 100644
--- a/_maps/map_files/Cerestation/cerestation.dmm
+++ b/_maps/map_files/Cerestation/cerestation.dmm
@@ -1922,9 +1922,6 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 8
@@ -1948,14 +1945,12 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
/obj/structure/cable/orange{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 8
@@ -3744,11 +3739,15 @@
},
/area/ai_monitored/security/armory)
"ahq" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 8;
+ layer = 2.4;
+ on = 1
},
-/turf/open/floor/plating/asteroid,
-/area/security/transfer)
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
"ahr" = (
/obj/structure/cable/orange{
d1 = 1;
@@ -4531,20 +4530,13 @@
},
/area/security/transfer)
"aiQ" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Security Transfer Range APC";
- pixel_x = 0;
- pixel_y = 24
+/obj/structure/chair{
+ dir = 4
},
-/obj/structure/cable/orange{
- d2 = 8;
- icon_state = "0-8"
- },
-/turf/open/floor/plating/astplate{
+/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"aiR" = (
/obj/structure/rack,
/obj/item/weapon/pickaxe/mini,
@@ -4952,10 +4944,13 @@
},
/area/security/transfer)
"ajJ" = (
-/turf/open/floor/plating/astplate{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"ajK" = (
/obj/structure/rack,
/obj/item/weapon/shovel,
@@ -5360,20 +5355,35 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/door/airlock/security{
+ name = "Interrogation Room";
+ req_access_txt = "0";
+ req_one_access_txt = "38;2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"akC" = (
+/obj/machinery/light/small,
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
},
/turf/open/floor/plating/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/security/transfer)
-"akC" = (
-/obj/machinery/light/small,
-/turf/open/floor/plating/asteroid,
-/area/security/transfer)
"akD" = (
/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"akE" = (
/obj/structure/disposalpipe/segment,
@@ -5719,15 +5729,35 @@
d2 = 2;
icon_state = "1-2"
},
-/turf/open/floor/plating{
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"alm" = (
-/turf/closed/wall/r_wall{
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 32
+ },
+/obj/machinery/camera{
+ c_tag = "Brig Cells North 2"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"aln" = (
/obj/structure/mineral_door/iron{
name = "Transfer Center"
@@ -5928,30 +5958,40 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/door/airlock/security{
- name = "Inmate Transfer Facility";
- req_access_txt = "2"
- },
-/turf/open/floor/plating{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/security/transfer)
+/area/security/prison)
"alL" = (
/obj/machinery/light/small{
dir = 8
},
/obj/item/weapon/ore/glass,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"alM" = (
/obj/item/weapon/shovel,
-/turf/open/floor/plating/astplate{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
},
/area/security/transfer)
"alN" = (
/obj/item/weapon/ore/glass,
-/turf/open/floor/plating/asteroid,
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ icon_plating = "asteroid_dug";
+ icon_state = "asteroid_dug";
+ name = "ditch"
+ },
/area/security/transfer)
"alO" = (
/obj/structure/closet/emcloset,
@@ -6391,9 +6431,6 @@
},
/area/security/prison)
"amA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/obj/structure/cable/orange{
d1 = 1;
d2 = 4;
@@ -6404,6 +6441,7 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -6414,20 +6452,15 @@
d2 = 4;
icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
/obj/structure/cable/orange{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
-/obj/machinery/camera{
- c_tag = "Brig Cells North 2"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_y = 32
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -9004,32 +9037,34 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"ary" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"arz" = (
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"arA" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"arB" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 4";
+ dir = 8;
+ network = list("SS13")
},
/turf/open/floor/engine,
-/area/space)
-"arB" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/grille,
-/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"arC" = (
/turf/closed/wall{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -15851,6 +15886,10 @@
req_one_access_txt = "19;41"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -15881,6 +15920,10 @@
req_one_access_txt = "19;41"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -17888,7 +17931,6 @@
pixel_x = 5;
pixel_y = 3
},
-/obj/item/weapon/stamp,
/obj/item/device/radio/intercom{
broadcasting = 0;
name = "Station Intercom (General)";
@@ -17896,6 +17938,7 @@
},
/obj/item/stack/packageWrap,
/obj/item/device/destTagger,
+/obj/item/weapon/stamp,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -22499,8 +22542,13 @@
icon_state = "1-4"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPn" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22514,8 +22562,13 @@
pixel_x = 0
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPo" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22533,7 +22586,9 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPp" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -22545,25 +22600,31 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"aPr" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/grille,
-/turf/open/space,
-/area/space)
-"aPr" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
+/obj/structure/window/reinforced{
+ dir = 1
},
-/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aPs" = (
/obj/structure/grille,
/obj/machinery/door/firedoor,
@@ -23762,11 +23823,10 @@
},
/area/hallway/primary/fore)
"aQS" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"aQT" = (
/obj/structure/window/reinforced{
dir = 1
@@ -23788,15 +23848,22 @@
/turf/open/floor/engine,
/area/space)
"aQV" = (
-/obj/machinery/door/airlock/glass,
-/turf/open/floor/plasteel/neutral/corner{
- tag = "icon-neutralcorner (NORTH)";
- icon_state = "neutralcorner";
- dir = 1;
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/area/hallway/primary/fore)
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aQW" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -23805,13 +23872,10 @@
},
/area/hallway/primary/fore)
"aQX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
/obj/structure/cable/orange{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
@@ -24994,9 +25058,10 @@
},
/area/hallway/primary/fore)
"aSQ" = (
-/obj/structure/window/reinforced,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"aSR" = (
/obj/machinery/door/airlock/glass,
/turf/open/floor/plasteel/neutral/corner{
@@ -25440,8 +25505,11 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTD" = (
/obj/structure/window/reinforced{
dir = 1
@@ -25451,8 +25519,11 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTE" = (
/obj/structure/window/reinforced{
dir = 1
@@ -25463,7 +25534,9 @@
},
/obj/structure/grille,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
"aTF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/airlock/atmos{
@@ -27380,6 +27453,9 @@
dir = 1
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -27850,16 +27926,27 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXD" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXE" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
@@ -27910,8 +27997,13 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXJ" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -27926,8 +28018,14 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXK" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -28036,8 +28134,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aXT" = (
/obj/structure/cable{
d1 = 1;
@@ -28076,8 +28179,13 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXY" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28091,8 +28199,14 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aXZ" = (
/obj/machinery/power/solar_control{
id = "foresolar";
@@ -28416,8 +28530,13 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYy" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28425,8 +28544,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYz" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -28440,8 +28564,13 @@
icon_state = "1-2"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYA" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -28652,17 +28781,14 @@
name = "Civilian Asteroid"
})
"aYU" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Medbay-Cargo Bridge";
- dir = 4;
- icon_state = "camera"
- },
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"aYV" = (
/obj/machinery/conveyor/auto{
tag = "icon-conveyor0 (EAST)";
@@ -29061,8 +29187,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
"aZN" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
@@ -29137,8 +29268,13 @@
dir = 9
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aZU" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -29153,8 +29289,14 @@
dir = 5
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"aZV" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -29212,6 +29354,9 @@
/area/hallway/primary/port)
"bac" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29363,8 +29508,13 @@
icon_state = "1-8"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"bat" = (
/obj/structure/disposalpipe/trunk{
dir = 1
@@ -29410,6 +29560,12 @@
},
/area/hallway/primary/port)
"bay" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29746,6 +29902,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -29942,6 +30101,9 @@
pixel_x = -32
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -30496,6 +30658,12 @@
pixel_x = 29;
pixel_y = 0
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (EAST)";
icon_state = "neutralcorner";
@@ -30571,6 +30739,9 @@
pixel_x = -24
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -31180,6 +31351,11 @@
d2 = 8;
icon_state = "2-8"
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -32150,6 +32326,9 @@
dir = 1
},
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -33966,6 +34145,9 @@
dir = 8;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -34487,6 +34669,12 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -34496,6 +34684,12 @@
dir = 1;
on = 1
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -37957,6 +38151,12 @@
icon_state = "camera";
network = list("SS13")
},
+/obj/machinery/button/door{
+ id = "cmooffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = 0;
+ pixel_y = -24
+ },
/mob/living/simple_animal/pet/cat/Runtime,
/turf/open/floor/plasteel/barber{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -38438,8 +38638,13 @@
dir = 5
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpN" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38453,8 +38658,13 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpO" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38467,8 +38677,13 @@
dir = 9
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bpP" = (
/obj/machinery/light{
dir = 4
@@ -38551,8 +38766,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpW" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38569,8 +38789,13 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpX" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
@@ -38587,8 +38812,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bpY" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -38635,6 +38865,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "cmooffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41048,15 +41281,24 @@
/turf/open/floor/engine,
/area/space)
"btW" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Service-Engineering Bridge 2";
- dir = 1
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"btX" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41069,6 +41311,12 @@
pixel_x = 0;
pixel_y = -29
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41077,6 +41325,12 @@
/area/hallway/primary/central)
"btZ" = (
/obj/machinery/light,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41087,6 +41341,12 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41104,6 +41364,12 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41112,6 +41378,12 @@
/area/hallway/primary/central)
"buc" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -41122,6 +41394,12 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41136,6 +41414,11 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41309,12 +41592,24 @@
dir = 2;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"bur" = (
/obj/machinery/light,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -41325,24 +41620,39 @@
pixel_x = 0;
pixel_y = -29
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"but" = (
/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/hallway/primary/central)
"buu" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Medbay-Engineering Bridge";
- dir = 1
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"buv" = (
/obj/machinery/door/airlock/glass,
/turf/open/floor/plasteel/neutral/corner{
@@ -41849,19 +42159,19 @@
dir = 6
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/floor/plating/asteroid/airless,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvv" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/grille,
-/turf/open/space,
-/area/space)
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvw" = (
/obj/structure/window/reinforced{
dir = 1
@@ -41871,8 +42181,11 @@
dir = 10
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"bvx" = (
/obj/machinery/door/airlock/maintenance{
name = "External Airlock Access";
@@ -42199,8 +42512,11 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvW" = (
/obj/structure/window/reinforced{
dir = 1
@@ -42213,8 +42529,11 @@
dir = 4
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvX" = (
/obj/structure/window/reinforced{
dir = 1
@@ -42228,8 +42547,11 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"bvY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -53296,6 +53618,9 @@
icon_state = "0-4"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53313,6 +53638,9 @@
icon_state = "4-8";
pixel_x = 0
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53338,6 +53666,9 @@
icon_state = "4-8";
pixel_x = 0
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53359,6 +53690,9 @@
icon_state = "0-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -54299,6 +54633,13 @@
pixel_y = 8;
req_access_txt = "10;11"
},
+/obj/machinery/button/door{
+ id = "ceoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24;
+ pixel_y = -8;
+ req_access_txt = "10;11"
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55644,6 +55985,7 @@
/area/atmos)
"bSJ" = (
/obj/machinery/computer/apc_control,
+/obj/machinery/light,
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55665,6 +56007,11 @@
/area/crew_quarters/chief)
"bSL" = (
/obj/machinery/suit_storage_unit/ce,
+/obj/machinery/airalarm{
+ dir = 1;
+ icon_state = "alarm0";
+ pixel_y = -22
+ },
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -58987,8 +59334,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bYM" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -59004,8 +59356,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bYN" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -59290,8 +59647,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bZo" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -59305,8 +59667,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"bZp" = (
/obj/machinery/light{
dir = 8
@@ -61264,17 +61631,10 @@
name = "Central Asteroid Maintenance"
})
"cdj" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/obj/machinery/camera{
- c_tag = "Docking-Medbay Bridge";
- dir = 8;
- network = list("SS13")
- },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cdk" = (
/obj/structure/disposalpipe/junction{
icon_state = "pipe-j2";
@@ -61528,6 +61888,12 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -62223,6 +62589,12 @@
dir = 4;
pixel_x = 24
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -62678,21 +63050,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/open/floor/plating/airless/astplate{
- baseturf = /turf/open/floor/plating/asteroid/airless
- },
-/area/mine/unexplored{
- name = "Civilian Asteroid"
- })
-"cfO" = (
+/obj/structure/grille,
/obj/structure/window/reinforced{
dir = 8
},
+/turf/open/floor/plating/airless/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"cfO" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cfP" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
@@ -62700,16 +63075,20 @@
},
/area/hallway/primary/port)
"cfQ" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cfR" = (
/obj/structure/window/reinforced{
dir = 8
@@ -62722,11 +63101,15 @@
d2 = 4;
icon_state = "2-4"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cfS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -62768,8 +63151,13 @@
icon_state = "pipe-c"
},
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cfV" = (
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
@@ -62785,8 +63173,13 @@
},
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"cfW" = (
/obj/structure/table,
/obj/item/toy/figure/clown,
@@ -62837,11 +63230,15 @@
pixel_x = 0
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgb" = (
/obj/structure/window/reinforced{
@@ -62853,11 +63250,15 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Civilian Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -62972,9 +63373,6 @@
name = "Port Asteroid Maintenance"
})
"cgp" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/machinery/light{
dir = 8
},
@@ -62982,7 +63380,9 @@
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/port)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgq" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -63083,6 +63483,9 @@
icon_state = "tube1";
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -63167,6 +63570,9 @@
pixel_x = 28;
pixel_y = 0
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -63224,26 +63630,24 @@
name = "Research Asteroid"
})
"cgT" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating/airless/astplate{
+/turf/closed/wall/r_wall{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgU" = (
-/obj/structure/window/reinforced{
+/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgV" = (
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
@@ -63251,36 +63655,31 @@
},
/area/hallway/primary/aft)
"cgW" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
+/obj/structure/disposalpipe/segment,
/obj/machinery/camera{
c_tag = "Service-Research Bridge";
dir = 9;
icon_state = "camera"
},
-/obj/structure/disposalpipe/segment,
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"cgX" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/open/floor/plating/airless/astplate{
+/turf/closed/wall/r_wall{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"cgY" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -63324,16 +63723,14 @@
name = "Aft Asteroid Maintenance"
})
"chd" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine{
baseturf = /turf/open/floor/plating/asteroid/airless;
name = "reinforced floor"
},
-/area/hallway/primary/aft)
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
"che" = (
/obj/machinery/power/solar{
id = "portsolar";
@@ -63507,6 +63904,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -64193,11 +64595,15 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"ciE" = (
/obj/structure/window/reinforced{
@@ -64211,11 +64617,15 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plating/airless/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
-/area/mine/unexplored{
- name = "Research Asteroid"
+/area/construction/hallway{
+ name = "Service-Science Bridge"
})
"ciF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -68698,8 +69108,13 @@
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced,
/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cqD" = (
/turf/closed/wall{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -69557,6 +69972,11 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/neutral/side{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 1;
@@ -70509,6 +70929,12 @@
dir = 1;
pixel_y = -24
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70521,6 +70947,12 @@
dir = 4;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70532,6 +70964,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
icon_state = "neutralcorner";
dir = 8;
@@ -70539,44 +70977,50 @@
},
/area/hallway/primary/aft)
"ctA" = (
-/obj/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/machinery/camera{
c_tag = "Research-Docking Bridge 1";
dir = 1;
icon_state = "camera";
network = list("SS13")
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctB" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Research-Docking Bridge 2";
- dir = 1;
- icon_state = "camera";
- network = list("SS13")
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Science-Docking Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctC" = (
-/obj/structure/window/reinforced,
-/obj/machinery/camera{
- c_tag = "Research-Docking Bridge 3";
- dir = 1;
- icon_state = "camera";
- network = list("SS13")
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"ctD" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment{
@@ -70978,8 +71422,11 @@
/obj/structure/lattice/catwalk,
/obj/structure/girder,
/obj/structure/grille,
+/obj/structure/window/reinforced,
/turf/open/space,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cul" = (
/obj/machinery/status_display{
density = 0;
@@ -75746,6 +76193,9 @@
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -75755,6 +76205,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -75773,6 +76226,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -76682,6 +77138,7 @@
icon_state = "camera";
network = list("SS13")
},
+/obj/item/clothing/neck/stethoscope,
/turf/open/floor/plasteel/whitepurple/side{
tag = "icon-whitepurple (SOUTHWEST)";
icon_state = "whitepurple";
@@ -76730,6 +77187,7 @@
/obj/machinery/newscaster/security_unit{
pixel_x = -28
},
+/obj/machinery/recharger,
/turf/open/floor/plasteel/red/side{
icon_state = "red";
dir = 8;
@@ -83054,7 +83512,9 @@
"cPD" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
"cPE" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
@@ -83142,12 +83602,11 @@
/turf/open/floor/engine,
/area/space)
"cPT" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
/obj/structure/disposalpipe/segment,
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
"cPU" = (
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -83339,6 +83798,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (EAST)";
icon_state = "neutralcorner";
@@ -83358,6 +83823,9 @@
"cQC" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -83414,6 +83882,9 @@
/area/hallway/primary/central)
"cQJ" = (
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -83846,14 +84317,13 @@
},
/area/hallway/primary/starboard)
"cRM" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
"cRN" = (
/obj/structure/window/reinforced{
dir = 1
@@ -84231,7 +84701,9 @@
dir = 4
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
"cSD" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -84805,6 +85277,12 @@
dir = 4;
icon_state = "pipe-c"
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -84821,6 +85299,12 @@
"cTX" = (
/obj/machinery/door/airlock/glass,
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/neutral/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -85064,12 +85548,19 @@
},
/area/teleporter)
"cUy" = (
-/obj/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
"cUz" = (
/obj/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
@@ -87179,6 +87670,10 @@
req_one_access = null;
req_one_access_txt = "0"
},
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87192,6 +87687,10 @@
req_one_access = null;
req_one_access_txt = "0"
},
+/obj/machinery/door/poddoor/preopen{
+ id = "bridge";
+ name = "Emergency Blast Door"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87277,6 +87776,9 @@
/obj/structure/window/reinforced/fulltile,
/obj/structure/grille,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "qmoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87294,6 +87796,9 @@
"cZQ" = (
/obj/structure/window/reinforced/fulltile,
/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "qmoffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -87530,6 +88035,11 @@
/area/quartermaster/qm)
"dap" = (
/obj/structure/closet/secure_closet/quartermaster,
+/obj/machinery/button/door{
+ id = "qmoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/brown{
tag = "icon-brown (WEST)";
icon_state = "brown";
@@ -88359,6 +88869,9 @@
icon_state = "alarm0";
pixel_x = -22
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/neutral/corner{
tag = "icon-neutralcorner (NORTH)";
icon_state = "neutralcorner";
@@ -90292,6 +90805,9 @@
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "cmooffice"
+ },
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -91711,7 +92227,6 @@
},
/obj/item/weapon/stamp/ce,
/obj/item/weapon/pen,
-/obj/machinery/light,
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -91722,10 +92237,8 @@
d2 = 4;
icon_state = "1-4"
},
-/obj/machinery/airalarm{
- dir = 1;
- icon_state = "alarm0";
- pixel_y = -22
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel/neutral{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -92435,17 +92948,13 @@
name = "Central Asteroid Maintenance"
})
"djU" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/obj/machinery/camera{
- c_tag = "Docking-Medbay Bridge 2";
- dir = 8;
- network = list("SS13")
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/engine,
-/area/space)
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
"djV" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance,
@@ -93766,6 +94275,12 @@
scrub_N2O = 0;
scrub_Toxins = 0
},
+/obj/machinery/button/door{
+ id = "rdoffice";
+ name = "Office Emergency Lockdown";
+ pixel_x = -24;
+ pixel_y = -8
+ },
/turf/open/floor/plasteel/cafeteria{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -94369,10 +94884,10 @@
/obj/structure/disposaloutlet{
dir = 8
},
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
/obj/structure/lattice/catwalk,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
/turf/open/space,
/area/space)
"dnB" = (
@@ -96655,6 +97170,4503 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/incinerator)
+"dsd" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Armory APC";
+ pixel_x = 0;
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/structure/rack,
+/obj/item/weapon/storage/box/chemimp{
+ pixel_x = 4;
+ pixel_y = 3
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/morphine,
+/turf/open/floor/plasteel/darkred/side{
+ icon_state = "darkred";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dse" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/rack,
+/obj/item/weapon/storage/lockbox/loyalty,
+/obj/item/weapon/storage/box/trackimp,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkred/side{
+ icon_state = "darkred";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsf" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsg" = (
+/obj/structure/closet/secure_closet{
+ name = "contraband locker";
+ req_access_txt = "3"
+ },
+/obj/effect/spawner/lootdrop/armory_contraband{
+ loot = list(/obj/item/weapon/gun/ballistic/automatic/pistol = 5, /obj/item/weapon/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/weapon/gun/ballistic/revolver/mateba, /obj/item/weapon/gun/ballistic/automatic/pistol/deagle, /obj/item/weapon/storage/box/syndie_kit/throwing_weapons = 3)
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/ai_monitored/security/armory)
+"dsh" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber{
+ on = 1;
+ scrub_N2O = 0;
+ scrub_Toxins = 0
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsi" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsj" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsk" = (
+/obj/machinery/airalarm{
+ frequency = 1439;
+ locked = 0;
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsl" = (
+/obj/machinery/camera{
+ c_tag = "Security Interrogation";
+ dir = 9;
+ icon_state = "camera";
+ network = list("SS13");
+ tag = "null"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsn" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dso" = (
+/obj/structure/table/wood,
+/obj/item/device/flashlight/lamp,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsp" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsq" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dss" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dst" = (
+/obj/structure/table/wood,
+/obj/item/device/taperecorder,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsu" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsv" = (
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsz" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsB" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door_timer{
+ id = "Cell 8";
+ name = "Cell 8";
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsC" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Security Transfer Range APC";
+ pixel_x = 0;
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsD" = (
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsE" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsF" = (
+/obj/structure/mineral_door/iron{
+ name = "Transfer Center"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsG" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door_timer{
+ id = "Cell 7";
+ name = "Cell 7";
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsH" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable/orange{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/prison)
+"dsI" = (
+/obj/machinery/door/airlock/security{
+ name = "Inmate Transfer Facility";
+ req_access_txt = "2"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsJ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsK" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsL" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsM" = (
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/astplate{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/security/transfer)
+"dsN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsO" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/glass_engineering{
+ name = "Chief Engineer's Office";
+ req_access_txt = "56"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/neutral{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsP" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "ceoffice"
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dsQ" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 4";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsR" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 1";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsS" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 2";
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsT" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/turf/open/space,
+/area/space)
+"dsU" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge Ceneter";
+ dir = 1
+ },
+/turf/open/space,
+/area/space)
+"dsV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dsX" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsY" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dsZ" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dta" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtb" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dte" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtg" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dth" = (
+/obj/machinery/camera{
+ c_tag = "Command-Service Bridge";
+ dir = 4;
+ icon_state = "camera"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dti" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtj" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtk" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtl" = (
+/obj/machinery/camera{
+ c_tag = "Command-Engineering Bridge";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dto" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtp" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dts" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Medical-Cargo Bridge APC";
+ pixel_x = -25
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtt" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtu" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtv" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtw" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtx" = (
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Command-Service Bridge APC";
+ pixel_x = -25
+ },
+/obj/structure/cable{
+ icon_state = "0-4";
+ d2 = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dty" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtz" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtA" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtC" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtD" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtL" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtM" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtP" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtR" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dtS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dtU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtV" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/camera{
+ c_tag = "Medbay-Cargo Bridge";
+ dir = 4;
+ icon_state = "camera"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtX" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtY" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dtZ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dua" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dub" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duc" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dud" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"due" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duf" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dug" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dui" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"duk" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/port)
+"dul" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/neutral{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dum" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dun" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duo" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dup" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dur" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dus" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dut" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duu" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dux" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duy" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duA" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duB" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duC" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duD" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"duE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duG" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duJ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duL" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duM" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duP" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duQ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duR" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duS" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duT" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duU" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"duZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dva" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvb" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dve" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvl" = (
+/obj/machinery/camera{
+ c_tag = "Service-Engineering Bridge 1";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvm" = (
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Service-Engineering Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvn" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvo" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvp" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvq" = (
+/obj/machinery/camera{
+ c_tag = "Service-Engineering Bridge 2";
+ dir = 1
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvr" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvs" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvt" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvu" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvv" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvw" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dvx" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvy" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvz" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvA" = (
+/obj/machinery/camera{
+ c_tag = "Medbay-Engineering Bridge";
+ dir = 1
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvB" = (
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Engineering-Medical Bridge APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvC" = (
+/obj/machinery/camera{
+ c_tag = "Medbay-Engineering Bridge 2";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dvD" = (
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvE" = (
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvF" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvG" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvH" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvI" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvJ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvK" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvL" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvM" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvN" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvO" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvP" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvQ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvR" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvS" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvT" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvU" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvV" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvW" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvX" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvY" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dvZ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Service-Engineering Bridge"
+ })
+"dwa" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwb" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwc" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Engineering-Medical Bridge"
+ })
+"dwd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwe" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwl" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwm" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwp" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwq" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dws" = (
+/obj/machinery/camera{
+ c_tag = "Docking-Medbay Bridge";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwt" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dww" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwx" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwy" = (
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Docking-Medical Bridge APC";
+ pixel_x = 24;
+ pixel_y = 0
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwz" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwC" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwD" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwE" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwF" = (
+/obj/machinery/camera{
+ c_tag = "Docking-Medbay Bridge 2";
+ dir = 8;
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dwH" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwI" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwL" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwM" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwN" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 24
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/starboard)
+"dwO" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwP" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwQ" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwR" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwS" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwT" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwU" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwV" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwW" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dwZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxa" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxb" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxe" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxg" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxl" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxm" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxp" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxs" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxt" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxw" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxx" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxy" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxz" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxA" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxB" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxC" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxD" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxG" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxJ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxK" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxL" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxM" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxN" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxO" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxP" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxQ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxR" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxS" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxT" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxU" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxV" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxW" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxX" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxY" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dxZ" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dya" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyb" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyc" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyd" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dye" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyf" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyg" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyh" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyi" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyj" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyk" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyl" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dym" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyn" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyo" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyp" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyq" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyr" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dys" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyt" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyu" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyv" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyw" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyx" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyy" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyz" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyA" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyB" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyC" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyD" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyE" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyF" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyG" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyH" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyI" = (
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyJ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyK" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyL" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ icon_state = "neutralcorner";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/aft)
+"dyM" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 5";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 2";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyO" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyR" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyS" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyT" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyU" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyV" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 3";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyW" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyX" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyY" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dyZ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dza" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Research-Docking Bridge 4";
+ dir = 1;
+ icon_state = "camera";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzb" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzc" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzd" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dze" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzf" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzg" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzh" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzi" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzj" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dzk" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzl" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzm" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"dzn" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/space,
+/area/space)
+"dzo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/structure/grille,
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzp" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzq" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzr" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzs" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzt" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzv" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzx" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzz" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzA" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzB" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzC" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzD" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzE" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzG" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzH" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzI" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzJ" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzK" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzM" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzN" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzO" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzP" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzQ" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 1";
+ dir = 8;
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzR" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzS" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzT" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzU" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzV" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzW" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzX" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dzZ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAa" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAb" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAc" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAd" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAe" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAf" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAg" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAh" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAi" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAk" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAl" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAm" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAn" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAp" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAq" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAs" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAt" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAv" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAw" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAx" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAy" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAz" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAA" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 2";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAB" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAC" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Cargo-AI-Command Bridge APC";
+ pixel_y = 24
+ },
+/obj/structure/cable/orange{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAD" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAE" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAF" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAG" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAH" = (
+/obj/machinery/camera{
+ c_tag = "Core-Command-Cargo Bridge 3";
+ network = list("SS13")
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAI" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAJ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAK" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAL" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAM" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAN" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAO" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAP" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAQ" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAR" = (
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/structure/cable/orange{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/structure/cable/orange{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
+"dAT" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAU" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAV" = (
+/obj/machinery/light/small,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAW" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAX" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAY" = (
+/obj/machinery/light/small,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dAZ" = (
+/obj/machinery/light,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBa" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBb" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBc" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBd" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBe" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBf" = (
+/turf/closed/wall/r_wall,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBg" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/construction/hallway{
+ name = "Cargo-AI-Command Bridge"
+ })
+"dBh" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBi" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBj" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Service Bridge"
+ })
+"dBk" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBl" = (
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Command-Engineering Bridge APC";
+ pixel_x = 24;
+ pixel_y = 0
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBm" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBn" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Medical-Cargo Bridge"
+ })
+"dBo" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBp" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBq" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBr" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBs" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBt" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBu" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Command-Engineering Bridge"
+ })
+"dBv" = (
+/obj/machinery/door/airlock/glass,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBw" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBx" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBy" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBz" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (EAST)";
+ icon_state = "neutralcorner";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/central)
+"dBA" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Docking-Medical Bridge"
+ })
+"dBB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBC" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Service-Science Bridge APC";
+ pixel_x = 23;
+ pixel_y = 2
+ },
+/obj/structure/cable,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBE" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBF" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/engine{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ name = "reinforced floor"
+ },
+/area/construction/hallway{
+ name = "Service-Science Bridge"
+ })
+"dBG" = (
+/obj/effect/landmark/lightsout,
+/turf/open/floor/engine,
+/area/construction/hallway{
+ name = "Science-Docking Bridge"
+ })
+"dBH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/neutral/corner{
+ tag = "icon-neutralcorner (NORTH)";
+ icon_state = "neutralcorner";
+ dir = 1;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/hallway/primary/fore)
(1,1,1) = {"
aaa
@@ -108308,7 +113320,7 @@ abE
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
aaa
@@ -109523,11 +114535,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -109780,11 +114792,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110037,11 +115049,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110294,11 +115306,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110551,11 +115563,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110808,11 +115820,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
aaa
@@ -110879,18 +115891,18 @@ aLm
aXC
aXS
aXS
+dsX
aXS
aXS
aXS
+dsX
+aXS
+aXS
+dsX
aXS
aXS
aXS
-aXS
-aXS
-aXS
-aXS
-aXS
-aXS
+dsX
aXS
aXS
aZM
@@ -110964,16 +115976,16 @@ cfN
cga
cga
cga
+dBB
+cga
+cga
+dBB
+cga
+cga
+dBB
cga
cga
cga
-cgT
-cgT
-cgT
-cgT
-cgT
-cgT
-cgT
ciD
cjg
cjg
@@ -111065,11 +116077,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
abC
abE
@@ -111133,24 +116145,24 @@ aSU
aVB
aSU
aSR
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-aYI
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dth
+dsV
+dsV
+dtx
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
baa
baw
baY
@@ -111225,13 +116237,13 @@ cgp
cfO
cfO
cgU
-cgU
-cgU
-cgU
-cgU
-cgU
-cgU
-cgU
+cfO
+cfO
+cgp
+cfO
+cfO
+cfO
+cfO
cjh
cjF
cjF
@@ -111390,24 +116402,24 @@ aRD
aRD
aRD
aRP
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dBj
+dsV
+dty
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
+dsV
bab
bax
baZ
@@ -111474,21 +116486,21 @@ bTq
bax
bax
bab
-cfP
-cfP
-cfP
-cfP
-cfP
-cfP
-cfP
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
-cgV
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
+cfO
cji
cjG
cjG
@@ -111591,7 +116603,7 @@ abE
abW
acH
acH
-abW
+acO
acO
acO
acO
@@ -111647,26 +116659,26 @@ aSN
aSN
aSN
aSP
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
+dsV
+dsV
+dsV
+dsY
+dsV
+dsV
+dsV
+dti
+dsV
+dsV
+dtz
+dtG
+dtG
+dtG
+dtQ
+dtG
+dtG
+dtG
bac
-bay
+duk
bba
bbA
bbA
@@ -111735,17 +116747,17 @@ cfQ
cfQ
cfQ
cfQ
-cfQ
-cfQ
-cfQ
+dBC
+dBE
+dBE
cgW
-chd
-chd
-cho
-chd
-chd
-chd
-chd
+dBE
+dBE
+dBE
+dBE
+dBE
+dBE
+dBE
cjj
cTY
ckn
@@ -111848,7 +116860,7 @@ abE
abW
acH
acH
-abW
+acO
acO
acO
acO
@@ -111907,18 +116919,18 @@ aLm
aXD
aXD
aXD
+dsZ
aXD
aXD
aXD
+dsZ
+aXD
+aXD
+dsZ
aXD
aXD
aXD
-aXD
-aXD
-aXD
-aXD
-aXD
-aXD
+dsZ
aXD
aXD
aXD
@@ -111992,16 +117004,16 @@ cfR
cgb
cgb
cgb
+dBD
+cgb
+cgb
+dBD
+cgb
+cgb
+dBD
cgb
cgb
cgb
-cgX
-cgX
-cgX
-cgX
-cgX
-cgX
-cgX
ciE
cjg
cjg
@@ -112105,7 +117117,6 @@ abE
abW
acH
acH
-abW
acO
acO
adF
@@ -112114,6 +117125,7 @@ aeB
aeB
aeB
aeB
+aeB
agr
doX
doZ
@@ -112362,10 +117374,10 @@ abW
abW
abW
abW
-abW
acO
acO
-adG
+dsd
+aec
aeb
aeC
aeY
@@ -112610,7 +117622,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -112619,15 +117631,15 @@ abW
abW
abW
abW
-abW
acO
acO
-adH
+dse
aec
aeD
aeD
aeD
aeD
+aeD
agt
acO
acO
@@ -112867,7 +117879,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -112876,10 +117888,10 @@ abE
abW
abW
abW
-abW
acO
acO
adI
+dsf
aed
aeE
aeZ
@@ -113124,7 +118136,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -113133,12 +118145,12 @@ abE
abW
abW
abW
-abW
acO
acO
adJ
aee
aeF
+aeD
afa
afu
afO
@@ -113381,7 +118393,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abE
@@ -113390,12 +118402,12 @@ abE
abW
abW
abW
-abW
acO
acO
adK
aef
aef
+aee
afb
aee
afP
@@ -113647,10 +118659,10 @@ abE
abW
abW
abW
-abW
acO
acO
-adL
+adM
+aef
aef
aef
aef
@@ -113904,12 +118916,12 @@ abE
abW
abW
abW
-abW
acO
acO
adM
aeg
aeG
+dsg
afc
afv
aeG
@@ -114161,7 +119173,6 @@ abE
abW
abW
abW
-abW
acO
acO
doV
@@ -114173,6 +119184,7 @@ acO
acO
acO
acO
+acO
afr
afr
afr
@@ -114418,7 +119430,6 @@ abE
abW
abW
acH
-acH
acO
acO
acO
@@ -114428,20 +119439,21 @@ acO
acO
acO
acO
-acO
-acO
-aiO
-ajI
+afr
+afr
+afr
+dsr
+dsm
akB
all
alK
amA
ant
+apr
+apr
aol
apr
apr
-apr
-aol
asV
apr
apr
@@ -114684,22 +119696,22 @@ abW
abW
abW
abW
-abW
-agy
-agy
-aiP
-ajJ
-ajJ
-alm
afr
+dsh
+dsm
+dss
+ajJ
+akt
+alm
+dsA
amB
-anp
-aom
-aps
+dsB
aqg
anp
-aom
-asW
+dsE
+dsG
+dsH
+anp
aqg
anp
aom
@@ -114941,13 +119953,11 @@ abW
abW
abW
abW
-abW
-agy
-agz
-aiQ
-agA
-ajJ
-ajJ
+afr
+dsi
+dsn
+dsn
+dsx
afr
amC
anu
@@ -114957,6 +119967,8 @@ amC
ard
aon
alH
+dsI
+alH
amC
avf
aon
@@ -115198,13 +120210,11 @@ acH
acH
abW
abW
-abW
-afR
-afR
-agA
-agA
-agA
-agA
+afr
+dsj
+dso
+dst
+dsx
afr
amD
ann
@@ -115214,6 +120224,8 @@ amD
ann
aoo
alH
+dsJ
+alH
amD
ann
aoo
@@ -115454,14 +120466,12 @@ acH
acH
acH
abW
-acH
-acH
-afR
-afR
-agy
-ajJ
-agA
-agA
+abW
+afr
+dsk
+dsp
+dsp
+dsz
afr
amE
anv
@@ -115471,6 +120481,8 @@ aqh
ann
ann
alH
+dsJ
+alH
auc
ann
ann
@@ -115711,14 +120723,12 @@ acH
acH
acH
abW
-acH
-acH
-acH
-afR
-agz
+abW
+afr
+dsl
+dsj
+dsj
ahq
-agA
-agA
afr
amF
anw
@@ -115728,6 +120738,8 @@ aqi
anw
asb
alH
+aiP
+alH
aud
anw
awt
@@ -115968,14 +120980,7 @@ abW
acH
acH
acH
-acH
-afR
-agy
-agy
-agA
-agA
-agA
-agA
+abW
afr
afr
afr
@@ -115990,6 +120995,13 @@ afr
afr
afr
afr
+dsL
+afr
+afr
+afr
+afr
+afr
+afr
afr
afr
afr
@@ -116225,23 +121237,23 @@ abW
acH
acH
acH
-afR
+abW
+abW
+abW
+abW
+abW
+abW
+abW
+agy
+agy
+agy
+agy
+agy
agy
agA
agA
-agA
-agA
-ajJ
-agA
+aiP
agy
-agy
-agy
-agy
-agy
-agy
-agy
-adZ
-adZ
adZ
adZ
adZ
@@ -116482,26 +121494,26 @@ abW
acH
acH
acH
-afR
-agz
-ahq
-agA
-agA
-agA
-agA
+acH
+acH
+acH
+acH
+acH
+acH
+acH
agy
aig
agy
+agz
+dsC
+agz
+aiO
+ajI
+dsM
agy
-agA
-agA
-agy
-agy
-afS
-afS
-afS
-afV
-afV
+adZ
+adZ
+adZ
adZ
adZ
azY
@@ -116739,28 +121751,28 @@ abW
abW
abW
acH
-afR
-agA
-agA
-aie
-agA
-agA
-akC
-agz
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+agy
alL
akD
amG
-amG
-alN
-agA
+aiP
+agz
+dsF
agy
-afV
-asX
-aue
-avg
-afS
-axD
-afS
+agy
+agy
+adZ
+adZ
+adZ
+adZ
+adZ
azY
aBs
aCi
@@ -116996,28 +122008,28 @@ abW
abW
abW
acH
-afR
-agA
-agA
-agA
-agA
-agA
-akD
-aln
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+agy
alM
amG
anx
-amG
-amG
+dsD
+ajI
akC
agz
-afV
-aym
-auf
-aym
afS
-akp
-aOF
+afS
+afS
+afV
+afV
+axD
+afS
cJJ
aBt
aCj
@@ -117253,13 +122265,13 @@ abW
abW
abW
acH
-afR
-agy
-agA
-aif
-aiR
-ajK
-agy
+acH
+acH
+acH
+acH
+acH
+acH
+abW
agy
alN
alN
@@ -117269,11 +122281,11 @@ agA
afR
afR
afV
-asY
-aym
-cYZ
-akH
-axE
+asX
+aue
+avg
+afS
+akp
ayA
azY
aBu
@@ -117340,9 +122352,9 @@ aZm
bon
bpM
cRM
-arz
-arz
-bvm
+duE
+duE
+dvD
bwV
byz
bzM
@@ -117511,25 +122523,25 @@ abW
abW
acH
acH
-agy
-agy
-aig
+abW
+abW
+acH
+acH
+acH
+acH
afR
afR
afR
afR
+aiR
+ajK
afR
-afR
-afR
-afR
-agy
-afR
-aez
-afV
-afV
-afV
-afV
+acH
afV
+aym
+auf
+aym
+afS
akp
cYo
cJK
@@ -117597,9 +122609,9 @@ bjB
arw
bpN
cRM
-arz
-arz
-bvm
+duE
+duE
+dvD
bwW
bvm
aZn
@@ -117768,26 +122780,26 @@ abW
abW
abW
abW
-adZ
-adZ
-adZ
-aez
-aez
-aez
-aez
-aez
-aez
-aez
-aez
-adZ
-adZ
-aez
-adZ
-aez
-aez
-adZ
-afS
-akp
+abW
+abW
+abW
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+abW
+abW
+acH
+afV
+asY
+aym
+cYZ
+akH
+axE
cZm
cJK
aBs
@@ -117854,8 +122866,8 @@ aaa
arw
bpN
cRM
-arz
-aSQ
+duE
+duE
bvu
bwX
bjB
@@ -118039,9 +123051,9 @@ aez
aez
aez
aez
-aez
afV
-afS
+afV
+afV
afV
afV
cZj
@@ -118109,10 +123121,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+duE
bvv
arw
aaa
@@ -118368,9 +123380,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -118625,9 +123637,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -118882,9 +123894,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119139,9 +124151,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119394,10 +124406,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvl
bvv
arw
aaa
@@ -119653,9 +124665,9 @@ aaa
arw
bpN
cRM
-arz
-btV
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -119910,9 +124922,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120167,9 +125179,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120424,9 +125436,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -120679,10 +125691,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+dux
+duE
+duE
bvv
arw
aaa
@@ -120938,9 +125950,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121195,9 +126207,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121452,9 +126464,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+duE
+dvF
arw
aaa
aaa
@@ -121707,10 +126719,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+dux
+duE
+dvm
bvv
arw
aaa
@@ -121956,7 +126968,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
abC
@@ -121966,9 +126978,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122223,9 +127235,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122480,9 +127492,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122737,9 +127749,9 @@ aaa
arw
bpN
cRM
-arz
-btW
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -122810,8 +127822,8 @@ cph
cpM
cqB
crL
-cjG
-ctv
+csz
+dyJ
cUn
cjU
ckB
@@ -122992,10 +128004,10 @@ aaa
aaa
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvq
bvv
arw
aaa
@@ -123251,9 +128263,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -123263,24 +128275,24 @@ bAd
byQ
bEj
dpl
-dpm
+dpl
dpn
dpo
dpp
dpq
dpr
-dps
-dpt
+dpr
+dpr
+dpu
+dpr
+dpr
+dpu
+dpr
+dpr
+dpr
+dpr
+dpu
dpu
-dpv
-dpw
-dpx
-dpy
-dpz
-dpB
-dpD
-dpF
-dpH
caf
bBN
bBN
@@ -123325,7 +128337,7 @@ cpO
cmY
cjF
cjG
-ctv
+dyK
cUn
cjU
dlF
@@ -123508,9 +128520,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aaa
@@ -123582,7 +128594,7 @@ cpP
cmY
cjF
cjG
-ctv
+dyK
cUn
cgN
dlG
@@ -123765,9 +128777,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aaa
aZt
@@ -124022,9 +129034,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZt
aZt
@@ -124053,8 +129065,8 @@ bYp
bXG
bOM
cbr
-dpN
-dpP
+dpJ
+dpL
cMH
byS
cbr
@@ -124277,10 +129289,10 @@ aZf
aZf
aaa
arw
-bpN
-cRM
-arz
-aSQ
+dum
+duv
+duE
+dvn
bvv
arw
aZt
@@ -124311,8 +129323,8 @@ bXG
bOM
byS
dfU
-dpQ
-dpS
+dpJ
+dpL
byS
cbr
dgD
@@ -124351,8 +129363,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
cgN
@@ -124536,9 +129548,9 @@ aaa
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZf
aZt
@@ -124570,9 +129582,9 @@ bAd
diS
djs
dpT
-dpW
-dpY
-dqa
+dpp
+dpq
+dpL
cMH
cMH
byS
@@ -124608,9 +129620,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-dlz
+dwX
+dwX
+cUy
cuk
cgN
cgN
@@ -124793,9 +129805,9 @@ aZf
arw
bpN
cRM
-arz
-aSQ
-bvv
+duE
+dvn
+dvF
arw
aZf
aZt
@@ -124865,8 +129877,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125050,8 +130062,8 @@ aZf
boo
bpO
cRM
-arz
-aSQ
+duE
+dvn
bvw
bwY
aZf
@@ -125086,7 +130098,7 @@ cMV
cbr
byS
cbr
-dqc
+dqb
djm
bAd
aZt
@@ -125122,8 +130134,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125343,7 +130355,7 @@ cbr
dgD
cNc
dht
-dqd
+dqb
djO
byS
aZH
@@ -125378,11 +130390,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dyM
+dwO
aaa
aaa
aXR
@@ -125565,7 +130577,7 @@ boq
cQD
cSs
baO
-bhM
+dvr
bal
cKO
bal
@@ -125600,7 +130612,7 @@ cMW
cbr
cMH
bAd
-dqe
+dqb
djP
djl
aZH
@@ -125636,8 +130648,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -125822,7 +130834,7 @@ bor
cQW
baN
baO
-bhM
+dvr
bal
bwZ
bal
@@ -125857,7 +130869,7 @@ bOM
bOM
bOM
byS
-dqf
+dqb
bAe
cMH
aZH
@@ -125893,8 +130905,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126114,13 +131126,13 @@ cbi
cbi
bOM
dge
-dqg
+dqb
+dqr
+dqr
+dqs
+dqs
+dqr
dqr
-dqJ
-dqR
-dqZ
-drh
-drp
aaa
aaa
aaa
@@ -126150,8 +131162,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126371,13 +131383,13 @@ cbj
cbP
bOM
dfU
-dqh
+dqb
dqs
dqK
dqS
dra
dri
-drq
+dqr
aaa
aaa
aaa
@@ -126407,8 +131419,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -126593,7 +131605,7 @@ bcY
cQW
baN
baO
-bhM
+dvr
bal
bxa
bcp
@@ -126628,18 +131640,18 @@ cbi
cbi
bOM
cbr
-dqi
-dqt
+dqb
+dqr
+dqL
dqL
-dqT
drb
drj
drr
drx
drD
-drJ
-drP
-drV
+drD
+drD
+drD
drZ
aaa
aaa
@@ -126663,11 +131675,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxg
+dwX
ctA
-cuk
+dwO
abC
abC
aXR
@@ -126892,10 +131904,10 @@ dqU
drc
drk
drs
-dry
-drE
+drs
+drs
drK
-drQ
+drO
arw
arw
aaa
@@ -126921,8 +131933,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127143,17 +132155,17 @@ cbk
bOM
cbr
dqk
-dqv
+dqr
dqN
dqV
drd
drl
drt
drz
-drF
+drt
drL
-drR
-drW
+drO
+drO
dsa
aaa
aaa
@@ -127178,8 +132190,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127399,8 +132411,8 @@ cbl
cbQ
bOM
cbr
-dql
-dqw
+dqk
+dqs
dqO
dqW
dre
@@ -127435,8 +132447,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -127657,18 +132669,18 @@ cbk
bOM
cbr
dqm
-dqx
+dqs
dqP
dqX
drf
drn
drv
drB
-drH
+drv
drN
-drT
-drY
-dsc
+drO
+drO
+dsa
aaa
aaa
aaa
@@ -127692,8 +132704,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
abC
@@ -127913,17 +132925,17 @@ bOM
bOM
bOM
cbr
-dqn
-dqy
-dqQ
-dqY
-drg
-dro
-drw
-drC
-drI
+dqk
+dqr
+dqr
+dqr
+dqs
+dqr
+drs
+drs
+drs
+drO
drO
-drU
arw
arw
aaa
@@ -127948,11 +132960,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxb
+dwX
cUy
-cuk
+dwO
aaa
aaa
aXR
@@ -128170,7 +133182,7 @@ cbm
cbm
bOM
djs
-dqo
+dqk
dgE
byS
aZH
@@ -128206,8 +133218,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128463,8 +133475,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128720,8 +133732,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -128976,11 +133988,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxg
+dwX
+dyN
+dwO
aaa
aaa
aXR
@@ -129199,7 +134211,7 @@ cbo
bOM
djG
bAd
-dqB
+dqk
bBN
aZH
aZt
@@ -129234,10 +134246,10 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
-cuk
+cqC
aaa
aaa
aXR
@@ -129440,7 +134452,7 @@ bOZ
dhQ
did
div
-bTM
+dsN
bUM
bVM
bRs
@@ -129456,7 +134468,7 @@ cbS
bOM
bAd
byS
-dqC
+dqk
byS
aZH
aZH
@@ -129491,8 +134503,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -129697,7 +134709,7 @@ dhF
bQz
die
diw
-bTM
+dsO
bUN
bJx
bTH
@@ -129713,7 +134725,7 @@ cbo
bOM
bAd
cMH
-dqD
+dqk
byS
aZH
aZH
@@ -129748,8 +134760,8 @@ aaa
aaa
arw
cqC
-aQS
-arz
+dwX
+dwX
cUy
cuk
aaa
@@ -129954,7 +134966,7 @@ bPb
dhS
dif
bSM
-bTM
+dsP
bUO
bVN
bWA
@@ -129970,7 +134982,7 @@ bOM
bOM
bAd
bAd
-dqE
+dqk
bBN
aZH
aZH
@@ -130004,11 +135016,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
+dwO
+dxb
+dwX
ctB
-cuk
+dwO
abC
abC
aXR
@@ -130154,18 +135166,18 @@ aLm
aXI
aXX
aXX
+dta
aXX
aXX
aXX
+dta
+aXX
+aXX
+dta
aXX
aXX
aXX
-aXX
-aXX
-aXX
-aXX
-aXX
-aXX
+dta
aXX
aXX
aZT
@@ -130227,7 +135239,7 @@ byS
bAd
byS
cbr
-dqF
+dqk
bBN
aZH
aZH
@@ -130262,9 +135274,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dBG
+dyO
cuk
aaa
aaa
@@ -130408,24 +135420,24 @@ aSU
aSU
aSU
aSR
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dsW
+dsW
+dsW
+dBh
+dsW
+dsW
+dsW
+dBi
+dsW
+dsW
+dBi
+dsW
+dsW
+dsW
+dBh
+dsW
+dsW
+dsW
ban
baN
cQE
@@ -130484,7 +135496,7 @@ djv
byS
bPt
byP
-dqG
+dqk
djk
aZH
aZt
@@ -130519,9 +135531,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -130730,18 +135742,18 @@ bUR
bVQ
bWD
dpA
-dpC
-dpE
-dpG
-dpI
+dpA
+dpA
+dpA
+dpA
dpK
-dpO
-dpR
+dpA
+dpA
dpU
djw
byP
byP
-dqH
+dqk
cMH
aZH
aZt
@@ -130776,10 +135788,10 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
-cuk
+dwX
+dwX
+dyO
+cqC
aaa
aaa
aXR
@@ -130922,31 +135934,31 @@ aSN
aSN
aSN
aSP
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-aYK
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-bap
+dsW
+dsW
+dsW
+dsW
+dsW
+dsW
+dsW
+dtl
+dsW
+dsW
+dBl
+dBm
+dBm
+dBm
+dBm
+dBm
+dBm
+dBm
+dBv
cQA
-baP
-baP
+dBw
+dBw
bcq
-baP
-baP
+dBw
+dBz
bek
baP
bfX
@@ -130996,8 +136008,8 @@ cbr
byP
dpV
dpX
-dpZ
-dqq
+dpX
+dpX
dqI
byS
aZH
@@ -131032,11 +136044,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxg
+dwX
+dyO
+dwO
abC
abC
aXR
@@ -131182,18 +136194,18 @@ aLm
aXJ
aXY
aXY
+dtb
aXY
aXY
aXY
+dtb
+aXY
+aXY
+dtb
aXY
aXY
aXY
-aXY
-aXY
-aXY
-aXY
-aXY
-aXY
+dtb
aXY
aXY
aZU
@@ -131290,9 +136302,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -131547,9 +136559,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -131804,9 +136816,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132060,11 +137072,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dyV
+dwO
aaa
aaa
aXR
@@ -132318,9 +137330,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132575,9 +137587,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -132832,9 +137844,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -133089,9 +138101,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
abC
abC
@@ -133345,11 +138357,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-ctC
-cuk
+dwO
+dxg
+dwX
+dyO
+dwO
aaa
aaa
aXR
@@ -133603,9 +138615,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -133860,9 +138872,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -134117,9 +139129,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
abC
abC
@@ -134374,9 +139386,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -134630,11 +139642,11 @@ aaa
aaa
aaa
arw
-cqC
-aQS
-arz
-cUy
-cuk
+dwO
+dxb
+dwX
+dza
+dwO
aaa
aaa
aXR
@@ -134817,7 +139829,7 @@ boB
bal
baP
cSv
-bhP
+dvu
bvU
bxw
cbr
@@ -134888,9 +139900,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -135145,9 +140157,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aaa
@@ -135402,9 +140414,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-dlA
+dwX
+dwX
+dyO
cuk
aaa
aXR
@@ -135476,37 +140488,37 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aeh
-aeh
-aeh
-aeh
-aeh
-aeh
-aaa
-aaa
-ahT
-ajS
-ahT
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
aaa
aaa
aaa
@@ -135520,8 +140532,8 @@ aaa
aaa
abC
aaa
-aaa
-aaa
+cKF
+cKF
aaa
aaa
aaa
@@ -135588,7 +140600,7 @@ boE
bal
baP
cSv
-bhP
+dvu
bal
bxz
byS
@@ -135659,9 +140671,9 @@ aaa
aaa
arw
cqC
-aQS
-arz
-cUy
+dwX
+dwX
+dyO
cuk
aaa
aXR
@@ -135748,28 +140760,28 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-adg
-adg
-adg
-adg
-adg
+aaa
+aaa
aaf
aaf
aaf
-adg
-adg
-adg
-adg
-ajT
+aeh
+aeh
+aeh
+aeh
+aeh
+aeh
+aaa
+aaa
ahT
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+ajS
+ahT
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -135777,9 +140789,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
abW
@@ -135845,7 +140857,7 @@ boF
bal
brr
cSv
-bhP
+dvu
bal
bxA
cMH
@@ -136002,25 +141014,25 @@ aaa
aaa
aaa
aaa
+aaa
+aaa
+aaa
+aaf
+aaf
+adg
+adg
+adg
+adg
+adg
aaf
aaf
aaf
-aaf
-aaf
-adg
-adt
-adt
-adt
adg
adg
adg
adg
-adg
-adt
-adt
-adt
ajT
-aae
+ahT
aaa
aaa
aaa
@@ -136034,9 +141046,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
abW
@@ -136050,9 +141062,9 @@ abW
aaa
aOu
aPm
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTC
aUB
aaa
@@ -136256,28 +141268,27 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
+aaa
+aaa
+aaa
+aaf
+aaf
+aaf
+aaf
+aaf
adg
adt
-adN
-aei
-aeH
adt
-afz
adt
-agV
-ahJ
-aip
+adg
+adg
+adg
+adg
+adg
adt
-ajU
-aae
+adt
+adt
+ajT
aae
aaa
aaa
@@ -136289,11 +141300,12 @@ aaa
aaa
aaa
aaa
+aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136307,9 +141319,9 @@ abW
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136359,7 +141371,7 @@ boH
bpV
aQS
cSC
-aSQ
+dvx
bvV
bxB
aZt
@@ -136508,9 +141520,9 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-aaf
+aaa
+aaa
+aaa
aaa
aaa
aae
@@ -136523,19 +141535,19 @@ aae
aae
adg
adt
-adO
-aej
-aeI
-afd
-afA
-afd
-agW
-ahK
-aiq
+adN
+aei
+aeH
adt
-ajT
+afz
+adt
+agV
+ahJ
+aip
+adt
+ajU
+aae
aae
-aaf
aaa
aaa
aaa
@@ -136548,9 +141560,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136564,9 +141576,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136616,7 +141628,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aZt
@@ -136764,12 +141776,12 @@ aaa
aaa
aaa
aaa
+aaa
aaf
aaf
-aae
-aae
-aae
-aae
+aaf
+aaa
+aaa
aae
aae
aae
@@ -136779,22 +141791,22 @@ aae
aae
aae
adg
-adu
adt
+adO
+aej
+aeI
+afd
+afA
+afd
+agW
+ahK
+aiq
adt
-adt
-adt
-afB
-afX
-adt
-adt
-adt
-aje
ajT
-aaf
-aaf
-aaf
aae
+aaf
+aaa
+aaa
aaa
aaa
aaa
@@ -136805,9 +141817,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -136821,9 +141833,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -136873,7 +141885,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aZt
@@ -137020,15 +142032,15 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
+aaa
aaf
+aaf
+aae
+aae
+aae
+aae
+aae
+aae
aae
aae
aae
@@ -137036,23 +142048,23 @@ aae
aae
aae
adg
-adv
-adP
-aek
-aeJ
-afe
-afC
-afd
-afd
-ahL
-air
-ajf
+adu
+adt
+adt
+adt
+adt
+afB
+afX
+adt
+adt
+adt
+aje
ajT
aaf
aaf
aaf
aae
-aaf
+aaa
aaa
aaa
aaa
@@ -137062,9 +142074,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137077,11 +142089,11 @@ aaa
aaa
aaa
arw
-aPn
-aQS
-arz
-aSQ
-aTD
+dAj
+dAA
+ary
+dAU
+dBa
arw
aaa
aaa
@@ -137127,11 +142139,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duB
cSC
-aSQ
-bvW
+dvA
+dwa
arw
aZt
aZt
@@ -137276,7 +142288,7 @@ aaa
aaa
aaa
aaa
-aaf
+aaa
aae
aae
aae
@@ -137286,28 +142298,28 @@ aae
aae
aae
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-adg
-adg
-adQ
-ael
-aeK
-adS
-afD
-adS
-adt
-ahM
-ais
+aae
+aae
+aae
+aae
+aae
+aae
adg
+adv
+adP
+aek
+aeJ
+afe
+afC
+afd
+afd
+ahL
+air
+ajf
ajT
-aae
aaf
-aae
+aaf
+aaf
aae
aaf
aaa
@@ -137319,9 +142331,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137335,9 +142347,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137387,7 +142399,7 @@ arw
bpW
aQS
cSC
-buu
+dvx
bvW
arw
aaa
@@ -137534,39 +142546,38 @@ aaa
aaa
aaa
aaf
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aaf
+aaf
aaf
aaf
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
aaf
aaf
aaf
adg
-adR
-aem
-aeL
-adS
-afE
-adS
-adt
-adt
-adt
adg
-ajV
-aae
-aae
-aae
+adQ
+ael
+aeK
+adS
+afD
+adS
+adt
+ahM
+ais
+adg
+ajT
aae
aaf
+aae
+aae
aaf
aaa
aaa
@@ -137574,6 +142585,15 @@ aaa
aaa
aaa
aaa
+aaa
+abC
+aaa
+cKF
+cKF
+cKF
+aaa
+aaa
+aaa
abC
aaa
aaa
@@ -137581,20 +142601,12 @@ aaa
aaa
aaa
aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
arw
aPn
-aQT
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137644,7 +142656,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -137792,8 +142804,7 @@ aaa
aaa
aaf
aaf
-aal
-aal
+aaf
aal
aal
aal
@@ -137807,17 +142818,18 @@ aal
aal
aaf
aaf
-adw
+aaf
+adg
+adR
+aem
+aeL
adS
+afE
adS
-adS
-adS
-afF
-adS
-adS
-adS
-adS
-adw
+adt
+adt
+adt
+adg
ajV
aae
aae
@@ -137825,7 +142837,7 @@ aae
aae
aaf
aaf
-aaf
+aaa
aaa
aaa
aaa
@@ -137833,9 +142845,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -137849,9 +142861,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -137901,7 +142913,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -138051,35 +143063,35 @@ aaf
aaf
aal
aal
-aau
-aax
-aax
-abl
-aax
-abM
-aax
-aax
-aaw
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
aal
aal
aal
aaf
+aaf
adw
-adT
-aen
-aeM
adS
-afG
-afY
-agX
-ahN
-ait
+adS
+adS
+adS
+afF
+adS
+adS
+adS
+adS
adw
ajV
aae
aae
-aaf
-aaf
+aae
+aae
aaf
aaf
aaf
@@ -138090,9 +143102,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138106,9 +143118,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138158,7 +143170,7 @@ arw
bpW
aQS
cSC
-aSQ
+dvx
bvW
arw
aaa
@@ -138303,34 +143315,34 @@ aaa
aaa
aaa
aaa
-aae
-aae
-aae
+aaa
+aaf
+aaf
aal
aal
-aav
+aau
aax
-aaw
-aaw
-abx
aax
+abl
+aax
+abM
aax
aax
aaw
-acL
-cJi
aal
aal
aal
-adU
-aeo
+aaf
+adw
+adT
+aen
aeM
-aff
-aeM
-afZ
-agY
-aeM
-aiu
+adS
+afG
+afY
+agX
+ahN
+ait
adw
ajV
aae
@@ -138347,9 +143359,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138362,11 +143374,11 @@ aaa
aaa
aaa
arw
-aPn
-aQS
-arz
-aSQ
-aTD
+dAj
+ary
+ary
+dAV
+dBa
arw
aaa
aaa
@@ -138412,11 +143424,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duC
cSC
-aSQ
-bvW
+dvB
+dwa
arw
aaa
aaa
@@ -138565,36 +143577,36 @@ aae
aae
aal
aal
-aaw
-aaE
-aaS
-cJk
-aaX
-abN
-abZ
-acn
-acu
+aav
aax
aaw
+aaw
+abx
+aax
+aax
+aax
+aaw
+acL
+cJi
aal
aal
aal
-aal
-aal
-aal
-aal
-aal
-aga
-agZ
-ahO
-aiv
+adU
+aeo
+aeM
+aff
+aeM
+afZ
+agY
+aeM
+aiu
adw
-ajW
-akI
-akI
-akI
-akI
-akI
+ajV
+aae
+aae
+aaf
+aaf
+aaf
aaf
aaf
aaa
@@ -138604,9 +143616,9 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -138620,9 +143632,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138672,7 +143684,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -138821,39 +143833,39 @@ aae
aae
aae
aal
-cJi
+aal
aaw
-aaF
-aaT
-aax
-aby
+aaE
+aaS
+cJk
aaX
-aca
+abN
+abZ
+acn
+acu
aax
-acv
-aax
-dnz
+aaw
aal
-adh
-adx
-adh
-adh
-adh
-adh
aal
-agb
-aha
-ahP
-aiw
+aal
+aal
+aal
+aal
+aal
+aal
+aga
+agZ
+ahO
+aiv
adw
-ajX
-akJ
-akJ
-akJ
-amY
+ajW
akI
akI
akI
+akI
+akI
+aaf
+aaf
aaa
aaa
aaa
@@ -138862,8 +143874,8 @@ aaa
abC
aaa
aaa
-aaa
-aaa
+cKF
+cKF
aaa
aaa
aaa
@@ -138877,9 +143889,9 @@ aaa
aaa
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -138929,7 +143941,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -139078,65 +144090,65 @@ aae
aae
aae
aal
-aal
+cJi
+aaw
+aaF
+aaT
aax
-aaG
-aaU
-abm
-abm
-abO
+aby
aaX
+aca
aax
acv
aax
-aau
+dnz
aal
-cJi
+adh
+adx
+adh
+adh
+adh
+adh
aal
-aal
-aal
-aal
-cJi
-aal
-agc
-ahb
-aeM
-aix
+agb
+aha
+ahP
+aiw
adw
-ajY
-akK
-als
-als
-amZ
-anJ
-aoO
-apK
-aqI
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
+ajX
+akJ
+akJ
+akJ
+amY
+akI
+akI
+akI
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+abC
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
arw
aPn
-aQS
-arz
-aSQ
+ary
+ary
+ary
aTD
arw
aaa
@@ -139186,7 +144198,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -139337,63 +144349,63 @@ aae
aal
aal
aax
-aaH
-aaS
-abn
-aaS
-abP
-aax
+aaG
+aaU
+abm
+abm
+abO
aaX
-acw
aax
-acP
+acv
+aax
+aau
aal
-aaw
-ady
-adV
-aaw
-ady
-aaw
+cJi
aal
-agd
-ahc
+aal
+aal
+aal
+cJi
+aal
+agc
+ahb
+aeM
+aix
adw
-adw
-adw
-agk
-akL
-akI
-akI
-akI
-akI
-akI
-akI
-akI
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-arx
-aPo
-aQS
-arz
-aSQ
+ajY
+akK
+als
+als
+amZ
+anJ
+aoO
+apK
+baR
+aqI
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+aPn
+ary
+ary
+ary
aTD
arw
abC
@@ -139443,7 +144455,7 @@ arw
bpW
aQS
cSC
-dfN
+aQS
bvW
arw
aaa
@@ -139593,65 +144605,65 @@ aae
aae
aal
aal
-aaw
-aaI
-aaS
-aaS
-aaS
+aax
aaH
-aaE
aaS
-acx
-abZ
-abZ
-acR
-adi
-adi
-adi
-adi
-aeN
-adi
-acR
-age
-ahd
-ahQ
-aiy
-ajg
-ahQ
-akM
-alt
-alt
-ana
-alt
-alt
-apL
-aqJ
+abn
+aaS
+abP
+aax
+aaX
+acw
+aax
+acP
+aal
+aaw
+ady
+adV
+aaw
+ady
+aaw
+aal
+agd
+ahc
+adw
+adw
+adw
+agk
+akL
+akI
+akI
+akI
+akI
+akI
+akI
+akI
+dzo
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzw
+dzq
+dzq
+dzq
+dzq
+dAl
+dAB
ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-arz
-arz
-aSQ
-aTD
+dAU
+dBa
arw
aaa
aaa
@@ -139697,11 +144709,11 @@ aaa
abC
aaa
arw
-bpW
-aQS
+dus
+duB
cSC
-aSQ
-bvW
+dvC
+dwa
arw
aaa
aaa
@@ -139850,67 +144862,67 @@ aae
aae
aal
aal
-aay
-aaJ
-aaV
+aaw
+aaI
aaS
-abz
-abQ
-acb
-aco
-acy
-acK
-abm
-acS
-adj
-adz
-adj
-aep
-aeO
-adj
-acS
-agf
-ahe
-agk
-aiz
-ajh
-agk
-akN
-alu
-amc
-anb
-amc
-amc
-apM
-aqK
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-dbJ
+aaS
+aaS
+aaH
+aaE
+aaS
+acx
+abZ
+abZ
+acR
+adi
+adi
+adi
+adi
+aeN
+adi
+acR
+age
+ahd
+ahQ
+aiy
+ajg
+ahQ
+akM
+alt
+alt
+ana
+alt
+alt
+apL
+aqJ
+ary
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
+dzG
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
+dzG
+ary
+ary
+ary
+ary
+dzx
+ary
+ary
+ary
aTD
arw
-aaa
+cKF
aaa
aaa
aaa
@@ -139957,7 +144969,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -140107,64 +145119,64 @@ aae
aae
aal
aal
-aaw
-aaK
-aaW
+aay
+aaJ
+aaV
aaS
-aaS
-aaw
-aaE
-aaS
-acz
-acc
-acc
-acT
-adk
-adA
-adk
-adk
-adk
-adk
-acT
-agg
-ahf
-ahR
-aiA
-aji
-ahR
-akO
-alv
-amd
-anc
-anK
-amd
-amd
-aqL
-arA
-arA
-arA
-arA
-arA
-axa
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-aJo
-arA
-arA
-arA
-arA
-arA
-arA
-arz
-arz
-aSQ
+abz
+abQ
+acb
+aco
+acy
+acK
+abm
+acS
+adj
+adz
+adj
+aep
+aeO
+adj
+acS
+agf
+ahe
+agk
+aiz
+ajh
+agk
+akN
+alu
+amc
+anb
+amc
+amc
+apM
+aqK
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+dAT
+ary
aTD
arw
aaa
@@ -140214,7 +145226,7 @@ arw
bpW
aQS
cSC
-aSQ
+aQS
bvW
arw
aaa
@@ -140364,64 +145376,64 @@ aae
aae
aal
aal
-aax
aaw
+aaK
+aaW
aaS
-abo
aaS
-abR
-aax
-aaX
-acA
-aax
-acP
-aal
-adl
-adB
aaw
-aaw
-adB
-adl
-aal
-agh
-ahg
-agk
-agk
-agk
-agk
-akP
-akI
-akI
-akI
-akI
-akI
-akI
-akI
+aaE
+aaS
+acz
+acc
+acc
+acT
+adk
+adA
+adk
+adk
+adk
+adk
+acT
+agg
+ahf
+ahR
+aiA
+aji
+ahR
+akO
+alv
+amd
+anc
+anK
+amd
+amd
+aqL
+ary
+ary
+ary
+ary
arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-arB
-aPp
-aQS
-arz
-aSQ
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+dzQ
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
+ary
aTD
arw
aaa
@@ -140471,7 +145483,7 @@ boI
bpX
aQS
cSC
-aSQ
+aQS
bvX
bxC
aaa
@@ -140623,63 +145635,63 @@ aal
aal
aax
aaw
-aaX
-aaw
-aaw
-aaw
-aaX
+aaS
+abo
+aaS
+abR
aax
-acB
+aaX
+acA
aax
-aau
+acP
aal
+adl
+adB
+aaw
+aaw
+adB
+adl
aal
-aal
-aal
-aal
-aal
-aal
-aal
-agi
-ahh
-ahS
-aiB
+agh
+ahg
agk
-ajZ
-akQ
-alw
-ame
-ame
-anL
-aoP
-apN
-aqM
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
+agk
+agk
+agk
+akP
+akI
+akI
+akI
+akI
+akI
+akI
+akI
+dzp
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzy
+dzp
+dzp
+dzp
+dzp
aPq
-aQS
-arz
-aSQ
-aTD
+dAC
+ary
+dAU
+dBa
arw
aaa
aaa
@@ -140877,65 +145889,65 @@ aae
aae
aae
aal
-cJi
-aaw
-aaF
-aaT
+aal
aax
-aby
+aaw
+aaX
+aaw
+aaw
+aaw
aaX
-aca
aax
acB
aax
-aaw
+aau
aal
-adh
-adh
-adh
-aeq
-adh
-adh
aal
-agj
-ahi
-cYe
+aal
+aal
+aal
+aal
+aal
+aal
+agi
+ahh
+ahS
aiB
agk
-ajX
-akJ
-akJ
-akJ
-akJ
-akI
-akI
-akI
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
+ajZ
+akQ
+alw
+ame
+ame
+anL
+aoP
+apN
+dzn
+aqM
arw
-aPq
-aQS
-arz
-aSQ
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141130,43 +146142,43 @@ aaa
aaa
aaa
aaa
-aaf
-aaf
-aaf
-aal
+aae
+aae
+aae
aal
+cJi
aaw
-aaE
-aaS
-cJk
+aaF
+aaT
+aax
+aby
aaX
-abS
-acc
-acp
-acC
+aca
+aax
+acB
aax
aaw
aal
+adh
+adh
+adh
+aeq
+adh
+adh
aal
-aal
-aal
-aal
-aal
-aal
-aal
+agj
+ahi
+cYe
+aiB
agk
-agk
-agk
-agk
-agk
-ajW
+ajX
+akJ
+akJ
+akJ
+akJ
akI
akI
akI
-akI
-akI
-aaf
-aaa
abC
aaa
aaa
@@ -141189,10 +146201,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141387,42 +146399,50 @@ aaa
aaa
aaa
aaa
+aaf
+aaf
+aaf
+aal
+aal
+aaw
+aaE
+aaS
+cJk
+aaX
+abS
+acc
+acp
+acC
+aax
+aaw
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+agk
+agk
+agk
+agk
+agk
+ajW
+akI
+akI
+akI
+akI
+akI
+aaf
aaa
-aaf
-aaf
-aal
-aal
-aaz
-aax
-aaw
-aaw
-abA
-aax
-aax
-aax
-aaw
-acL
-cJi
-aal
-aal
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-ajV
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+abC
+aaa
+aaa
+aaa
+aaa
+aaa
+cKF
aaa
abC
aaa
@@ -141432,24 +146452,16 @@ aaa
aaa
aaa
aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141649,25 +146661,25 @@ aaf
aaf
aal
aal
-aau
-aaL
+aaz
aax
-abp
-aax
-abM
-aax
-aaL
aaw
-aal
+aaw
+abA
+aax
+aax
+aax
+aaw
+acL
+cJi
aal
aal
aaf
aaf
-aae
-aae
-aae
-aae
-aae
+aaf
+aaf
+aaf
+aaf
aaf
aaf
aaf
@@ -141703,10 +146715,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -141906,18 +146918,18 @@ aaf
aaf
aal
aal
+aau
+aaL
+aax
+abp
+aax
+abM
+aax
+aaL
+aaw
aal
aal
aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aal
-aaf
aaf
aaf
aae
@@ -141960,11 +146972,11 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
-aTD
+dAr
+dAH
+ary
+dAV
+dBa
arw
aaa
aaa
@@ -142159,7 +147171,6 @@ aaa
aaa
aaa
aaa
-aaa
aaf
aaf
aal
@@ -142173,24 +147184,25 @@ aal
aal
aal
aal
+aal
+aal
+aaf
+aaf
+aaf
+aae
+aae
+aae
+aae
+aae
aaf
aaf
aaf
aaf
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
aaf
ajV
aaf
-aae
-aae
+aaf
+aaf
aaf
aaf
aaf
@@ -142215,12 +147227,12 @@ aaa
abC
aaa
aaa
-aaa
+cKF
arw
-aPq
-aQU
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142419,15 +147431,17 @@ aaa
aaa
aaf
aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
+aal
aaf
aaf
aaf
@@ -142438,8 +147452,6 @@ aae
aae
aae
aae
-aaf
-aae
aae
aae
aae
@@ -142450,7 +147462,7 @@ aae
aae
aaf
aaf
-aaa
+aaf
aaa
abC
aaa
@@ -142462,22 +147474,22 @@ aaa
aaa
abC
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142677,18 +147689,18 @@ aaa
aaf
aaf
aaf
-aae
-aae
-aae
-aae
-aae
aaf
aaf
aaf
aaf
-aae
-aae
-aae
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
aae
aae
aae
@@ -142703,10 +147715,10 @@ aae
aaf
ajV
aaf
+aae
+aae
+aaf
aaf
-aaa
-aaa
-aaa
aaa
aaa
abC
@@ -142731,10 +147743,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -142931,11 +147943,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaf
-aaf
-aaf
aaf
aaf
aaf
@@ -142944,7 +147951,10 @@ aae
aae
aae
aae
-aae
+aaf
+aaf
+aaf
+aaf
aae
aae
aae
@@ -142955,11 +147965,13 @@ aae
aae
aae
aaf
+aae
+aae
+aae
+aae
aaf
+ajV
aaf
-ahT
-aka
-ahT
aaf
aaa
aaa
@@ -142988,10 +148000,10 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -143071,17 +148083,17 @@ bYL
bZn
bZn
bZn
+dwp
bZn
bZn
bZn
bZn
+dwp
bZn
bZn
bZn
bZn
-bZn
-bZn
-bZn
+dwp
bZn
bZn
bZn
@@ -143190,11 +148202,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aaf
+aaf
+aaf
+aaf
+aaf
aaf
aae
aae
@@ -143215,9 +148227,9 @@ aaf
aaf
aaf
ahT
-akb
+aka
ahT
-aaa
+aaf
aaa
aaa
aaa
@@ -143245,19 +148257,19 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
-aTD
+dAr
+dAD
+ary
+dAU
+dBa
arw
aaa
aaa
-aaa
-aaa
-alx
-alx
-alx
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
aaa
@@ -143324,25 +148336,25 @@ bVU
buw
bXj
buv
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
-ary
+dwd
+dwd
+dwd
+dwd
+dwq
+dwd
+dwd
+dwd
+dwd
+dwx
+dwd
+dwd
+dwd
+dwd
+dwq
+dwd
+dwd
+dwd
+dwd
buv
bXj
buw
@@ -143452,7 +148464,7 @@ aaa
aaa
aaa
aaa
-aaa
+aaf
aae
aae
aae
@@ -143470,26 +148482,26 @@ aae
aae
aaf
aaf
+aaf
+ahT
+akb
+ahT
+aaa
+aaa
+aaa
+aaa
aaa
aaa
abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-alx
-alF
-alx
-alx
-alx
-alx
-alx
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
-aaa
+cKF
aaa
aaa
aaa
@@ -143502,16 +148514,16 @@ aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
aaa
aaa
-alx
+aaa
alx
alx
alx
@@ -143581,25 +148593,25 @@ bbs
bbs
bbs
baU
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dBA
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
+dwd
baU
bbs
cgk
@@ -143710,13 +148722,15 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
aae
aae
aae
@@ -143725,44 +148739,42 @@ aae
aae
aaf
aaf
-aaf
-ahT
-abC
-abC
-abC
+dzk
+dzk
+dzk
abC
aaa
aaa
aaa
aaa
+aaa
+alx
+alF
alx
alx
alx
alx
alx
-and
-and
-alx
-alx
-alx
+aaa
+aaa
abC
aaa
aaa
-alx
-alx
-alx
-alx
-alx
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
abC
aaa
aaa
aaa
arw
-aPq
-aQS
-arz
-aSQ
+dAn
+dAD
+ary
+ary
aTD
arw
aaa
@@ -143771,14 +148783,14 @@ aaa
alx
alx
alx
-alF
-abC
-abC
-abC
-abC
-abC
-abC
-abC
+alx
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
abC
aYG
abC
@@ -143838,34 +148850,34 @@ bSZ
bSZ
bSZ
bYb
-arA
-arA
-arA
-arA
-arA
-cdj
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-djU
-arA
-arA
-arA
-arA
-arA
-bYb
-bSZ
-bSZ
-bSZ
+dwd
+dwd
+dwd
+dwd
+dws
+dwd
+dwd
+dwd
+dwd
+dwy
+dwA
+dwA
+dwA
+dwA
+dwF
+dwA
+dwA
+dwA
+dwA
+dwH
+dwI
+dwI
+dwI
cgA
cgJ
-bSZ
-bRQ
-cLb
+dwI
+dwM
+dwN
chu
bkA
bkA
@@ -143988,54 +149000,54 @@ aaa
aaa
abC
abC
+aaa
+aaa
+aaa
+aaa
+alx
+alx
+alx
+alx
+alx
+and
+and
+alx
+alx
+alx
+abC
+aaa
+aaa
+alx
+alx
+alx
+alx
+alx
+aaa
abC
aaa
aaa
aaa
+arw
+dAn
+dAD
+ary
+ary
+aTD
+arw
+aaa
+aaa
+aaa
alx
alx
-and
alx
-and
-and
-and
-alx
-alx
-and
alF
-alx
-and
-and
-alx
-alx
-alx
-alx
-aaa
abC
-aaa
-aaa
-aaa
-aOv
-aPr
-aQS
-arz
-aSQ
-aTE
-aUC
-aaa
-aaa
-akR
-alx
-alx
-alx
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+abC
+abC
+abC
+abC
+abC
+abC
abC
aYG
abC
@@ -144099,17 +149111,17 @@ bYM
bZo
bZo
bZo
+dwt
bZo
bZo
bZo
bZo
+dwt
bZo
bZo
bZo
bZo
-bZo
-bZo
-bZo
+dwt
bZo
bZo
bZo
@@ -144244,53 +149256,53 @@ aaa
aaa
aaa
abC
+abC
+abC
aaa
-abC
-abC
+aaa
+aaa
+alx
+alx
+and
+alx
+and
+and
+and
+alx
+alx
+and
alF
alx
+and
+and
alx
-and
-and
-afV
-afV
-afS
-aez
-afV
-adZ
-aez
-afV
-afV
-aez
-aez
alx
-and
-and
alx
alx
aaa
-aaa
-aaa
-aKo
-aOw
-aKo
-aQV
-aRP
-aSR
-aLm
-aUD
-aLm
-akR
+abC
+cKF
+cKF
+cKF
+aOv
+dAz
+dAD
+ary
+ary
+dBg
+aUC
+cKF
+cKF
akR
alx
alx
alx
alx
-alx
-alx
-aaa
-aaa
-aaa
+cKF
+cKF
+cKF
+cKF
+cKF
aaa
aaa
abC
@@ -144502,46 +149514,46 @@ aaa
aaa
abC
aaa
-aaa
-aaa
+abC
+abC
+alF
alx
alx
and
-aez
+and
+afV
+afV
+afS
aez
afV
-aqH
-afq
-apx
-cZd
-cYm
-aiS
-azp
-amb
-aBV
adZ
+aez
afV
afV
aez
+aez
+alx
+and
+and
alx
alx
-alx
-akR
-akR
+aaa
+aaa
+aaa
aKo
-aOx
+aOw
aKo
aQW
-aRD
-aSS
+aRP
+aSR
aLm
-aUE
+aUD
aLm
+akR
+akR
alx
alx
alx
-and
-and
alx
alx
alx
@@ -144759,54 +149771,54 @@ aaa
aaa
abC
aaa
-akR
+aaa
+aaa
+alx
alx
and
-and
aez
-afS
+aez
afV
-aoQ
+aqH
afq
-akq
-alQ
-akq
-akq
-akp
-cYo
-akp
-cYl
-akp
+apx
+cZd
+cYm
+aiS
+azp
amb
-cYj
+aBV
+adZ
+afV
+afV
aez
-and
-and
+alx
+alx
+alx
+akR
+akR
aKo
-aLo
-aLo
+aOx
aKo
-aOy
-aKo
-aQW
+dAQ
aRD
-aST
-aLm
-aUF
-aLm
+aSS
aLm
+aUE
aLm
alx
+alx
+alx
and
and
alx
alx
alx
-alx
-alx
aaa
aaa
-abC
+aaa
+aaa
+aaa
abC
aYG
abC
@@ -145015,57 +150027,57 @@ aaa
aaa
aaa
abC
-akR
+aaa
akR
alx
and
and
aez
-apO
-aoR
-ahr
-ahr
-ahr
-cYY
-avL
-ahr
-ahr
-azq
-cYY
-ahr
-ahr
-aEj
afS
afV
+aoQ
+afq
+akq
+alQ
+akq
+akq
+akp
+cYo
+akp
+cYl
+akp
+amb
+cYj
aez
-aez
+and
+and
aKo
-aLp
-aMq
-aNr
-aOz
-aPs
-aQW
+aLo
+aLo
+aKo
+aOy
+aKo
+dAQ
aRD
-aSU
+aST
+aLm
+aUF
+aLm
aLm
-aUG
-aVj
-aVD
aLm
alx
and
-aXa
-aXb
-aXa
-aXa
-aYi
+and
+alx
+alx
+alx
+alx
alx
aaa
-aaa
+cKF
abC
-aYF
-aYH
+abC
+aYG
abC
aaa
aaa
@@ -145270,59 +150282,59 @@ aaa
aaa
aaa
aaa
-ajj
-akc
-anQ
-dnE
-ajn
+aaa
+abC
+akR
+akR
+alx
+and
+and
aez
+apO
+aoR
+ahr
+ahr
+ahr
+cYY
+avL
+ahr
+ahr
+azq
+cYY
+ahr
+ahr
+aEj
afS
afV
-afq
-anC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-arC
-afq
-anC
-afS
-adZ
-aIf
-adZ
+aez
+aez
aKo
-aLq
-aMr
-aNs
-aOA
-aPt
-aQX
+aLp
+aMq
+aNr
+aOz
+aPs
+dAQ
aRD
-aSV
+aSU
aLm
-aUH
-aVk
-aVE
+aUG
+aVj
+aVD
aLm
-afV
-afV
+alx
+and
+aXa
+aXb
+aXa
aXa
-aXt
-aXL
-aXZ
-aYi
-aYi
aYi
+alx
+aaa
+aaa
abC
-abC
-aYG
-abC
+aYF
+aYH
abC
aaa
aaa
@@ -145527,60 +150539,60 @@ aaa
aaa
aaa
aaa
-ajk
-alE
-akd
-dnF
+ajj
+akc
+anQ
+dnE
ajn
-ajn
-aUW
-aoQ
-aoR
-aqN
-arC
-asx
-atB
-asx
-atC
-atC
-axN
-azr
-asx
-arC
-aqH
-aEk
-amb
-akp
-cZB
+aez
afS
-aKp
-aLr
-aMs
-aNt
-aOB
-aPu
-aQY
-aRF
-aSW
-cKe
-aUI
-aVl
-aVF
+afV
+afq
+anC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+arC
+afq
+anC
+afS
+adZ
+aIf
+adZ
+aKo
+aLq
+aMr
+aNs
+aOA
+aPt
+dAS
+aRD
+aSV
aLm
-ajt
-aqH
-aXb
-aXu
-aXM
-aYa
-aYj
-aYr
-aYj
-aYn
-aYn
-aYH
+aUH
+aVk
+aVE
+aLm
+afV
+afV
+aXa
+aXt
+aXL
+aXZ
+aYi
+aYi
+aYi
+abC
+abC
+aYG
+abC
abC
-aaa
aaa
aaa
aaa
@@ -145784,58 +150796,58 @@ aaa
aaa
aaa
aaa
-ajl
-ake
-akS
-aly
-amf
-ane
-alr
+ajk
+alE
+akd
+dnF
+ajn
+ajn
+aUW
+aoQ
aoR
-apP
-afV
+aqN
arC
-asy
-atC
asx
+atB
asx
-axb
atC
atC
-aAH
+axN
+azr
+asx
arC
+aqH
+aEk
+amb
+akp
+cZB
afS
-amI
-aCr
-aCr
-aCr
-aBA
-aKo
-aKo
-aKo
-aKo
-aKo
-aKo
-aQZ
-aRQ
-aSX
+aKp
+aLr
+aMs
+aNt
+aOB
+aPu
+aQY
+aRF
+aSW
+cKe
+aUI
+aVl
+aVF
aLm
-aUJ
-aVe
-aVG
-aLm
-alR
-aWQ
-aXc
-aXv
-aXN
-aYb
-aYi
-aYi
-aYi
-abC
-abC
-abC
+ajt
+aqH
+aXb
+aXu
+aXM
+aYa
+aYj
+aYr
+aYj
+aYn
+aYn
+aYH
abC
abC
abC
@@ -146041,59 +151053,59 @@ aaa
aaa
aaa
aaa
-cJr
-akf
-akT
+ajl
+ake
+akS
aly
-amg
-ajn
-anM
-aoS
-cYC
-adZ
-arC
-asz
-atD
-auF
-avM
-atC
-axO
-atC
-aAI
-arC
-adZ
-afS
+amf
+ane
+alr
+aoR
+apP
afV
-aiS
-dad
-dan
-day
+arC
+asy
+atC
+asx
+asx
+axb
+atC
+atC
+aAH
+arC
+afS
+amI
+aCr
+aCr
aCr
aBA
-cYl
-dam
+aKo
+aKo
+aKo
+aKo
+aKo
+aKo
+aQZ
+aRQ
+aSX
aLm
-aRa
-aRK
-aSY
+aUJ
+aVe
+aVG
aLm
-aUK
-aVf
-aVH
-aLm
-aqH
-anC
-aXb
-aXb
-aXa
-aXb
+alR
+aWQ
+aXc
+aXv
+aXN
+aYb
aYi
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
+aYi
+aYi
+abC
+abC
+abC
+abC
aaa
aaa
aaa
@@ -146298,53 +151310,53 @@ aaa
aaa
aaa
aaa
-ajl
-akg
-akU
+cJr
+akf
+akT
aly
-amh
+amg
ajn
-anN
-aoT
-adZ
+anM
+aoS
+cYC
adZ
arC
-asx
+asz
+atD
+auF
+avM
atC
-auG
-avN
-auG
-axP
axO
+atC
aAI
arC
adZ
-adZ
-cZM
-cZM
-cZM
-cZM
-cZM
-cZM
-anC
+afS
+afV
+aiS
+dad
+dan
+day
+aCr
+aBA
cYl
-afS
-aPl
-aRb
-aRR
-aSZ
-aTF
-aUL
+dam
aLm
+aRa
+aRK
+aSY
aLm
+aUK
+aVf
+aVH
aLm
-aoR
-apu
-afS
-alx
-alx
-alx
-alx
+aqH
+anC
+aXb
+aXb
+aXa
+aXb
+aYi
alx
aaa
aaa
@@ -146361,19 +151373,19 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
bbq
bbq
bbq
-baS
-baS
-baS
-baS
-baS
-baS
+bbq
+bbq
+bbq
+bbq
+bbq
+cKp
big
bja
-bjS
+bjP
deo
blC
dpb
@@ -146556,52 +151568,52 @@ aaa
aaa
aaa
ajl
-akf
+akg
akU
-alz
-ami
+aly
+amh
ajn
-ajn
-anV
-anV
-anV
-arC
-arC
-arC
-auH
-avO
-auH
-arC
-arC
-aAJ
-arC
-anV
-anV
-cZM
-cZV
-daf
-dap
-daA
-cZM
-amI
-ahr
-aOo
-aPv
-aRc
-aRS
-aTa
-aLm
-aLm
-aLm
+anN
+aoT
adZ
adZ
+arC
+asx
+atC
+auG
+avN
+auG
+axP
+axO
+aAI
+arC
+adZ
+adZ
+cZM
+cZM
+cZM
+cZM
+cZM
+cZM
anC
-afq
-aLm
-aLm
+cYl
+afS
+aPl
+aRb
+aRR
+aSZ
+aTF
+aUL
aLm
aLm
aLm
+aoR
+apu
+afS
+alx
+alx
+alx
+alx
alx
aaa
aaa
@@ -146621,16 +151633,16 @@ aaa
aaa
bbq
bbq
-bbo
+bbq
+baS
+baS
+baS
+baS
baS
-bdG
-bew
-bfl
-bgl
baS
big
bja
-bjP
+bjS
dew
bkD
bkD
@@ -146815,51 +151827,50 @@ aaa
ajl
akf
akU
-alA
-amh
-anf
+alz
+ami
ajn
-aoU
-cYD
-aqO
-arD
-asA
-atE
-auI
-avP
-auI
-axQ
-azs
-aAK
-aBW
-aCU
-aEl
-cZO
-cZW
-dag
-daq
-daB
+ajn
+anV
+anV
+anV
+arC
+arC
+arC
+auH
+avO
+auH
+arC
+arC
+aAJ
+arC
+anV
+anV
cZM
-daQ
-aUW
-avh
-aPw
-aRd
-aRD
-aTb
+cZV
+daf
+dap
+daA
+cZM
+amI
+ahr
+aOo
+aPv
+aRc
+aRS
+aTa
+aLm
+aLm
aLm
adZ
adZ
-adZ
-aWh
-apu
-aez
+anC
+afq
+aLm
+aLm
+aLm
aLm
-aMo
-aMn
-aYc
aLm
-alx
alx
aaa
aaa
@@ -146878,16 +151889,17 @@ aaa
aaa
aaa
bbq
+bbq
bbo
baS
-bdH
-bex
-bex
-bgm
-bgY
-bih
-bjc
-bjR
+bdG
+bew
+bfl
+bgl
+baS
+big
+bja
+bjP
bkD
blD
bmC
@@ -147069,55 +152081,55 @@ aaa
aaa
aaa
aaa
-cJs
+ajl
akf
akU
-aly
-amj
-ang
-anO
-aoV
-apQ
-apQ
-arE
-arE
-cLT
-arE
-avQ
-apQ
-apQ
-azt
-aAL
-aBX
-cZA
-aEn
-cZP
-cZX
-dah
-dar
-daC
+alA
+amh
+anf
+ajn
+aoU
+cYD
+aqO
+arD
+asA
+atE
+auI
+avP
+auI
+axQ
+azs
+aAK
+aBW
+aCU
+aEl
+cZO
+cZW
+dag
+daq
+daB
cZM
-afV
-aez
-afV
+daQ
+aUW
+avh
+aPw
+aRd
+aRD
+aTb
aLm
-aRe
-aRT
-aTc
-aPv
-aUM
-ahr
-ahr
+adZ
+adZ
+adZ
+aWh
apu
-afV
aez
aLm
-aNp
-aNp
-aYd
-aLm
-aLm
+aMo
+aMn
+aYc
aLm
+alx
+alx
aaa
aaa
aaa
@@ -147134,17 +152146,17 @@ aaa
aaa
aaa
aaa
+bbq
+bbo
baS
-baS
-baS
-bdI
-bey
-bey
-bgn
-baS
-big
-bbs
-bjP
+bdH
+bex
+bex
+bgm
+bgY
+bih
+bjc
+bjR
bkD
blE
bmD
@@ -147326,82 +152338,82 @@ aaa
aaa
aaa
aaa
-ajl
-akh
-akV
-alB
-amk
-anh
-anP
-aoW
-aoW
-aoW
-arF
-arF
-aoW
-arF
-avR
-aoU
-aoU
-aoU
-aoU
+cJs
+akf
+akU
+aly
+amj
+ang
+anO
+aoV
+apQ
+apQ
+arE
+arE
+cLT
+arE
+avQ
+apQ
+apQ
+azt
+aAL
aBX
-aoU
+cZA
aEn
-cZQ
+cZP
cZX
-dai
-das
-daD
-anV
-anV
-anV
-anV
-anV
-aRd
-aRD
-aTa
-aPw
-alr
-aqH
-aoy
-afK
+dah
+dar
+daC
+cZM
+afV
+aez
+afV
+aLm
+aRe
+aRT
+aTc
+aPv
+aUM
+ahr
+ahr
+apu
afV
aez
aLm
-aXw
-aXO
-aXO
-aYk
-aYs
-aYv
-aYw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-arw
-bar
-baR
-baR
-bbR
-bcv
-bbR
-bdJ
-ber
-ber
-bgo
+aNp
+aNp
+aYd
+aLm
+aLm
+aLm
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+aaa
+aaa
baS
-bii
-bjd
-bjT
+baS
+baS
+bdI
+bey
+bey
+bgn
+baS
+big
+bja
+bjP
bkD
blF
bmE
@@ -147583,82 +152595,82 @@ aaa
aaa
aaa
aaa
-ajm
-aki
-akW
-alC
-alD
-ani
-ajn
+ajl
+akh
+akV
+alB
+amk
+anh
+anP
+aoW
+aoW
+aoW
+arF
+arF
+aoW
+arF
+avR
aoU
aoU
-aqP
-arG
-asB
-atF
-asG
-avS
-axc
-aoW
-aoW
-aoW
-aBY
-azy
-cZI
-cZR
-cZZ
-daj
-dat
-daE
+aoU
+aoU
+aBX
+aoU
+aEn
+cZQ
+cZX
+dai
+das
+daD
anV
-aMt
-aNu
-aOC
-aPx
-aRf
-aRU
+anV
+anV
+anV
+anV
+aRd
+aRD
aTa
+aPw
+alr
+aqH
+aoy
+afK
+afV
+aez
aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aXx
-cKe
-aLm
-aLm
-aLm
-aLm
-aYx
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-aYz
-bas
+aXw
+aXO
+aXO
+aYk
+aYs
+aYv
+aYw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+arw
+bar
+baR
+baR
+bbR
+bcv
+bbR
+bdJ
+ber
+ber
+bgo
baS
-baS
-baS
-baS
-baS
-baS
-baS
-baS
-cKp
-baS
-bij
-bbs
-bjU
+bii
+bjd
+bjT
bkD
bkD
bkD
@@ -147840,82 +152852,82 @@ aaa
aaa
aaa
aaa
-ajn
-akj
-ajn
+ajm
+aki
+akW
+alC
alD
-aml
-anj
+ani
ajn
aoU
aoU
-aoY
-arH
-asC
+aqP
+arG
+asB
+atF
+asG
+avS
+axc
+aoW
+aoW
+aoW
+aBY
+azy
+cZI
+cZR
+cZZ
+daj
+dat
+daE
anV
-auJ
-avT
-aoY
-aoU
-aoU
-aAM
-anV
-aCW
-aEn
-anV
-anV
-anV
-anV
-anV
-anV
-aMu
-aoU
-aoU
-aBX
-aRg
-aRD
-aTd
-aTG
-aUN
-aTG
-aTG
-aWi
-aTG
-aWR
-dbP
-aXy
-aTG
-aTG
-aYl
-aYt
-cPO
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-aYU
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-cPT
-cQC
-bbr
-cQJ
-bcw
-cQJ
-cQJ
-cQJ
-bfm
-cQJ
-cQJ
-bik
-bbs
-bjP
+aMt
+aNu
+aOC
+aPx
+aRf
+aRU
+aTa
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aXx
+cKe
+aLm
+aLm
+aLm
+aLm
+aYx
+aYz
+aYz
+aYz
+dtr
+aYz
+aYz
+aYz
+aYz
+dtr
+aYz
+aYz
+aYz
+bas
+baS
+baS
+baS
+baS
+baS
+baS
+baS
+baS
+cKp
+baS
+bij
+bja
+bjU
bkD
blG
bmF
@@ -148097,81 +153109,81 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-ajn
-ajn
ajn
+akj
ajn
+alD
+aml
+anj
ajn
aoU
aoU
aoY
-arI
-arM
-aoY
-arM
-arI
-aoY
-axR
-azv
-aAN
+arH
+asC
anV
-aCX
-aEo
-aBW
-aHf
-aIg
-aJp
-aKq
-aLs
-aMv
+auJ
+avT
+aoY
+aoU
+aoU
+aAM
+anV
+aCW
+aEn
+anV
+anV
+anV
+anV
+anV
+anV
+aMu
aoU
aoU
aBX
aRg
-aRV
-aTe
aRD
-aUO
-aRD
-aRD
-aWj
-aRD
-aTS
-aRD
-aRD
-aRD
-aRD
-aYm
-aRD
-aRP
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-arz
-baU
-bbs
-bbT
-bbs
-bbs
-bbs
-bbs
-bfn
-bbs
-bbs
-bil
-cKz
+aTd
+aTG
+aUN
+aTG
+aTG
+aWi
+dBH
+aWR
+dbP
+aXy
+aTG
+aTG
+aYl
+aYt
+cPO
+cPT
+cPT
+cPT
+cPT
+dts
+aYU
+aYU
+aYU
+aYU
+dtV
+aYU
+aYU
+aYU
+aYU
+cQC
+bbr
+cQJ
+bcw
+cQJ
+cQJ
+cQJ
+bfm
+cQJ
+cQJ
+bik
+dul
bjP
bkD
blE
@@ -148356,80 +153368,80 @@ aaa
aaa
aaa
aaa
-aaa
-akR
-akR
-akR
+ajn
+ajn
+ajn
+ajn
+ajn
+aoU
+aoU
+aoY
+arI
+arM
+aoY
+arM
+arI
+aoY
+axR
+azv
+aAN
anV
-aoY
-aoY
-aoY
-arH
-asD
-aoY
-auK
-avT
-aoY
-aoY
-aoY
-aoY
-anV
-aCY
-aEp
-aFJ
-aHg
-aIh
-aoU
-aEn
-aoY
-aMw
+aCX
+aEo
+aBW
+aHf
+aIg
+aJp
+aKq
+aLs
+aMv
aoU
aoU
-aPy
-aRh
-aRW
-aTf
-aTH
-aUP
-aVm
-aVI
-aWk
-aWE
-aWS
-aXd
-aQN
-aXP
-aQN
-aQN
-aQN
-aQR
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-arA
-baV
-bbt
-bbU
-bcx
-bdd
-bdd
-bez
-bfo
-bdd
-bdd
-bim
-bcx
-bjV
+aBX
+aRg
+aRV
+aTe
+aRD
+aUO
+aRD
+aRD
+aWj
+aRD
+aTS
+aRD
+aRD
+aRD
+aRD
+aYm
+aRD
+aRP
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+dBn
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+dtd
+baU
+bbs
+bbT
+bbs
+bbs
+bbs
+bbs
+bfn
+bbs
+bbs
+bil
+cKz
+bjP
bkD
blF
bmE
@@ -148614,79 +153626,79 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-abC
-arw
-aoZ
-aoZ
-aoZ
-arJ
-asE
-aoZ
-auL
-avU
-aoZ
-aoZ
-aoZ
-aaa
+akR
+akR
+akR
anV
-aCZ
-aEq
-aFK
-aHh
+aoY
+aoY
+aoY
+arH
+asD
+aoY
+auK
+avT
+aoY
+aoY
+aoY
+aoY
+anV
+aCY
+aEp
+aFJ
+aHg
+aIh
aoU
-aoU
-aKr
-aLt
-aMx
+aEn
+aoY
+aMw
aoU
aoU
aPy
-aPy
-aRX
-aTg
-aTI
-anV
-aLm
-aLm
-aWl
-aPJ
-aPl
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aLm
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-aYy
-baS
-baS
-baS
-baS
-baS
-bdK
-baS
-baS
-baS
-bgZ
-bin
-baS
-bjW
+aRh
+aRW
+aTf
+aTH
+aUP
+aVm
+aVI
+aWk
+aWE
+aWS
+aXd
+aQN
+aXP
+aQN
+aQN
+aQN
+aQR
+dtd
+dtd
+dtd
+dtd
+dtu
+dtd
+dtd
+dtd
+dtd
+dtu
+dtd
+dtd
+dtd
+dtd
+baV
+bbt
+bbU
+bcx
+bdd
+bdd
+bez
+bfo
+bdd
+bdd
+bim
+bcx
+bjV
bjW
bjW
bjW
@@ -148876,73 +153888,73 @@ aaa
abC
arw
aoZ
-apR
-apR
-apR
-apR
-atG
-apR
-apR
-apR
-axS
aoZ
-aAO
-aoY
-aDa
-aEr
-aBY
-aHi
-aoU
-aoU
-aKs
-aoY
-aMy
-aoU
-aoU
-aoU
-aoU
-aRY
-azA
-aTJ
+aoZ
+arJ
+asE
+aoZ
+auL
+avU
+aoZ
+aoZ
+aoZ
+aaa
+anV
+aCZ
+aEq
+aFK
+aHh
+aoU
+aoU
+aKr
+aLt
+aMx
+aoU
+aoU
+aPy
+aPy
+aRX
+aTg
+aTI
anV
-alx
aLm
-aWm
-aPI
-aUR
-dbQ
-aXz
aLm
-alx
-alx
-alx
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-abC
-aaa
-aaa
-baW
-baW
-bbo
-bbo
-bbq
-bbq
-bbq
-bbq
-bgs
-bha
-bio
-bje
+aWl
+aPJ
+aPl
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aYy
+aYy
+aYy
+aYy
+dtv
+aYy
+aYy
+aYy
+aYy
+dtv
+aYy
+aYy
+aYy
+aYy
+baS
+baS
+baS
+baS
+baS
+bdK
+baS
+baS
+baS
+bgZ
+bin
+baS
bjW
bkE
blH
@@ -149137,38 +154149,38 @@ apR
apR
apR
apR
+atG
apR
apR
apR
-apR
-apR
-azw
-aAP
+axS
+aoZ
+aAO
aoY
-aCW
-aEs
-anV
-aHj
-aIi
-azy
-aKt
+aDa
+aEr
aBY
-aMz
-aoW
-aoW
-aoW
-aoW
-aRZ
-cOC
+aHi
+aoU
+aoU
+aKs
+aoY
+aMy
+aoU
+aoU
+aoU
+aoU
+aRY
+azA
aTJ
anV
alx
aLm
-aWn
-aOl
-daW
-aXe
-aXA
+aWm
+aPI
+aUR
+dbQ
+aXz
aLm
alx
alx
@@ -149190,16 +154202,16 @@ aaa
aaa
baW
baW
-baW
+bbo
bbo
bbq
bbq
bbq
bbq
-bgp
-bhb
-ddo
-bjf
+bgs
+bha
+bio
+bje
bjW
bkF
blI
@@ -149405,46 +154417,46 @@ aoY
aCW
aEs
anV
-aHk
-aCW
-aJq
-aKu
-aLu
-aMA
-aoU
-aoU
-aoU
-aoU
-aRY
-apb
+aHj
+aIi
+azy
+aKt
+aBY
+aMz
+aoW
+aoW
+aoW
+aoW
+aRZ
+cOC
aTJ
anV
alx
aLm
-aMg
-aWF
-aWT
-aXf
-aNF
+aWn
+aOl
+daW
+aXe
+aXA
aLm
alx
alx
alx
-alx
-aXR
-aXR
-aXR
aaa
-aXR
-aXR
-aXR
-aXR
aaa
-aXR
-aXR
-aXR
-aXR
-aXR
+abC
+aaa
+aaa
+aaa
+aaa
+abC
+aaa
+aaa
+aaa
+aaa
+abC
+aaa
+aaa
baW
baW
baW
@@ -149659,49 +154671,49 @@ apR
azw
aAP
aoY
-aDb
-aEt
-anV
-aHl
aCW
+aEs
+anV
+aHk
+aCW
+aJq
+aKu
+aLu
+aMA
aoU
-aKv
-aoY
-aMB
-aNv
-aOD
-aPz
-aRi
-aSa
-aTh
-aTK
+aoU
+aoU
+aoU
+aRY
+apb
+aTJ
anV
alx
aLm
-aLm
-aLm
-aLm
-aLm
-aLm
+aMg
+aWF
+aWT
+aXf
+aNF
aLm
alx
alx
alx
alx
+aXR
+aXR
+aXR
aaa
+aXR
+aXR
+aXR
+aXR
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aXR
+aXR
+aXR
+aXR
+aXR
baW
baW
baW
@@ -149912,35 +154924,35 @@ apR
apR
apR
apR
-axS
-aoZ
-aAQ
+apR
+azw
+aAP
aoY
+aDb
+aEt
+anV
+aHl
aCW
-aEs
-anV
-aHm
-aCW
-aJr
-aKw
-anV
-anV
-anV
-anV
-aPA
-anV
-aSb
-avk
-anV
+aoU
+aKv
+aoY
+aMB
+aNv
+aOD
+aPz
+aRi
+aSa
+aTh
+aTK
anV
alx
-and
-and
-alx
-alx
-alx
-alx
-alx
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
+aLm
alx
alx
alx
@@ -150161,45 +155173,45 @@ aaa
abC
arw
aoZ
+apR
+apR
+apR
+apR
+apR
+apR
+apR
+apR
+axS
aoZ
-aoZ
-arK
-arK
-aoZ
-auM
-arK
-aoZ
-aoZ
-aoZ
-aaa
-anV
-aCZ
+aAQ
+aoY
+aCW
aEs
anV
-aHn
+aHm
aCW
-aoU
-daF
+aJr
+aKw
+anV
+anV
+anV
+anV
+aPA
+anV
+aSb
+avk
+anV
anV
-aez
-aez
-adZ
-afV
-akp
-aSc
-cOD
-cZB
-afS
-alx
-alx
-alx
-and
alx
and
and
-and
-and
-and
+alx
+alx
+alx
+alx
+alx
+alx
+alx
alx
alx
alx
@@ -150411,54 +155423,54 @@ aaa
aaa
aaa
aaa
-dnA
aaa
-akR
-akR
-akR
+aaa
+aaa
+aaa
+abC
+arw
+aoZ
+aoZ
+aoZ
+arK
+arK
+aoZ
+auM
+arK
+aoZ
+aoZ
+aoZ
+aaa
anV
-aoY
-aoY
-aoY
-arL
-asF
-aoY
-asF
-arL
-aoY
-aoY
-aoY
-aoY
-anV
-aCY
+aCZ
aEs
anV
-aHo
+aHn
aCW
aoU
-aKx
+daF
anV
aez
aez
adZ
-afS
-cYt
-cYK
-aiS
-afS
afV
+akp
+aSc
+cOD
+cZB
+afS
+alx
+alx
+alx
and
-and
-and
+alx
and
and
and
and
and
alx
-and
-and
-and
+alx
alx
alx
aaa
@@ -150668,42 +155680,42 @@ aaa
aaa
aaa
aaa
-dnB
-dnD
-dnD
-dnD
-dnD
-anT
-aoX
-aoU
-aoY
-arM
-arM
-aoY
-arM
-arM
-aoY
-axT
-azx
-aAR
+dnA
+aaa
+akR
+akR
+akR
anV
-aCX
+aoY
+aoY
+aoY
+arL
+asF
+aoY
+asF
+arL
+aoY
+aoY
+aoY
+aoY
+anV
+aCY
aEs
anV
-aHp
-aIj
-aJs
-aKy
-aHp
+aHo
+aCW
+aoU
+aKx
+anV
aez
aez
+adZ
afS
-cYm
-cYu
-akp
-akp
-cYg
+cYt
+cYK
+aiS
afS
+afV
and
and
and
@@ -150725,7 +155737,7 @@ aaa
aaa
aaa
aaa
-aaa
+cKF
aaa
aaa
aaa
@@ -150925,50 +155937,50 @@ aaa
aaa
aaa
aaa
-dnC
-akR
-akR
-akR
-alx
-anU
-apa
+dnB
+dnD
+dnD
+dnD
+dnD
+anT
+aoX
aoU
aoY
-arL
-arL
+arM
+arM
aoY
-arL
-arL
+arM
+arM
aoY
-aoU
-aoU
-aAM
+axT
+azx
+aAR
anV
-aDc
+aCX
aEs
-aFL
-aHq
-aIk
-aJt
-aKz
+anV
+aHp
+aIj
+aJs
+aKy
aHp
aez
aez
-aez
-cYj
+afS
+cYm
cYu
-aXh
+akp
+akp
+cYg
afS
-adZ
-afS
-aez
-aez
-afV
-aez
and
and
-alx
-alx
+and
+and
+and
+and
+and
+and
alx
and
and
@@ -151182,54 +156194,54 @@ aaa
aaa
aaa
aaa
-aaa
+dnC
+akR
akR
akR
alx
-alx
+anU
+apa
+aoU
+aoY
+arL
+arL
+aoY
+arL
+arL
+aoY
+aoU
+aoU
+aAM
anV
-apb
-aoU
-aoU
-aoU
-asG
-atH
-aoW
-aoW
-aoW
-aoW
-azy
-aoW
-aBY
-aDd
+aDc
aEs
-aFM
+aFL
aHq
-aIl
-aJu
-aKA
+aIk
+aJt
+aKz
aHp
-adZ
aez
aez
-apx
-cOz
-afV
+aez
+cYj
+cYu
+aXh
+afS
adZ
afS
+aez
+aez
afV
-afS
-aWo
-afK
-afV
-afS
-afS
-afV
-alx
-alx
+aez
+and
+and
alx
alx
alx
+and
+and
+and
alx
aaa
aaa
@@ -151445,48 +156457,48 @@ akR
alx
alx
anV
-apc
-apS
-apS
-arN
-arN
-cLU
-arN
-arN
-apS
-apS
-azz
-apS
-aBZ
-aDe
-aEu
-aFN
+apb
+aoU
+aoU
+aoU
+asG
+atH
+aoW
+aoW
+aoW
+aoW
+azy
+aoW
+aBY
+aDd
+aEs
+aFM
aHq
-aIm
+aIl
aJu
-aKB
+aKA
aHp
adZ
+aez
+aez
+apx
+cOz
afV
-afV
-alR
-amK
-alS
-afV
-akp
-akp
-akp
-akq
-avh
-awu
-alr
-aOF
+adZ
afS
afV
afS
+aWo
+afK
afV
-akR
-akR
+afS
+afS
+afV
+alx
+alx
+alx
+alx
+alx
akR
aaa
aaa
@@ -151698,50 +156710,50 @@ aaa
aaa
aaa
akR
-alx
+akR
alx
alx
anV
-apd
-aoU
-aoU
-arO
-arO
-aoU
-arO
-arO
-aoU
-axU
-azA
-aoU
-aBX
-aoU
-aEn
-aFO
+apc
+apS
+apS
+arN
+arN
+cLU
+arN
+arN
+apS
+apS
+azz
+apS
+aBZ
+aDe
+aEu
+aFN
aHq
aIm
aJu
-aKC
+aKB
aHp
-aHp
-aNw
-afS
-alS
-amK
-akp
-aOH
-akp
-akp
-cYl
-akp
-afp
+adZ
afV
+afV
+alR
+amK
+alS
+afV
+akp
+akp
+akp
akq
-akp
+avh
+awu
+alr
+aOF
afS
-akp
-akp
-ajo
+afV
+afS
+afV
akR
akR
aaa
@@ -151955,52 +156967,52 @@ aaa
aaa
aaa
akR
-akR
+alx
alx
alx
anV
-ape
-ape
-aqQ
-arP
-asH
-atI
-auN
-cZe
-apQ
-axV
-azB
-aAS
-aBW
-aDf
-aEv
-aFP
+apd
+aoU
+aoU
+arO
+arO
+aoU
+arO
+arO
+aoU
+axU
+azA
+aoU
+aBX
+aoU
+aEn
+aFO
aHq
-aIn
-aJv
-aKD
-cNU
-cOb
-cOf
-aOE
-cOs
-cYK
-afS
-afV
-afV
-afV
-aez
-afS
-afV
+aIm
+aJu
+aKC
+aHp
+aHp
+aNw
afS
+alS
+amK
akp
-aXg
+aOH
akp
akp
+cYl
+akp
+afp
+afV
+akq
+akp
+afS
+akp
akp
ajo
-aaa
-aaa
+akR
+akR
aaa
aaa
aaa
@@ -152211,49 +157223,49 @@ aaa
aaa
aaa
aaa
-aaa
akR
akR
-ank
-ank
-apf
-apf
-aqR
-ank
-ank
-ank
-ank
-ank
-ank
-ank
-azC
-ank
-ank
+alx
+alx
anV
-anV
-anV
-aHp
-aHp
-aHp
-aHp
-aHp
-aHp
-cYn
-aCr
-apu
-dbk
+ape
+ape
+aqQ
+arP
+asH
+atI
+auN
+cZe
+apQ
+axV
+azB
+aAS
+aBW
+aDf
+aEv
+aFP
+aHq
+aIn
+aJv
+aKD
+cNU
+cOb
+cOf
+aOE
+cOs
+cYK
afS
-alx
-and
-and
-and
-alx
-alx
+afV
+afV
+afV
+aez
+afS
+afV
afS
akp
-aXh
-afV
-aXQ
+aXg
+akp
+akp
akp
ajo
aaa
@@ -152469,49 +157481,49 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+akR
+akR
ank
-anW
-apg
-apT
-aqS
-aph
ank
-atJ
-atJ
-avV
-axd
-axW
-azD
-aAT
+apf
+apf
+aqR
ank
-adZ
+ank
+ank
+ank
+ank
+ank
+ank
+azC
+ank
+ank
+anV
+anV
+anV
+aHp
+aHp
+aHp
+aHp
+aHp
+aHp
+cYn
+aCr
+apu
+dbk
afS
-afV
-adZ
-adZ
-aJw
-aCr
-day
-aCr
-aNx
-aus
-afq
-afV
-aez
alx
and
and
and
-and
+alx
alx
afS
-aRj
-aXi
-afS
-ala
-ajr
+akp
+aXh
+afV
+aXQ
+akp
ajo
aaa
aaa
@@ -152729,69 +157741,69 @@ aaa
aaa
aaa
ank
-anX
+anW
+apg
+apT
+aqS
aph
-apU
-aqT
-arQ
-asI
-atK
-auO
-auO
-auO
-avW
-azE
-avW
ank
-cZB
-cYl
-aoR
-ahr
-aqj
-apu
-akq
-alS
-akp
-aNy
-afS
+atJ
+atJ
+avV
+axd
+axW
+azD
+aAT
+ank
adZ
+afS
+afV
+adZ
+adZ
+aJw
+aCr
+day
+aCr
+aNx
+aus
+afq
+afV
aez
-and
alx
and
and
and
and
alx
-afV
-afV
-afV
-afV
-afV
-afV
-afV
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-bbp
+afS
+aRj
+aXi
+afS
+ala
+ajr
+ajo
+aaa
+aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+bbo
bbo
bbq
bgp
@@ -152983,72 +157995,72 @@ aaa
aaa
aaa
aaa
-akR
-akR
+aaa
+aaa
ank
-anY
-api
-apV
-apV
-apV
-asJ
-atL
-atL
-avX
-atL
-atL
-azF
-aAU
+anX
+aph
+apU
+aqT
+arQ
+asI
+atK
+auO
+auO
+auO
+avW
+azE
+avW
ank
-aDg
-auE
+cZB
+cYl
+aoR
+ahr
+aqj
apu
-aqH
-afq
-afq
-aKE
-adZ
+akq
+alS
+akp
+aNy
+afS
adZ
+aez
+and
+alx
+and
+and
+and
+and
+alx
afV
-adZ
-alx
-alx
-alx
-alx
-and
-and
-and
-and
-alx
-alx
-akR
-akR
-alx
-alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-baW
+afV
+afV
+afV
+afV
+afV
+afV
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+bbp
bbo
bbq
bbq
@@ -153241,29 +158253,32 @@ aaa
aaa
aaa
akR
-alx
+akR
ank
-anZ
-apj
-apW
-aqU
-arR
+anY
+api
+apV
+apV
+apV
+asJ
+atL
+atL
+avX
+atL
+atL
+azF
+aAU
ank
-atM
-auP
-avW
-avW
-axX
-azG
-aAV
-ank
-afK
-aUW
-aoy
-apx
-anN
+aDg
+auE
+apu
+aqH
+afq
+afq
+aKE
+adZ
+adZ
afV
-afS
adZ
alx
alx
@@ -153273,15 +158288,12 @@ and
and
and
and
-and
-and
-and
+alx
alx
akR
akR
-akR
-akR
-akR
+alx
+alx
aaa
aaa
aaa
@@ -153496,31 +158508,31 @@ aaa
aaa
aaa
aaa
-akR
+aaa
akR
alx
ank
+anZ
+apj
+apW
+aqU
+arR
ank
+atM
+auP
+avW
+avW
+axX
+azG
+aAV
ank
-ank
-ank
-ank
-ank
-ank
-auQ
-avY
-auQ
-ank
-ank
-ank
-ank
+afK
+aUW
+aoy
+apx
+anN
afV
afS
-afS
-adZ
-adZ
-adZ
-adZ
adZ
alx
alx
@@ -153534,7 +158546,7 @@ and
and
and
alx
-alx
+akR
akR
akR
akR
@@ -153754,46 +158766,46 @@ aaa
aaa
aaa
akR
+akR
+alx
+ank
+ank
+ank
+ank
+ank
+ank
+ank
+ank
+auQ
+avY
+auQ
+ank
+ank
+ank
+ank
+afV
+afS
+afS
+adZ
+adZ
+adZ
+adZ
+adZ
alx
alx
alx
alx
-alx
+and
+and
+and
+and
+and
+and
+and
alx
alx
akR
akR
-atN
-auR
-avW
-avW
-atN
-akR
-akR
-alx
-alx
-and
-and
-and
-alx
-alx
-alx
-alx
-and
-and
-and
-and
-and
-and
-and
-and
-alx
-alx
-alx
-alx
-alx
-alx
-alx
akR
akR
aaa
@@ -154010,32 +159022,32 @@ aaa
aaa
aaa
aaa
-aaa
-alF
akR
-alF
alx
alx
alx
alx
-aaa
+alx
+alx
+alx
+akR
akR
atN
-auS
+auR
+avW
avW
-axe
atN
-aaa
akR
akR
alx
+alx
and
and
and
-and
-and
-and
-and
+alx
+alx
+alx
+alx
and
and
and
@@ -154051,8 +159063,8 @@ alx
alx
alx
alx
-alx
-alx
+akR
+akR
aaa
aaa
aaa
@@ -154268,48 +159280,48 @@ aaa
aaa
aaa
aaa
-abC
-aaa
-abC
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-atN
-atN
-avZ
-atN
-atN
-aaa
+alF
+akR
+alF
+alx
+alx
+alx
+alx
aaa
akR
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
-alx
+atN
+auS
+avW
+axe
+atN
aaa
+akR
+akR
+alx
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+and
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -154533,19 +159545,19 @@ aaa
aaa
aaa
aaa
-asK
-asK
-asL
-awa
-asL
-asK
-asK
-aaa
-aaa
-aaa
-aaa
+aaa
+atN
+atN
+avZ
+atN
+atN
aaa
aaa
+akR
+alx
+alx
+alx
+alx
alx
alx
alx
@@ -154791,11 +159803,11 @@ aaa
aaa
aaa
asK
-atO
-auT
-auT
-auU
-axY
+asK
+asL
+awa
+asL
+asK
asK
aaa
aaa
@@ -154803,52 +159815,52 @@ aaa
aaa
aaa
aaa
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
aaa
-alx
-alx
-alx
-alx
-alx
-and
-alx
-alx
-alx
-and
-alx
-alF
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-abC
-bbp
+aaa
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+cKF
+bbo
bbo
bbq
bgs
@@ -155047,16 +160059,13 @@ aaa
aaa
aaa
aaa
-asL
-atP
-auU
+asK
+atO
+auT
auT
auU
-axZ
-azH
-aaa
-aaa
-aaa
+axY
+asK
aaa
aaa
aaa
@@ -155072,41 +160081,44 @@ alx
alx
alx
alx
+and
alx
alx
alx
+and
alx
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-bbo
+alF
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+abC
+bbp
bbq
bgp
bit
@@ -155304,14 +160316,13 @@ aaa
aaa
aaa
aaa
-asK
-atQ
-auT
+asL
+atP
+auU
auT
auU
-aya
-asK
-aaa
+axZ
+azH
aaa
aaa
aaa
@@ -155329,6 +160340,11 @@ alx
alx
alx
alx
+alx
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -155338,10 +160354,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aac
aab
aaa
aaa
@@ -155562,11 +160574,11 @@ aaa
aaa
aaa
asK
-asK
-asL
-awb
-asL
-asK
+atQ
+auT
+auT
+auU
+aya
asK
aaa
aaa
@@ -155577,9 +160589,15 @@ aaa
aaa
aaa
aad
-aab
-aab
-aab
+aaa
+aaa
+aaa
+aaa
+aaa
+alx
+alx
+alx
+alx
aaa
aaa
aaa
@@ -155592,13 +160610,7 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aab
-aaa
-aaa
+aac
aaa
aac
aad
@@ -155818,13 +160830,13 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+asK
+asK
+asL
+awb
+asL
+asK
+asK
aaa
aaa
aaa
@@ -155853,7 +160865,7 @@ aaa
aaa
aaa
aaa
-aaa
+aab
aaa
aaa
aab
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 2e275a194f7..c46f6ea8305 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -44697,9 +44697,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
-/turf/open/floor/plating{
- icon_state = "plating_warn_side"
- },
+/turf/open/floor/plating,
/area/maintenance/starboard)
"bGN" = (
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/map_files/generic/Centcomm.dmm b/_maps/map_files/generic/Centcomm.dmm
index 6782e4cce4e..9f7787b585a 100644
--- a/_maps/map_files/generic/Centcomm.dmm
+++ b/_maps/map_files/generic/Centcomm.dmm
@@ -20,7 +20,7 @@
/turf/closed/indestructible/riveted,
/area/space)
"af" = (
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"ag" = (
/obj/structure/window/reinforced{
@@ -141,7 +141,7 @@
/area/space)
"ax" = (
/obj/structure/flora/bush,
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"ay" = (
/obj/item/toy/snowball{
@@ -155,7 +155,7 @@
/obj/item/toy/snowball{
pixel_x = -4
},
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"az" = (
/turf/open/floor/holofloor{
@@ -216,7 +216,7 @@
/area/holodeck/rec_center/court)
"aI" = (
/obj/structure/flora/grass/brown,
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aJ" = (
/obj/structure/table,
@@ -268,7 +268,7 @@
/obj/structure/statue/snow/snowman{
anchored = 1
},
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aP" = (
/obj/structure/chair/wood/normal{
@@ -282,7 +282,7 @@
/area/holodeck/rec_center/lounge)
"aQ" = (
/obj/structure/chair/wood/wings,
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aR" = (
/obj/structure/window/reinforced/tinted{
@@ -303,11 +303,11 @@
/area/holodeck/rec_center/lounge)
"aT" = (
/obj/structure/flora/tree/pine,
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aU" = (
/obj/structure/chair/wood,
-/turf/open/floor/holofloor/snow/cold,
+/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aV" = (
/obj/structure/table/wood,
@@ -14883,6 +14883,20 @@
/obj/machinery/computer/emergency_shuttle,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
+"Me" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Mf" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -64444,7 +64458,7 @@ Fa
Fh
Fh
Fh
-Fh
+Me
Fh
Fh
Fa
@@ -65729,7 +65743,7 @@ Fa
Md
Fp
FC
-Fh
+Mf
Fh
Fh
Fa
diff --git a/bot/config.py b/bot/config.py
index 8888753ab71..c0ffc55bed6 100644
--- a/bot/config.py
+++ b/bot/config.py
@@ -1,6 +1,7 @@
# Configuration for the minibot.py bot starts here
server = "irc.rizon.net"
port = 6667
+nudge_port = 45678
channels = ["#asdfgbus", "#botbus"]
defaultchannel = "#asdfgbus"
diff --git a/bot/minibot.py b/bot/minibot.py
index 82e46722f83..cc5ac1a5b4d 100755
--- a/bot/minibot.py
+++ b/bot/minibot.py
@@ -73,7 +73,7 @@ def setup_irc_socket():
def setup_nudge_socket():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind(("", 45678)) # localhost:45678
+ s.bind(("", nudge_port)) # localhost:nudge_port
s.listen(5)
logger.info("Nudge socket up and listening")
return s
diff --git a/bot/nudge.py b/bot/nudge.py
index 1af5c928fa6..afc2cf38b09 100755
--- a/bot/nudge.py
+++ b/bot/nudge.py
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
+from config import *
import sys
import pickle
import socket
@@ -16,7 +17,7 @@ def pack():
def nudge(data):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(("localhost", 45678))
+ s.connect(("localhost", nudge_port))
s.send(data)
s.close()
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
new file mode 100644
index 00000000000..d30a2d098fa
--- /dev/null
+++ b/code/__DEFINES/antagonists.dm
@@ -0,0 +1,3 @@
+#define ANTAG_DATUM_CULT /datum/antagonist/cult
+#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
+#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
\ No newline at end of file
diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
index 3f09f46817d..e7818d7bf32 100644
--- a/code/__DEFINES/language.dm
+++ b/code/__DEFINES/language.dm
@@ -1,2 +1,4 @@
#define NO_STUTTER 1
#define TONGUELESS_SPEECH 2
+#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4
+#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 26105a86964..22cd58c0353 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -23,6 +23,7 @@
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
#define BIOGENERATOR 32 //Uses biomass
#define LIMBGROWER 64 //Uses synthetic flesh
+#define SMELTER 128 //uses various minerals
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 29b4d7411db..7edf1f5959b 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -196,6 +196,21 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_STATE_XENO "xeno"
#define BLOOD_STATE_OIL "oil"
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
+
+//suit sensors: sensor_mode defines
+
+#define SENSOR_OFF 0
+#define SENSOR_LIVING 1
+#define SENSOR_VITALS 2
+#define SENSOR_COORDS 3
+
+//suit sensors: has_sensor defines
+
+#define BROKEN_SENSORS -1
+#define NO_SENSORS 0
+#define HAS_SENSORS 1
+#define LOCKED_SENSORS 2
+
//Turf wet states
#define TURF_DRY 0
#define TURF_WET_WATER 1
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index bc5816dbb91..0bfbe31fb14 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -31,5 +31,6 @@
/////////////
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
+#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index e66d528a5af..9ff38a3477a 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -488,3 +488,15 @@
L1[key] += other_value
else
L1[key] = other_value
+
+/proc/print_single_line(list/L)
+ . = "list("
+ for(var/I in 1 to L.len)
+ var/key = L[I]
+ . += "[key]"
+ var/val = L[key]
+ if(!isnull(val))
+ . += " => [val]"
+ if(I < L.len)
+ . += ", "
+ . += ")"
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a7338a0c5d2..1da1b50aa33 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -582,7 +582,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
return 0
//Repopulates sortedAreas list
-/proc/SortAreas()
+/proc/repopulate_sorted_areas()
GLOB.sortedAreas = list()
for(var/area/A in world)
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index 2ec3438892c..5f0ba6d1d8c 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -54,3 +54,4 @@ GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can
GLOBAL_LIST_EMPTY(sortedAreas)
GLOBAL_LIST_EMPTY(transit_markers)
+GLOBAL_LIST_EMPTY(all_abstract_markers)
\ No newline at end of file
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index b8531c536de..14242963245 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys,
GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(mob_list) //all mobs, including clientless
+GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob
GLOBAL_LIST_EMPTY(living_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(dead_mob_list) //all dead mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin.
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index 0853a10aeb7..2565ba8cc17 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -1,23 +1,23 @@
-GLOBAL_LIST_INIT(ai_names, world.file2list("config/names/ai.txt"))
-GLOBAL_LIST_INIT(wizard_first, world.file2list("config/names/wizardfirst.txt"))
-GLOBAL_LIST_INIT(wizard_second, world.file2list("config/names/wizardsecond.txt"))
-GLOBAL_LIST_INIT(ninja_titles, world.file2list("config/names/ninjatitle.txt"))
-GLOBAL_LIST_INIT(ninja_names, world.file2list("config/names/ninjaname.txt"))
-GLOBAL_LIST_INIT(commando_names, world.file2list("config/names/death_commando.txt"))
-GLOBAL_LIST_INIT(first_names_male, world.file2list("config/names/first_male.txt"))
-GLOBAL_LIST_INIT(first_names_female, world.file2list("config/names/first_female.txt"))
-GLOBAL_LIST_INIT(last_names, world.file2list("config/names/last.txt"))
-GLOBAL_LIST_INIT(lizard_names_male, world.file2list("config/names/lizard_male.txt"))
-GLOBAL_LIST_INIT(lizard_names_female, world.file2list("config/names/lizard_female.txt"))
-GLOBAL_LIST_INIT(clown_names, world.file2list("config/names/clown.txt"))
-GLOBAL_LIST_INIT(mime_names, world.file2list("config/names/mime.txt"))
-GLOBAL_LIST_INIT(carp_names, world.file2list("config/names/carp.txt"))
-GLOBAL_LIST_INIT(golem_names, world.file2list("config/names/golem.txt"))
-GLOBAL_LIST_INIT(plasmaman_names, world.file2list("config/names/plasmaman.txt"))
-GLOBAL_LIST_INIT(posibrain_names, list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD","COI"))
+GLOBAL_LIST_INIT(ai_names, world.file2list("strings/names/ai.txt"))
+GLOBAL_LIST_INIT(wizard_first, world.file2list("strings/names/wizardfirst.txt"))
+GLOBAL_LIST_INIT(wizard_second, world.file2list("strings/names/wizardsecond.txt"))
+GLOBAL_LIST_INIT(ninja_titles, world.file2list("strings/names/ninjatitle.txt"))
+GLOBAL_LIST_INIT(ninja_names, world.file2list("strings/names/ninjaname.txt"))
+GLOBAL_LIST_INIT(commando_names, world.file2list("strings/names/death_commando.txt"))
+GLOBAL_LIST_INIT(first_names_male, world.file2list("strings/names/first_male.txt"))
+GLOBAL_LIST_INIT(first_names_female, world.file2list("strings/names/first_female.txt"))
+GLOBAL_LIST_INIT(last_names, world.file2list("strings/names/last.txt"))
+GLOBAL_LIST_INIT(lizard_names_male, world.file2list("strings/names/lizard_male.txt"))
+GLOBAL_LIST_INIT(lizard_names_female, world.file2list("strings/names/lizard_female.txt"))
+GLOBAL_LIST_INIT(clown_names, world.file2list("strings/names/clown.txt"))
+GLOBAL_LIST_INIT(mime_names, world.file2list("strings/names/mime.txt"))
+GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
+GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
+GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
+GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
-GLOBAL_LIST_INIT(verbs, world.file2list("config/names/verbs.txt"))
-GLOBAL_LIST_INIT(adjectives, world.file2list("config/names/adjectives.txt"))
+GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
+GLOBAL_LIST_INIT(adjectives, world.file2list("strings/names/adjectives.txt"))
//loaded on startup because of "
//would include in rsc if ' was used
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 5de5d341ee4..680ae8703ee 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection org
GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
+GLOBAL_LIST_EMPTY(trophy_cases)
GLOBAL_LIST_EMPTY(wire_color_directory)
GLOBAL_LIST_EMPTY(wire_name_directory)
\ No newline at end of file
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 5c6e8893ef2..07fa2d14077 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -111,6 +111,10 @@
#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15"
#define ui_alien_queen_finder "EAST-1:28,CENTER-3:15"
+//constructs
+#define ui_construct_pull "EAST,CENTER-2:15"
+#define ui_construct_health "EAST,CENTER:15" //same as borgs and humans
+
// AI
#define ui_ai_core "SOUTH:6,WEST"
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 9c8fe9750a9..b376706a42b 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -393,6 +393,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
textlist += "
"
else
textlist += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
"
+ break
if(unconverted_ais_exist)
if(unconverted_ais_exist > 1)
textlist += "[unconverted_ais_exist] unconverted AIs exist!
"
diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm
new file mode 100644
index 00000000000..729de9da4a7
--- /dev/null
+++ b/code/_onclick/hud/constructs.dm
@@ -0,0 +1,18 @@
+
+/datum/hud/constructs
+ ui_style_icon = 'icons/mob/screen_construct.dmi'
+
+/datum/hud/constructs/New(mob/owner)
+ ..()
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = 'icons/mob/screen_construct.dmi'
+ pull_icon.update_icon(mymob)
+ pull_icon.screen_loc = ui_construct_pull
+ static_inventory += pull_icon
+
+ healths = new /obj/screen/healths/construct()
+ infodisplay += healths
+
+/mob/living/simple_animal/hostile/construct/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/constructs(src)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index af210a274c0..452bdcc0485 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -532,6 +532,12 @@
screen_loc = ui_health
mouse_opacity = 0
+/obj/screen/healths/construct
+ icon = 'icons/mob/screen_construct.dmi'
+ icon_state = "artificer_health0"
+ screen_loc = ui_construct_health
+ mouse_opacity = 0
+
/obj/screen/healthdoll
name = "health doll"
screen_loc = ui_healthdoll
diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm
index b25d51bc9be..e0f114778c7 100644
--- a/code/controllers/globals.dm
+++ b/code/controllers/globals.dm
@@ -16,13 +16,14 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order")
qdel(exclude_these)
+ log_world("[vars.len - gvars_datum_in_built_vars.len] global variables")
+
Initialize()
/datum/controller/global_vars/Destroy(force)
+ stack_trace("Some fucker qdel'd the global holder!")
if(!force)
return QDEL_HINT_LETMELIVE
-
- stack_trace("Some fucker deleted the global holder!")
QDEL_NULL(statclick)
gvars_datum_protected_varlist.Cut()
@@ -36,10 +37,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
if(!statclick)
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
- var/static/num_globals
- if(!num_globals)
- num_globals = vars.len - gvars_datum_in_built_vars.len
- stat("Globals:", statclick.update("Count: [num_globals]"))
+ stat("Globals:", statclick.update("Edit"))
/datum/controller/global_vars/can_vv_get(var_name)
if(var_name in gvars_datum_protected_varlist)
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 919b4cfce92..38245c5bccf 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -299,7 +299,7 @@ SUBSYSTEM_DEF(air)
var/timer = world.timeofday
warning("There are [starting_ats] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required)")
for(var/turf/T in active_turfs)
- GLOB.active_turfs_startlist += text("[T.x], [T.y], [T.z]\n")
+ GLOB.active_turfs_startlist += T
//now lets clear out these active turfs
var/list/turfs_to_check = active_turfs.Copy()
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index d73d417f5f2..85c580f4d9b 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -18,6 +18,8 @@ SUBSYSTEM_DEF(mapping)
var/list/shuttle_templates = list()
var/list/shelter_templates = list()
+ var/loading_ruins = FALSE
+
/datum/controller/subsystem/mapping/PreInit()
if(!config)
#ifdef FORCE_MAP
@@ -32,13 +34,13 @@ SUBSYSTEM_DEF(mapping)
if(config.defaulted)
to_chat(world, "Unable to load next map config, defaulting to Box Station")
loadWorld()
- SortAreas()
+ repopulate_sorted_areas()
process_teleport_locs() //Sets up the wizard teleport locations
preloadTemplates()
// Pick a random away mission.
createRandomZlevel()
// Generate mining.
-
+ loading_ruins = TRUE
var/mining_type = config.minetype
if (mining_type == "lavaland")
seedRuins(list(5), global.config.lavaland_budget, /area/lavaland/surface/outdoors, lava_ruins_templates)
@@ -54,7 +56,8 @@ SUBSYSTEM_DEF(mapping)
space_zlevels += i
seedRuins(space_zlevels, global.config.space_budget, /area/space, space_ruins_templates)
-
+ loading_ruins = FALSE
+ repopulate_sorted_areas()
// Set up Z-level transistions.
setup_map_transitions()
..()
@@ -144,31 +147,35 @@ SUBSYSTEM_DEF(mapping)
mapvotes[global.config.defaultmap.map_name] += 1
continue
mapvotes[vote] += 1
+ else
+ for(var/M in global.config.maplist)
+ mapvotes[M] = 1
- //filter votes
- for (var/map in mapvotes)
- if (!map)
- mapvotes.Remove(map)
- if (!(map in global.config.maplist))
- mapvotes.Remove(map)
- continue
- var/datum/map_config/VM = global.config.maplist[map]
- if (!VM)
- mapvotes.Remove(map)
- continue
- if (VM.voteweight <= 0)
- mapvotes.Remove(map)
- continue
- if (VM.config_min_users > 0 && players < VM.config_min_users)
- mapvotes.Remove(map)
- continue
- if (VM.config_max_users > 0 && players > VM.config_max_users)
- mapvotes.Remove(map)
- continue
+ //filter votes
+ for (var/map in mapvotes)
+ if (!map)
+ mapvotes.Remove(map)
+ if (!(map in global.config.maplist))
+ mapvotes.Remove(map)
+ continue
+ var/datum/map_config/VM = global.config.maplist[map]
+ if (!VM)
+ mapvotes.Remove(map)
+ continue
+ if (VM.voteweight <= 0)
+ mapvotes.Remove(map)
+ continue
+ if (VM.config_min_users > 0 && players < VM.config_min_users)
+ mapvotes.Remove(map)
+ continue
+ if (VM.config_max_users > 0 && players > VM.config_max_users)
+ mapvotes.Remove(map)
+ continue
+ if(global.config.allow_map_voting)
mapvotes[map] = mapvotes[map]*VM.voteweight
- var/pickedmap = global.config.allow_map_voting ? pickweight(mapvotes) : pick(global.config.maplist)
+ var/pickedmap = pickweight(mapvotes)
if (!pickedmap)
return
var/datum/map_config/VM = global.config.maplist[pickedmap]
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index abdeb0e9d35..77838e6509f 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -19,7 +19,7 @@ SUBSYSTEM_DEF(npcpool)
/datum/controller/subsystem/npcpool/stat_entry()
..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]")
-/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I)
+/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/I)
processing -= I
currentrun -= I
needsDelegate -= I
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index e1cf992e8b5..6b3e47054c1 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -11,10 +11,14 @@ SUBSYSTEM_DEF(persistence)
var/list/saved_messages = list()
var/savefile/chisel_messages_sav
+ var/savefile/trophy_sav
+ var/list/saved_trophies = list()
+
/datum/controller/subsystem/persistence/Initialize()
LoadSatchels()
LoadPoly()
LoadChiselMessages()
+ LoadTrophies()
..()
/datum/controller/subsystem/persistence/proc/LoadSatchels()
@@ -105,10 +109,49 @@ SUBSYSTEM_DEF(persistence)
M.persists = FALSE
qdel(M)
+/datum/controller/subsystem/persistence/proc/LoadTrophies()
+ trophy_sav = new /savefile("data/npc_saves/TrophyItems.sav")
+ var/saved_json
+ trophy_sav >> saved_json
+
+ var/decoded_json = json_decode(saved_json)
+
+ if(!islist(decoded_json))
+ return
+
+ saved_trophies = decoded_json
+
+ SetUpTrophies(saved_trophies.Copy())
+
+/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items)
+ for(var/A in GLOB.trophy_cases)
+ var/obj/structure/displaycase/trophy/T = A
+ T.added_roundstart = TRUE
+
+ var/trophy_data = pick_n_take(trophy_items)
+
+ if(!islist(trophy_data))
+ continue
+
+ var/list/chosen_trophy = trophy_data
+
+ if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed
+ continue
+
+ var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null
+ if(!path)
+ continue
+
+ T.showpiece = new /obj/item/showpiece_dummy(T, path)
+ T.trophy_message = chosen_trophy["message"]
+ T.placer_key = chosen_trophy["placer_key"]
+ T.update_icon()
+
/datum/controller/subsystem/persistence/proc/CollectData()
CollectChiselMessages()
CollectSecretSatchels()
+ CollectTrophies()
/datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
for(var/A in new_secret_satchels)
@@ -135,4 +178,16 @@ SUBSYSTEM_DEF(persistence)
chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages)
/datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M)
- saved_messages += list(M.pack()) // dm eats one list.
+ saved_messages += list(M.pack()) // dm eats one list
+
+
+/datum/controller/subsystem/persistence/proc/CollectTrophies()
+ trophy_sav << json_encode(saved_trophies)
+
+/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T)
+ if(!T.added_roundstart && T.showpiece)
+ var/list/data = list()
+ data["path"] = T.showpiece.type
+ data["message"] = T.trophy_message
+ data["placer_key"] = T.placer_key
+ saved_trophies += list(data)
\ No newline at end of file
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index bc8c14a74d1..dcddd37fbfe 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -208,12 +208,10 @@ SUBSYSTEM_DEF(shuttle)
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
var/security_num = seclevel2num(get_security_level())
switch(security_num)
- if(SEC_LEVEL_GREEN)
- emergency.request(null, 2, signal_origin, html_decode(emergency_reason), 0)
- if(SEC_LEVEL_BLUE)
- emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0)
+ if(SEC_LEVEL_RED,SEC_LEVEL_DELTA)
+ emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes.
else
- emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) // There is a serious threat we gotta move no time to give them five minutes.
+ 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.")
@@ -272,7 +270,7 @@ SUBSYSTEM_DEF(shuttle)
if(callShuttle)
if(EMERGENCY_IDLE_OR_RECALLED)
- emergency.request(null, 2.5)
+ emergency.request(null, set_coefficient = 2.5)
log_game("There is no means of calling the shuttle anymore. Shuttle automatically called.")
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 868d7d27e89..e1c751ce550 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -604,8 +604,8 @@ SUBSYSTEM_DEF(ticker)
if(selected_tip)
m = selected_tip
else
- var/list/randomtips = world.file2list("config/tips.txt")
- var/list/memetips = world.file2list("config/sillytips.txt")
+ var/list/randomtips = world.file2list("strings/tips.txt")
+ var/list/memetips = world.file2list("strings/sillytips.txt")
if(randomtips.len && prob(95))
m = pick(randomtips)
else if(memetips.len)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 8814464dcc8..5abea8281a1 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -117,7 +117,7 @@ SUBSYSTEM_DEF(vote)
if("gamemode")
if(GLOB.master_mode != .)
world.save_mode(.)
- if(SSticker && SSticker.mode)
+ if(SSticker.HasRoundStarted())
restart = 1
else
GLOB.master_mode = .
diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm
index cdad0920879..deee1111c06 100644
--- a/code/datums/antagonists/antag_datum.dm
+++ b/code/datums/antagonists/antag_datum.dm
@@ -1,87 +1,49 @@
-//The Datum, Antagonist. Handles various antag things via a datum.
/datum/antagonist
- var/mob/living/owner //who's our owner and accordingly an antagonist
- var/some_flufftext = "yer an antag larry"
- var/prevented_antag_datum_type //the type of antag datum that this datum can't coexist with; should probably be a list
- var/silent_update = FALSE //if we suppress messages during on_gain, apply_innate_effects, remove_innate_effects, and on_remove
+ var/name = "Antagonist"
-/datum/antagonist/New()
- if(!prevented_antag_datum_type)
- prevented_antag_datum_type = type
+ var/datum/mind/owner //Mind that owns this datum
-/datum/antagonist/Destroy()
- owner = null
- return ..()
+ var/silent = FALSE //Silent will prevent the gain/lose texts to show
-/datum/antagonist/proc/can_be_owned(mob/living/new_body)
- return new_body && !new_body.has_antag_datum(prevented_antag_datum_type, TRUE)
+ var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum
+ var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with
-/datum/antagonist/proc/give_to_body(mob/living/new_body) //tries to give an antag datum to a mob. cancels out if it can't be owned by the new body
- if(new_body && can_be_owned(new_body))
- new_body.antag_datums += src
- owner = new_body
- on_gain()
- . = src //return the datum if successful
- else
- qdel(src)
- . = FALSE
-/datum/antagonist/proc/on_gain() //on initial gain of antag datum, do this. should only be called once per datum
- apply_innate_effects()
- if(!silent_update && some_flufftext)
- to_chat(owner, some_flufftext)
+/datum/antagonist/New(datum/mind/new_owner)
+ . = ..()
+ typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
+ if(new_owner)
+ owner = new_owner
-/datum/antagonist/proc/apply_innate_effects() //applies innate effects to the owner, may be called multiple times due to mind transferral, but should only be called once per mob
- //antag huds would go here if antag huds were less completely unworkable as-is
+/datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body)
+ remove_innate_effects(old_body)
+ apply_innate_effects(new_body)
-/datum/antagonist/proc/remove_innate_effects() //removes innate effects from the owner, may be called multiple times due to mind transferral, but should only be called once per mob
- //also antag huds but see above antag huds a shit
+//This handles the application of antag huds/special abilities
+/datum/antagonist/proc/apply_innate_effects(mob/living/mob_override)
+ return
-/datum/antagonist/proc/on_remove() //totally removes the antag datum from the owner; can only be called once per owner
+//This handles the removal of antag huds/special abilities
+/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override)
+ return
+
+//Proc called when the datum is given to a mind.
+/datum/antagonist/proc/on_gain()
+ if(owner && owner.current)
+ if(!silent)
+ greet()
+ apply_innate_effects()
+
+/datum/antagonist/proc/on_removal()
remove_innate_effects()
- owner.antag_datums -= src
+ if(owner)
+ owner.antag_datums -= src
+ if(!silent && owner.current)
+ farewell()
qdel(src)
-/datum/antagonist/proc/transfer_to_new_body(mob/living/new_body)
- remove_innate_effects()
- if(!islist(new_body.antag_datums))
- new_body.antag_datums = list()
- new_body.antag_datums += src
- owner.antag_datums -= src
- owner = new_body
- apply_innate_effects()
+/datum/antagonist/proc/greet()
+ return
-//mob var and helper procs/Destroy override
-/mob/living
- var/list/antag_datums
-
-/mob/living/Destroy() //TODO: merge this with the living/Destroy() in code\modules\mob\living\living.dm (currently line 29)
- if(islist(antag_datums))
- for(var/i in antag_datums)
- qdel(i)
- antag_datums = null
- return ..()
-
-/mob/living/proc/can_have_antag_datum(datum_type) //if we can have this specific antagonist datum; neccessary, but requires creating a new antag datum each time.
- var/datum/antagonist/D = new datum_type()
- . = D.can_be_owned(src) //we can't exactly cache the results, either, because conditions might change. avoid use? TODO: better proc
- qdel(D)
-
-/mob/living/proc/gain_antag_datum(datum_type) //tries to give a mob a specific antagonist datum; returns the datum if successful.
- if(!islist(antag_datums))
- antag_datums = list()
- var/datum/antagonist/D = new datum_type()
- . = D.give_to_body(src)
-
-/mob/living/proc/has_antag_datum(type, check_subtypes) //checks this mob for if it has the antagonist datum. can either check specific type or subtypes
- if(!islist(antag_datums))
- return FALSE
- for(var/i in antag_datums)
- var/datum/antagonist/D = i
- if(check_subtypes)
- if(istype(D, type))
- return D //if it finds the datum, will return it so you can mess with it
- else
- if(D.type == type)
- return D
- return FALSE
+/datum/antagonist/proc/farewell()
+ return
\ No newline at end of file
diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm
index 0c39b5a9899..3084b9ba829 100644
--- a/code/datums/antagonists/datum_clockcult.dm
+++ b/code/datums/antagonists/datum_clockcult.dm
@@ -1,92 +1,57 @@
//CLOCKCULT PROOF OF CONCEPT
-
-/datum/antagonist/clockcultist
- prevented_antag_datum_type = /datum/antagonist/clockcultist
- some_flufftext = null
+/datum/antagonist/clockcult
var/datum/action/innate/hierophant/hierophant_network = new()
-/datum/antagonist/clockcultist/silent
- silent_update = TRUE
+/datum/antagonist/clockcult/silent
+ silent = TRUE
-/datum/antagonist/clockcultist/Destroy()
+/datum/antagonist/clockcult/Destroy()
qdel(hierophant_network)
- ..()
+ return ..()
-/datum/antagonist/clockcultist/can_be_owned(mob/living/new_body)
- . = ..()
- if(.)
- . = is_eligible_servant(new_body)
-
-/datum/antagonist/clockcultist/give_to_body(mob/living/new_body)
- if(iscyborg(new_body))
- var/mob/living/silicon/robot/R = new_body
- if(R.deployed)
- var/mob/living/silicon/ai/AI = R.mainframe
- R.undeploy()
- var/converted = add_servant_of_ratvar(AI, silent_update)
- to_chat(AI, "Anomaly Detected. Returned to core!") //The AI needs to be in its core to properly be converted
- return converted
- if(!silent_update)
- if(issilicon(new_body))
- to_chat(new_body, "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the Clockwork Justiciar, \
- lies in exile, derelict and forgotten in an unseen realm.")
- else
- to_chat(new_body, "[iscarbon(new_body) ? "Your mind is racing! Your body feels incredibly light! ":""]Your world glows a brilliant yellow! All at once it comes to you. \
- Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.")
- . = ..()
- if(!silent_update && new_body)
- if(.)
- new_body.visible_message("[new_body]'s eyes glow a blazing yellow!")
- to_chat(new_body, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. \
- Perform his every whim without hesitation.")
- else
- new_body.visible_message("[new_body] seems to resist an unseen force!")
- to_chat(new_body, "And yet, you somehow push it all away.")
-
-/datum/antagonist/clockcultist/on_gain()
- if(SSticker && SSticker.mode && owner.mind)
- SSticker.mode.servants_of_ratvar += owner.mind
- SSticker.mode.update_servant_icons_added(owner.mind)
- if(jobban_isbanned(owner, ROLE_SERVANT_OF_RATVAR))
- INVOKE_ASYNC(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR)
- if(owner.mind)
- owner.mind.special_role = "Servant of Ratvar"
- owner.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
- if(issilicon(owner))
+/datum/antagonist/clockcult/on_gain()
+ if(!owner)
+ return
+ var/mob/living/current = owner.current
+ if(!istype(current))
+ return
+ if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR))
+ addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0)
+ owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
+ if(issilicon(current))
var/mob/living/silicon/S = owner
- if(iscyborg(S) && !silent_update)
- to_chat(S, "You have been desynced from your master AI.\n\
- In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.")
+ if(iscyborg(S) && !silent)
+ to_chat(S, "You have been desynced from your master AI.")
+ to_chat(S, "In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.")
if(isAI(S))
to_chat(S, "You are able to use your cameras to listen in on conversations.")
to_chat(S, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
- else if(isbrain(owner) || isclockmob(owner))
- to_chat(owner, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
+ else if(isbrain(current) || isclockmob(current))
+ to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
..()
+ SSticker.mode.update_servant_icons_added(owner)
if(istype(SSticker.mode, /datum/game_mode/clockwork_cult))
var/datum/game_mode/clockwork_cult/C = SSticker.mode
C.present_tasks(owner) //Memorize the objectives
-/datum/antagonist/clockcultist/apply_innate_effects()
- GLOB.all_clockwork_mobs += owner
- owner.faction |= "ratvar"
- owner.grant_language(/datum/language/ratvar)
- owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
- if(issilicon(owner))
- var/mob/living/silicon/S = owner
+/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override)
+ . = ..()
+ var/mob/living/current = owner.current
+ if(istype(mob_override))
+ current = mob_override
+ GLOB.all_clockwork_mobs += current
+ current.faction |= "ratvar"
+ current.grant_language(/datum/language/ratvar)
+ current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
+ if(issilicon(current))
+ var/mob/living/silicon/S = current
if(iscyborg(S))
var/mob/living/silicon/robot/R = S
- if(!R.shell)
- R.UnlinkSelf()
+ R.UnlinkSelf()
R.module.rebuild_modules()
else if(isAI(S))
var/mob/living/silicon/ai/A = S
- A.can_be_carded = FALSE
A.requires_power = POWER_REQ_CLOCKCULT
- var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame
- for(var/d in GLOB.cardinal)
- AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow
- A.add_overlay(AI_frame)
if(!A.lacks_power())
A.ai_restore_power()
if(A.eyeobj)
@@ -106,58 +71,56 @@
hierophant_network.title = "Silicon"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "brass"
- else if(isbrain(owner))
- hierophant_network.Grant(owner)
+ else if(isbrain(current))
+ hierophant_network.Grant(current)
hierophant_network.title = "Vessel"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "alloy"
- else if(isclockmob(owner))
- hierophant_network.Grant(owner)
+ else if(isclockmob(current))
+ hierophant_network.Grant(current)
hierophant_network.title = "Construct"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "brass"
- owner.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
+ current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
if(!GLOB.clockwork_gateway_activated)
- owner.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs)
- ..()
+ current.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs)
+ update_slab_info()
-/datum/antagonist/clockcultist/remove_innate_effects()
- GLOB.all_clockwork_mobs -= owner
- owner.faction -= "ratvar"
- owner.remove_language(/datum/language/ratvar)
- owner.clear_alert("clockinfo")
- owner.clear_alert("scripturereq")
- for(var/datum/action/innate/function_call/F in owner.actions) //Removes any bound Ratvarian spears
+
+/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override)
+ var/mob/living/current = owner.current
+ if(istype(mob_override))
+ current = mob_override
+ GLOB.all_clockwork_mobs -= current
+ current.faction -= "ratvar"
+ current.remove_language(/datum/language/ratvar)
+ current.clear_alert("clockinfo")
+ current.clear_alert("scripturereq")
+ for(var/datum/action/innate/function_call/F in owner.current.actions) //Removes any bound Ratvarian spears
qdel(F)
- if(issilicon(owner))
- var/mob/living/silicon/S = owner
+ if(issilicon(current))
+ var/mob/living/silicon/S = current
if(isAI(S))
var/mob/living/silicon/ai/A = S
- A.can_be_carded = initial(A.can_be_carded)
A.requires_power = initial(A.requires_power)
- A.cut_overlays()
S.make_laws()
S.update_icons()
S.show_laws()
- var/mob/living/temp_owner = owner
+ var/mob/living/temp_owner = current
..()
if(iscyborg(temp_owner))
var/mob/living/silicon/robot/R = temp_owner
R.module.rebuild_modules()
if(temp_owner)
temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
+ update_slab_info()
-/datum/antagonist/clockcultist/on_remove()
- if(!silent_update)
- owner.visible_message("[owner] seems to have remembered their true allegiance!", \
+/datum/antagonist/clockcult/on_removal()
+ . = ..()
+ SSticker.mode.update_servant_icons_removed(owner)
+ if(!silent)
+ owner.current.visible_message("[owner] seems to have remembered their true allegiance!", \
"A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
- if(SSticker && SSticker.mode && owner.mind)
- SSticker.mode.servants_of_ratvar -= owner.mind
- SSticker.mode.update_servant_icons_removed(owner.mind)
- if(owner.mind)
- owner.mind.wipe_memory()
- owner.mind.special_role = null
- owner.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
- if(iscyborg(owner))
- to_chat(owner, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.")
- ..()
+ owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
+ if(iscyborg(owner.current))
+ to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.")
\ No newline at end of file
diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm
index 7d6806bab62..7a2161a1a0c 100644
--- a/code/datums/antagonists/datum_cult.dm
+++ b/code/datums/antagonists/datum_cult.dm
@@ -1,50 +1,41 @@
-/datum/antagonist/cultist
- prevented_antag_datum_type = /datum/antagonist/cultist
- some_flufftext = null
- var/datum/action/innate/cultcomm/communion = new()
+/datum/antagonist/cult
+ var/datum/action/innate/cultcomm/communion = new
-/datum/antagonist/cultist/Destroy()
+/datum/antagonist/cult/Destroy()
qdel(communion)
return ..()
-/datum/antagonist/cultist/can_be_owned(mob/living/new_body)
+/datum/antagonist/cult/on_gain()
. = ..()
- if(.)
- . = is_convertable_to_cult(new_body)
+ if(!owner)
+ return
+ if(jobban_isbanned(owner.current, ROLE_CULTIST))
+ addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0)
+ SSticker.mode.update_cult_icons_added(owner)
+ owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
-/datum/antagonist/cultist/on_gain()
- if(SSticker && SSticker.mode && owner.mind)
- SSticker.mode.cult += owner.mind
- SSticker.mode.update_cult_icons_added(owner.mind)
- if(istype(SSticker.mode, /datum/game_mode/cult))
- var/datum/game_mode/cult/C = SSticker.mode
- C.memorize_cult_objectives(owner.mind)
- if(jobban_isbanned(owner, ROLE_CULTIST))
- INVOKE_ASYNC(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_CULTIST, ROLE_CULTIST)
- if(owner.mind)
- owner.mind.special_role = "Cultist"
- owner.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
- ..()
+/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
+ . = ..()
+ var/mob/living/current = owner.current
+ if(mob_override)
+ current = mob_override
+ current.faction |= "cult"
+ current.verbs += /mob/living/proc/cult_help
+ communion.Grant(current)
-/datum/antagonist/cultist/apply_innate_effects()
- owner.faction |= "cult"
- owner.verbs += /mob/living/proc/cult_help
- communion.Grant(owner)
- ..()
+/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
+ . = ..()
+ var/mob/living/current = owner.current
+ if(mob_override)
+ current = mob_override
+ current.faction -= "cult"
+ current.verbs -= /mob/living/proc/cult_help
+ communion.Remove(current)
-/datum/antagonist/cultist/remove_innate_effects()
- owner.faction -= "cult"
- owner.verbs -= /mob/living/proc/cult_help
- ..()
-
-/datum/antagonist/cultist/on_remove()
- if(owner.mind)
- owner.mind.wipe_memory()
- if(SSticker && SSticker.mode)
- SSticker.mode.cult -= owner.mind
- SSticker.mode.update_cult_icons_removed(owner.mind)
+/datum/antagonist/cult/on_removal()
+ . = ..()
+ SSticker.mode.update_cult_icons_removed(owner)
to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.")
- owner.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
- if(!silent_update)
- owner.visible_message("[owner] looks like [owner.p_they()] just reverted to their old faith!")
- ..()
+ owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
+ if(!silent)
+ owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!")
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 628ff520aa5..3ba7efb4c98 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -27,6 +27,7 @@
. += "---"
.["Call Proc"] = "?_src_=vars;proc_call=\ref[src]"
.["Mark Object"] = "?_src_=vars;mark_object=\ref[src]"
+ .["Delete"] = "?_src_=vars;delete=\ref[src]"
/datum/proc/on_reagent_change()
@@ -525,6 +526,16 @@
if(T)
callproc_datum(T)
+ else if(href_list["delete"])
+ if(!check_rights(R_DEBUG, 0))
+ return
+
+ var/datum/D = locate(href_list["delete"])
+ if(!D)
+ to_chat(usr, "Unable to locate item!")
+ admin_delete(D)
+ href_list["datumrefresh"] = href_list["delete"]
+
else if(href_list["regenerateicons"])
if(!check_rights(0))
return
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index f542aea4561..96796c54356 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -105,13 +105,13 @@
probs[ctag] = 1
prob_sum += config.probabilities[ctag]
if(current_odds_differ)
- src <<"Game Mode Odds for current round:"
+ to_chat(src, "Game Mode Odds for current round:")
for(var/ctag in probs)
if(config.probabilities[ctag] > 0)
var/percentage = round(config.probabilities[ctag] / prob_sum * 100, 0.1)
to_chat(src, "[ctag] [percentage]%")
- src <<"All Game Mode Odds:"
+ to_chat(src, "All Game Mode Odds:")
var/sum = 0
for(var/ctag in config.probabilities)
sum += config.probabilities[ctag]
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
new file mode 100644
index 00000000000..0153e414145
--- /dev/null
+++ b/code/datums/holocall.dm
@@ -0,0 +1,154 @@
+#define HOLOPAD_MAX_DIAL_TIME 200
+
+/mob/camera/aiEye/remote/holo/setLoc()
+ . = ..()
+ var/obj/machinery/holopad/H = origin
+ H.move_hologram(eye_user, loc)
+
+//this datum manages it's own references
+
+/datum/holocall
+ var/mob/living/user //the one that called
+ var/obj/machinery/holopad/calling_holopad //the one that sent the call
+ var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null)
+ var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered
+
+ var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected
+ var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected
+
+ var/call_start_time
+
+//creates a holocall made by `caller` from `calling_pad` to `callees`
+/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees)
+ call_start_time = world.time
+ user = caller
+ calling_pad.outgoing_call = src
+ calling_holopad = calling_pad
+ dialed_holopads = list()
+
+ for(var/I in callees)
+ var/obj/machinery/holopad/H = I
+ if(!QDELETED(H) && H.is_operational())
+ dialed_holopads += H
+ LAZYADD(H.holo_calls, src)
+
+ if(!dialed_holopads.len)
+ calling_pad.say("Connection failure.")
+ qdel(src)
+
+ testing("Holocall started")
+
+//cleans up ALL references :)
+/datum/holocall/Destroy()
+ QDEL_NULL(eye)
+
+ user.reset_perspective()
+
+ user = null
+ hologram.HC = null
+ hologram = null
+ calling_holopad.outgoing_call = null
+
+ for(var/I in dialed_holopads)
+ var/obj/machinery/holopad/H = I
+ LAZYREMOVE(H.holo_calls, src)
+ dialed_holopads.Cut()
+
+ if(calling_holopad)
+ calling_holopad.SetLightsAndPower()
+ calling_holopad = null
+ if(connected_holopad)
+ connected_holopad.SetLightsAndPower()
+ connected_holopad = null
+
+ testing("Holocall destroyed")
+
+ return ..()
+
+//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection
+/datum/holocall/proc/Disconnect(obj/machinery/holopad/H)
+ testing("Holocall disconnect")
+ if(H == connected_holopad)
+ calling_holopad.say("[usr] disconnected.")
+ else if(H == calling_holopad && connected_holopad)
+ connected_holopad.say("[usr] disconnected.")
+
+ ConnectionFailure(H, TRUE)
+
+//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored.
+/datum/holocall/proc/ConnectionFailure(obj/machinery/holopad/H, graceful = FALSE)
+ testing("Holocall connection failure: graceful [graceful]")
+ if(H == connected_holopad || H == calling_holopad)
+ if(!graceful)
+ calling_holopad.say("Connection failure.")
+ qdel(src)
+ return
+
+ LAZYREMOVE(H.holo_calls, src)
+ dialed_holopads -= H
+ if(!dialed_holopads.len)
+ if(graceful)
+ calling_holopad.say("Call rejected.")
+ testing("No recipients, terminating")
+ qdel(src)
+
+//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored
+/datum/holocall/proc/Answer(obj/machinery/holopad/H)
+ testing("Holocall answer")
+ if(H == calling_holopad)
+ CRASH("How cute, a holopad tried to answer itself.")
+
+ if(!(H in dialed_holopads))
+ return
+
+ if(connected_holopad)
+ CRASH("Multi-connection holocall")
+
+ connected_holopad = H
+ for(var/I in dialed_holopads)
+ if(I == H)
+ continue
+ var/obj/machinery/holopad/Holo = I
+ LAZYREMOVE(Holo.holo_calls, src)
+ dialed_holopads -= Holo
+
+ if(!Check())
+ return
+
+ hologram = H.activate_holo(user)
+ hologram.HC = src
+
+ //eyeobj code is horrid, this is the best copypasta I could make
+ eye = new
+ eye.origin = H
+ eye.eye_initialized = TRUE
+ eye.eye_user = user
+ eye.name = "Camera Eye ([user.name])"
+ user.remote_control = eye
+ user.reset_perspective(eye)
+ eye.setLoc(H.loc)
+
+//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise
+/datum/holocall/proc/Check()
+ for(var/I in dialed_holopads)
+ var/obj/machinery/holopad/H = I
+ if(!H.is_operational())
+ ConnectionFailure(H)
+
+ if(QDELETED(src))
+ return FALSE
+
+ . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc
+
+ if(.)
+ if(connected_holopad)
+ . = !QDELETED(connected_holopad) && connected_holopad.is_operational()
+ else
+ . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
+ if(!.)
+ calling_holopad.say("No answer recieved.")
+ calling_holopad.temp = ""
+
+ if(!.)
+ testing("Holocall Check fail")
+ qdel(src)
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index cc6fa4f2c87..b20bf556d52 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -657,7 +657,7 @@
/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
- user <<"You remember the basics of CQC."
+ to_chat(user, "You remember the basics of CQC.")
var/datum/martial_art/cqc/D = new(null)
D.teach(user)
user.drop_item()
diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index af227212a7a..76de0329cd7 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -136,7 +136,7 @@
return FALSE
//For spawning mineral sheets; internal use only
-/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
+/datum/material_container/proc/retrieve(sheet_amt, datum/material/M, target = null)
if(!M.sheet_type)
return 0
if(sheet_amt > 0)
@@ -149,26 +149,28 @@
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
sheet_amt -= MAX_STACK_SIZE
if(round((sheet_amt * MINERAL_MATERIAL_AMOUNT) / MINERAL_MATERIAL_AMOUNT))
- new M.sheet_type(get_turf(owner), sheet_amt)
+ var/obj/item/stack/sheet/s = new M.sheet_type(get_turf(owner), sheet_amt)
+ if(target)
+ s.forceMove(target)
count += sheet_amt
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
return count
return 0
-/datum/material_container/proc/retrieve_sheets(sheet_amt, id)
+/datum/material_container/proc/retrieve_sheets(sheet_amt, id, target = null)
if(materials[id])
- return retrieve(sheet_amt, materials[id])
+ return retrieve(sheet_amt, materials[id], target)
return 0
-/datum/material_container/proc/retrieve_amount(amt, id)
- return retrieve_sheets(amount2sheet(amt), id)
+/datum/material_container/proc/retrieve_amount(amt, id, target)
+ return retrieve_sheets(amount2sheet(amt), id, target)
-/datum/material_container/proc/retrieve_all()
+/datum/material_container/proc/retrieve_all(target = null)
var/result = 0
var/datum/material/M
for(var/MAT in materials)
M = materials[MAT]
- result += retrieve_sheets(amount2sheet(M.amount), MAT)
+ result += retrieve_sheets(amount2sheet(M.amount), MAT, target)
return result
/datum/material_container/proc/has_space(amt = 0)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index e78d996f643..7e4d175537f 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -54,6 +54,7 @@
var/linglink
var/miming = 0 // Mime's vow of silence
+ var/list/antag_datums = list()
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
var/datum/gang/gang_datum //Which gang this mind belongs to, if any
@@ -86,13 +87,13 @@
if(new_character.mind) //disassociate any mind currently in our new body's mind variable
new_character.mind.current = null
- if(istype(current) && islist(current.antag_datums)) //wow apparently current isn't always living good fucking job SOMEONE
- for(var/i in current.antag_datums)
- var/datum/antagonist/D = i
- D.transfer_to_new_body(new_character)
var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list
+ var/mob/living/old_current = current
current = new_character //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
+ for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
+ var/datum/antagonist/A = a
+ A.on_body_transfer(old_current, current)
if(iscarbon(new_character))
var/mob/living/carbon/C = new_character
C.last_mind = src
@@ -108,6 +109,51 @@
/datum/mind/proc/wipe_memory()
memory = null
+// Datum antag mind procs
+/datum/mind/proc/add_antag_datum(datum_type, on_gain = TRUE)
+ if(!datum_type)
+ return
+ if(!can_hold_antag_datum(datum_type))
+ return
+ var/datum/antagonist/A = new datum_type(src)
+ antag_datums += A
+ if(on_gain)
+ A.on_gain()
+
+/datum/mind/proc/remove_antag_datum(datum_type)
+ if(!datum_type)
+ return
+ var/datum/antagonist/A = has_antag_datum(datum_type)
+ if(A)
+ A.on_removal()
+
+/datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us.
+ for(var/a in antag_datums)
+ var/datum/antagonist/A = a
+ A.on_removal()
+
+/datum/mind/proc/has_antag_datum(datum_type, check_subtypes = TRUE)
+ if(!datum_type)
+ return
+ . = FALSE
+ for(var/a in antag_datums)
+ var/datum/antagonist/A = a
+ if(check_subtypes && istype(A, datum_type))
+ return A
+ else if(A.type == datum_type)
+ return A
+
+/datum/mind/proc/can_hold_antag_datum(datum_type)
+ if(!datum_type)
+ return
+ . = TRUE
+ if(has_antag_datum(datum_type))
+ return FALSE
+ for(var/i in antag_datums)
+ var/datum/antagonist/A = i
+ if(is_type_in_typecache(A, A.typecache_datum_blacklist))
+ return FALSE
+
/*
Removes antag type's references from a mind.
@@ -234,7 +280,7 @@
creator.faction |= current.faction
if(creator.mind.special_role)
- message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.")
+ message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.")
to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.")
/datum/mind/proc/show_memory(mob/recipient, window=1)
@@ -255,7 +301,7 @@
to_chat(recipient, "[output]")
/datum/mind/proc/edit_memory()
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Not before round-start!", "Alert")
return
@@ -1143,7 +1189,7 @@
log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
return
if(!ishuman(current) && !iscyborg(current))
- usr << "This only works on humans and cyborgs!"
+ to_chat(usr, "This only works on humans and cyborgs!")
return
SSticker.mode.devils += src
special_role = "devil"
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index ab55919a03b..36883c59fe2 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -43,6 +43,13 @@
name = "Asteroid 5"
description = "Oh my god, another giant rock!"
+/datum/map_template/ruin/space/deep_storage
+ id = "deep-storage"
+ suffix = "deepstorage.dmm"
+ name = "Survivalist Bunker"
+ description = "Assume the best, prepare for the worst. Generally, you should do so by digging a three man heavily fortified bunker into a giant unused asteroid. \
+ Then make it self sufficient, mask any evidence of construction, hook it covertly into the telecommunications network and hope for the best."
+
/datum/map_template/ruin/space/bigderelict1
id = "bigderelict1"
suffix = "bigderelict1.dmm"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index d07f66609b6..7b00a17e41c 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -13,6 +13,7 @@
/datum/status_effect/shadow_mend/on_apply()
owner.visible_message("Violet light wraps around [owner]'s body!", "Violet light wraps around your body!")
playsound(owner, 'sound/magic/Teleport_app.ogg', 50, 1)
+ return ..()
/datum/status_effect/shadow_mend/tick()
owner.adjustBruteLoss(-15)
@@ -72,9 +73,12 @@
add_logs(owner, null, "gained Vanguard stun immunity")
owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!")
owner.visible_message("[owner] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.")
+ owner.SetStunned(0, FALSE)
+ owner.SetWeakened(0)
progbar = new(owner, duration, owner)
progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0))
progbar.update(duration - world.time)
+ return ..()
/datum/status_effect/vanguard_shield/tick()
progbar.update(duration - world.time)
@@ -127,6 +131,7 @@
animate(owner, color = oldcolor, time = 150, easing = EASE_IN)
addtimer(CALLBACK(owner, /atom/proc/update_atom_colour), 150)
playsound(owner, 'sound/magic/Ethereal_Enter.ogg', 50, 1)
+ return ..()
/datum/status_effect/inathneqs_endowment/on_remove()
add_logs(owner, null, "lost Inath-neq's invulnerability")
@@ -178,6 +183,7 @@
/datum/status_effect/his_grace/on_apply()
add_logs(owner, null, "gained His Grace's stun immunity")
owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!")
+ return ..()
/datum/status_effect/his_grace/tick()
bloodlust = 0
@@ -211,6 +217,7 @@
/datum/status_effect/wish_granters_gift/on_apply()
to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...")
+ return ..()
/datum/status_effect/wish_granters_gift/on_remove()
owner.revive(full_heal = 1, admin_revive = 1)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index f78a3ae522a..8eec853047b 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -29,3 +29,50 @@
owner.adjustBruteLoss(0.1)
owner.adjustFireLoss(0.1)
owner.adjustToxLoss(0.2, TRUE, TRUE)
+
+/datum/status_effect/belligerent
+ id = "belligerent"
+ duration = 70
+ tick_interval = 0 //tick as fast as possible
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /obj/screen/alert/status_effect/belligerent
+ var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run
+ var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists
+
+/obj/screen/alert/status_effect/belligerent
+ name = "Belligerent"
+ desc = "Kneel, her-eti'c."
+ icon_state = "belligerent"
+ alerttooltipstyle = "clockcult"
+
+/datum/status_effect/belligerent/on_apply()
+ return do_movement_toggle(TRUE)
+
+/datum/status_effect/belligerent/tick()
+ if(!do_movement_toggle())
+ qdel(src)
+
+/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage)
+ var/number_legs = owner.get_num_legs()
+ if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.null_rod_check() && number_legs)
+ if(force_damage || owner.m_intent != MOVE_INTENT_WALK)
+ if(GLOB.ratvar_awakens)
+ owner.Weaken(1)
+ if(iscultist(owner))
+ owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "l_leg")
+ owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "r_leg")
+ else
+ owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "l_leg")
+ owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "r_leg")
+ if(owner.m_intent != MOVE_INTENT_WALK)
+ if(!iscultist(owner))
+ to_chat(owner, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!")
+ else //Cultists take extra burn damage
+ to_chat(owner, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!")
+ owner.toggle_move_intent()
+ return TRUE
+ return FALSE
+
+/datum/status_effect/belligerent/on_remove()
+ if(owner.m_intent == MOVE_INTENT_WALK)
+ owner.toggle_move_intent()
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index c2c070dbece..ff92b67978c 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -16,6 +16,7 @@
cube = icon('icons/effects/freeze.dmi', "ice_cube")
owner.add_overlay(cube)
owner.update_canmove()
+ return ..()
/datum/status_effect/freon/tick()
owner.update_canmove()
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 8b6d255f1ab..74a18536832 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -8,6 +8,7 @@
var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
var/mob/living/owner //The mob affected by the status effect.
var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another
+ var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
/datum/status_effect/New(mob/living/new_owner)
@@ -21,17 +22,17 @@
STOP_PROCESSING(SSfastprocess, src)
if(owner)
owner.clear_alert(id)
- on_remove()
LAZYREMOVE(owner.status_effects, src)
+ on_remove()
+ owner = null
return ..()
/datum/status_effect/proc/start_ticking()
if(!src)
return
- if(!owner)
+ if(!owner || !on_apply())
qdel(src)
return
- on_apply()
if(duration != -1)
duration = world.time + initial(duration)
tick_interval = world.time + initial(tick_interval)
@@ -50,10 +51,11 @@
if(duration != -1 && duration < world.time)
qdel(src)
-/datum/status_effect/proc/on_apply() //Called whenever the buff is applied.
+/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself.
+ return TRUE
/datum/status_effect/proc/tick() //Called every tick.
-/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed.
-/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself
+/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
+/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
owner = null
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index f3e2de241ff..137229db37f 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -42,6 +42,7 @@
var/has_gravity = 0
var/noteleport = 0 //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter)
+ var/hidden = FALSE //Hides area from player Teleport function.
var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
var/no_air = null
diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm
index 21999a74a15..7bf213be523 100644
--- a/code/game/area/areas/holodeck.dm
+++ b/code/game/area/areas/holodeck.dm
@@ -3,6 +3,7 @@
icon_state = "Holodeck"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
flags = 0
+ hidden = TRUE
var/obj/machinery/computer/holodeck/linked
var/restricted = 0 // if true, program goes on emag list
@@ -95,16 +96,15 @@
/area/holodeck/rec_center/kobayashi
name = "Holodeck - Kobayashi Maru"
+/area/holodeck/rec_center/winterwonderland
+ name = "Holodeck - Winter Wonderland"
+
// Bad programs
/area/holodeck/rec_center/burn
name = "Holodeck - Atmospheric Burn Test"
restricted = 1
-/area/holodeck/rec_center/winterwonderland
- name = "Holodeck - Winter Wonderland"
- restricted = 1
-
/area/holodeck/rec_center/wildlife
name = "Holodeck - Wildlife Simulation"
restricted = 1
diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm
index d697c8436f7..828d165dd86 100644
--- a/code/game/area/areas/ruins.dm
+++ b/code/game/area/areas/ruins.dm
@@ -4,6 +4,7 @@
name = "\improper Unexplored Location"
icon_state = "away"
has_gravity = 1
+ hidden = TRUE
/area/ruin/unpowered
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 3b82020c608..4e35f820753 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -121,7 +121,7 @@
if(flags & CLEAN_ON_MOVE)
clean_on_move()
-
+
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
if(proximity_monitor)
proximity_monitor.HandleMove()
@@ -562,7 +562,7 @@
return
else
var/turf/currentturf = get_turf(src)
- get(src, /mob) << "You can't help but feel that you just lost something back there..."
+ to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...")
var/turf/targetturf = relocate()
log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].")
if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE))
@@ -628,4 +628,4 @@
/atom/movable/proc/ConveyorMove(movedir)
set waitfor = FALSE
if(!anchored && has_gravity())
- step(src, movedir)
+ step(src, movedir)
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index de830c856ba..2e5854509aa 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -24,7 +24,7 @@
if(!istype(H)) return 0
var/obj/item/clothing/under/U = H.w_uniform
if(!istype(U)) return 0
- if(U.sensor_mode <= 2) return 0
+ if(U.sensor_mode <= SENSOR_VITALS) return 0
return 1
/datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index deb5ad7e1a1..7fccb37d3cd 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -46,7 +46,7 @@ Credit where due:
///////////
/proc/is_servant_of_ratvar(mob/living/M)
- return istype(M) && M.has_antag_datum(/datum/antagonist/clockcultist, TRUE)
+ return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CLOCKCULT)
/proc/is_eligible_servant(mob/living/M)
if(!istype(M))
@@ -65,17 +65,21 @@ Credit where due:
return FALSE
/proc/add_servant_of_ratvar(mob/living/L, silent = FALSE)
- var/update_type = /datum/antagonist/clockcultist
+ if(!L || !L.mind)
+ return
+ var/update_type = ANTAG_DATUM_CLOCKCULT
if(silent)
- update_type = /datum/antagonist/clockcultist/silent
- . = L.gain_antag_datum(update_type)
+ update_type = ANTAG_DATUM_CLOCKCULT_SILENT
+ . = L.mind.add_antag_datum(update_type)
/proc/remove_servant_of_ratvar(mob/living/L, silent = FALSE)
- var/datum/antagonist/clockcultist/clock_datum = L.has_antag_datum(/datum/antagonist/clockcultist, TRUE)
+ if(!L || !L.mind)
+ return
+ var/datum/antagonist/clockcult/clock_datum = L.mind.has_antag_datum(/datum/antagonist/clockcult)
if(!clock_datum)
return FALSE
- clock_datum.silent_update = silent
- clock_datum.on_remove()
+ clock_datum.silent = silent
+ clock_datum.on_removal()
return TRUE
///////////////
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 6c56295c051..4f45b473aea 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
@@ -202,6 +202,21 @@
and [structure_number] Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.")
if(iscyborg(user))
to_chat(user, "You can recharge from the [sigil_name] by crossing it.")
+ else if(!GLOB.ratvar_awakens)
+ to_chat(user, "Hitting the [sigil_name] with brass sheets will convert them to power at a rate of 1 brass sheet to [POWER_FLOOR]W power.")
+ if(!GLOB.ratvar_awakens)
+ to_chat(user, "You can recharge Clockwork Proselytizers from the [sigil_name].")
+
+/obj/effect/clockwork/sigil/transmission/attackby(obj/item/I, mob/living/user, params)
+ if(is_servant_of_ratvar(user) && istype(I, /obj/item/stack/tile/brass) && !GLOB.ratvar_awakens)
+ var/obj/item/stack/tile/brass/B = I
+ user.visible_message("[user] places [B] on [src], causing it to disintegrate into glowing orange energy!", \
+ "You charge the [sigil_name] with [B], providing it with [B.amount * POWER_FLOOR]W of power.")
+ modify_charge(-(B.amount * POWER_FLOOR))
+ playsound(src, 'sound/effects/light_flicker.ogg', (B.amount * POWER_FLOOR) * 0.01, 1)
+ qdel(B)
+ return TRUE
+ return ..()
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
if(is_servant_of_ratvar(L))
@@ -214,9 +229,7 @@
if(!cyborg_checks(cyborg))
return
to_chat(cyborg, "You start to charge from the [sigil_name]...")
- if(!do_after(cyborg, 50, target = src))
- return
- if(!cyborg_checks(cyborg))
+ if(!do_after(cyborg, 50, target = src, extra_checks = CALLBACK(src, .proc/cyborg_checks, cyborg, TRUE)))
return
var/giving_power = min(Floor(cyborg.cell.maxcharge - cyborg.cell.charge, MIN_CLOCKCULT_POWER), power_charge) //give the borg either all our power or their missing power floored to MIN_CLOCKCULT_POWER
if(modify_charge(giving_power))
@@ -228,23 +241,27 @@
animate(cyborg, color = previous_color, time = 100)
addtimer(CALLBACK(cyborg, /atom/proc/update_atom_colour), 100)
-/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg)
+/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg, silent)
if(!cyborg.cell)
- to_chat(cyborg, "You have no cell!")
+ if(!silent)
+ to_chat(cyborg, "You have no cell!")
return FALSE
if(!power_charge)
- to_chat(cyborg, "The [sigil_name] has no stored power!")
+ if(!silent)
+ to_chat(cyborg, "The [sigil_name] has no stored power!")
return FALSE
if(cyborg.cell.charge > cyborg.cell.maxcharge - MIN_CLOCKCULT_POWER)
- to_chat(cyborg, "You are already at maximum charge!")
+ if(!silent)
+ to_chat(cyborg, "You are already at maximum charge!")
return FALSE
if(cyborg.has_status_effect(STATUS_EFFECT_POWERREGEN))
- to_chat(cyborg, "You are already regenerating power!")
+ if(!silent)
+ to_chat(cyborg, "You are already regenerating power!")
return FALSE
return TRUE
-/obj/effect/clockwork/sigil/transmission/New()
- ..()
+/obj/effect/clockwork/sigil/transmission/Initialize()
+ . = ..()
update_glow()
/obj/effect/clockwork/sigil/transmission/proc/modify_charge(amount)
@@ -299,8 +316,7 @@
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
return
visible_message("[src] begins to glow bright blue!")
- animate(src, alpha = 255, time = 10)
- addtimer(CALLBACK(src, .proc/update_alpha), 10)
+ animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
sleep(10)
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src))
@@ -369,12 +385,4 @@
animation_number = initial(animation_number)
sigil_active = FALSE
visible_message("[src] slowly stops glowing!")
- if(sigil_active || alpha == 255)
- animate(src, alpha = initial(alpha), time = 10)
- addtimer(CALLBACK(src, .proc/update_alpha), 10)
-
-/obj/effect/clockwork/sigil/vitality/proc/update_alpha()
- if(sigil_active)
- alpha = 255
- else
- alpha = initial(alpha)
+ animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW)
diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
index f376410124c..1c49d366930 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
@@ -15,9 +15,8 @@
var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one
var/timerid
-/obj/effect/clockwork/spatial_gateway/New()
- ..()
- update_light()
+/obj/effect/clockwork/spatial_gateway/Initialize()
+ . = ..()
addtimer(CALLBACK(src, .proc/check_setup), 1)
/obj/effect/clockwork/spatial_gateway/Destroy()
@@ -99,12 +98,12 @@
if(severity == 1 && uses)
uses = 0
visible_message("[src] is disrupted!")
- animate(src, alpha = 0, transform = matrix()*2, time = 10)
+ animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
deltimer(timerid)
timerid = QDEL_IN(src, 10)
linked_gateway.uses = 0
linked_gateway.visible_message("[linked_gateway] is disrupted!")
- animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10)
+ animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
deltimer(linked_gateway.timerid)
linked_gateway.timerid = QDEL_IN(linked_gateway, 10)
return TRUE
@@ -131,9 +130,9 @@
playsound(src, 'sound/effects/EMPulse.ogg', 50, 1)
playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1)
transform = matrix() * 1.5
- animate(src, transform = matrix() / 1.5, time = 10)
+ animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
linked_gateway.transform = matrix() * 1.5
- animate(linked_gateway, transform = matrix() / 1.5, time = 10)
+ animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
A.forceMove(get_turf(linked_gateway))
if(!no_cost)
uses = max(0, uses - 1)
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 e3c456460c0..120ed0ff601 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
@@ -22,6 +22,12 @@
else
for(var/i in GLOB.clockwork_component_cache)
.[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*GLOB.clockwork_component_cache[i], 1)
+ for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in GLOB.all_clockwork_objects)
+ if(G.still_needs_components())
+ for(var/i in G.required_components)
+ if(!G.required_components[i])
+ . -= i
+ break
. = pickweight(.)
//returns a component name from a component id
@@ -37,6 +43,8 @@
return "Replicant Alloy"
if(HIEROPHANT_ANSIBLE)
return "Hierophant Ansible"
+ else
+ return null
//returns a component acronym from a component id
/proc/get_component_acronym(id)
@@ -51,6 +59,8 @@
return "RA"
if(HIEROPHANT_ANSIBLE)
return "HA"
+ else
+ return null
//returns a component id from a component name
/proc/get_component_id(name)
@@ -65,6 +75,8 @@
return REPLICANT_ALLOY
if("Hierophant Ansible")
return HIEROPHANT_ANSIBLE
+ else
+ return null
//returns a component spanclass from a component id
/proc/get_component_span(id)
@@ -121,6 +133,8 @@
return /obj/effect/overlay/temp/ratvar/component/alloy
if(HIEROPHANT_ANSIBLE)
return /obj/effect/overlay/temp/ratvar/component/ansible
+ else
+ return null
//returns a type for a component from a component id
/proc/get_component_type(id)
@@ -134,4 +148,6 @@
if(REPLICANT_ALLOY)
return /obj/item/clockwork/component/replicant_alloy
if(HIEROPHANT_ANSIBLE)
- return /obj/item/clockwork/component/hierophant_ansible
\ No newline at end of file
+ return /obj/item/clockwork/component/hierophant_ansible
+ else
+ return null
\ No newline at end of file
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 c6954bb67e8..529f38d832f 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
@@ -286,6 +286,28 @@
user.visible_message("[user]'s [proselytizer.name] stops covering [src] with glowing orange energy.", \
"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)
+ . = TRUE
+ var/list/charge_values = list()
+ if(!proselytizer.sigil_charge_checks(charge_values, src, user))
+ return
+ user.visible_message("[user]'s [proselytizer.name] starts draining glowing orange energy from [src]...", \
+ "You start recharging your [proselytizer.name]...")
+ proselytizer.recharging = src
+ while(proselytizer && user && src)
+ if(!do_after(user, 10, target = src, extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/sigil_charge_checks, charge_values, src, user, TRUE)))
+ break
+ modify_charge(charge_values["power_gain"])
+ proselytizer.modify_stored_power(charge_values["power_gain"])
+ playsound(src, 'sound/effects/light_flicker.ogg', charge_values["power_gain"] * 0.1, 1)
+
+ if(proselytizer)
+ proselytizer.recharging = null
+ if(user)
+ user.visible_message("[user]'s [proselytizer.name] stops draining glowing orange energy from [src].", \
+ "You finish recharging your [proselytizer.name]. It now contains [proselytizer.get_power()]W/[proselytizer.get_max_power()]W power.")
+
//Proselytizer mob heal proc, to avoid as much copypaste as possible.
/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/list/repair_values = list()
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm b/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm
index fcb30a096da..a9727017d34 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm
@@ -106,6 +106,6 @@ List of nuances:
if(!whisper)
L.say(message, "clock", spans, language=/datum/language/common)
else
- L.whisper(message)
+ L.whisper(message, "clock", spans, language=/datum/language/common)
else
AM.say(message, language=/datum/language/common)
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
index 25e2138b816..60df56b6ef4 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
@@ -12,6 +12,7 @@
var/uses_power = TRUE
var/metal_to_power = FALSE
var/repairing = null //what we're currently repairing, if anything
+ var/obj/effect/clockwork/sigil/transmission/recharging = null //the sigil we're charging from, if any
var/speed_multiplier = 1 //how fast this proselytizer works
var/charge_rate = MIN_CLOCKCULT_POWER //how much power we gain every two seconds
var/charge_delay = 2 //how many proccess ticks remain before we can start to charge
@@ -140,10 +141,11 @@
/obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user)
if(is_servant_of_ratvar(user))
- if(!can_use_power(POWER_WALL_TOTAL))
- to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!")
- return
- modify_stored_power(-POWER_WALL_TOTAL)
+ if(uses_power)
+ if(!can_use_power(POWER_WALL_TOTAL))
+ to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!")
+ return
+ modify_stored_power(-POWER_WALL_TOTAL)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
new/obj/item/stack/tile/brass(user.loc, 5)
to_chat(user, "You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores [get_power()]W/[get_max_power()]W of power.")
@@ -182,6 +184,9 @@
if(repairing)
to_chat(user, "You are currently repairing [repairing] with [src]!")
return FALSE
+ if(recharging)
+ to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!")
+ return FALSE
var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list
if(!islist(proselytize_values))
if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason
@@ -237,7 +242,7 @@
/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing
if(!islist(proselytize_values) || !target || QDELETED(target) || !user)
return FALSE
- if(repairing)
+ if(repairing || recharging)
return FALSE
if(target.type != expected_type)
return FALSE
@@ -296,3 +301,20 @@
[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W to fully repair [target == user ? "yourself" : "[target.p_them()]"]!")
return FALSE
return TRUE
+
+//checked constantly while charging from a sigil
+/obj/item/clockwork/clockwork_proselytizer/proc/sigil_charge_checks(list/charge_values, obj/effect/clockwork/sigil/transmission/sigil, mob/user, silent)
+ if(!islist(charge_values) || !sigil || QDELETED(sigil) || !user)
+ return FALSE
+ if(can_use_power(RATVAR_POWER_CHECK))
+ return FALSE
+ charge_values["power_gain"] = Clamp(sigil.power_charge, 0, POWER_WALL_MINUS_FLOOR)
+ if(!charge_values["power_gain"])
+ if(!silent)
+ to_chat(user, "The [sigil.sigil_name] contains no power!")
+ return FALSE
+ if(stored_power + charge_values["power_gain"] > max_power)
+ if(!silent)
+ to_chat(user, "Your [name] contains too much power to charge from the [sigil.sigil_name]!")
+ return FALSE
+ return TRUE
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
index 36ff67262b2..35caabab5a8 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
@@ -61,7 +61,7 @@
/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
- /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/fellowship_armory, /datum/clockwork_scripture/create_object/mending_motor)
+ /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/channeled/mending_mantra, /datum/clockwork_scripture/fellowship_armory)
/obj/item/clockwork/slab/cyborg/security //four scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \
diff --git a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
index 1b6c80af734..6d17fe4e74f 100644
--- a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
@@ -129,6 +129,7 @@
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
apply_eye_damage(H)
+ return ..()
/datum/status_effect/wraith_spectacles/tick()
if(!ishuman(owner))
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
index efc479f5224..25576f57107 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
@@ -214,28 +214,6 @@
quickbind_desc = "Creates an Interdiction Lens, which drains power into nearby Sigils of Transmission."
-//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures at a power cost
-/datum/clockwork_scripture/create_object/mending_motor
- descname = "Powered Structure, Repairs Other Structures"
- name = "Mending Motor"
- desc = "Creates a mechanized prism that will rapidly repair damaged clockwork constructs, converted cyborgs, and clockwork structures."
- invocations = list("May this prism...", "...mend our dents and scratches!")
- channel_time = 80
- consumed_components = list(VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 1)
- object_path = /obj/structure/destructible/clockwork/powered/mending_motor
- creator_message = "You form a mending motor, which will rapidly repair damaged clockwork constructs, converted cyborgs, and clockwork structures."
- observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!"
- invokers_required = 2
- multiple_invokers_used = TRUE
- usage_tip = "Powerful healing but power use is somewhat inefficient, though much better than a proselytizer."
- tier = SCRIPTURE_APPLICATION
- one_per_tile = TRUE
- primary_component = VANGUARD_COGWHEEL
- sort_priority = 7
- quickbind = TRUE
- quickbind_desc = "Creates a Mending Motor, which rapidly repairs constructs and structures at a power cost."
-
-
//Mania Motor: Creates a malevolent transmitter that will broadcast the whispers of Sevtug into the minds of nearby nonservants, causing a variety of mental effects at a power cost.
/datum/clockwork_scripture/create_object/mania_motor
descname = "Powered Structure, Area Denial"
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index 023cd50dd13..2e822199d3f 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -17,23 +17,10 @@
sort_priority = 1
quickbind = TRUE
quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant.
Maximum 15 chants."
- var/noncultist_damage = 2 //damage per chant to noncultists
- var/cultist_damage = 8 //damage per chant to non-walking cultists
/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
for(var/mob/living/carbon/C in hearers(7, invoker))
- var/number_legs = C.get_num_legs()
- if(!is_servant_of_ratvar(C) && !C.null_rod_check() && number_legs) //you have legs right
- C.apply_damage(noncultist_damage * 0.5, BURN, "l_leg")
- C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg")
- if(C.m_intent != MOVE_INTENT_WALK)
- if(!iscultist(C))
- to_chat(C, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!")
- else //Cultists take extra burn damage
- to_chat(C, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!")
- C.apply_damage(cultist_damage * 0.5, BURN, "l_leg")
- C.apply_damage(cultist_damage * 0.5, BURN, "r_leg")
- C.toggle_move_intent()
+ C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
return TRUE
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
index faab84befea..0dbd2d46e80 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
@@ -110,7 +110,7 @@
channel_time = 150
consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 6)
usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, \
- and interdiction lenses, mending motors, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power."
+ and interdiction lenses, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power."
tier = SCRIPTURE_REVENANT
primary_component = REPLICANT_ALLOY
sort_priority = 4
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 4fd4e629a12..f7fcc8c2998 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
@@ -69,6 +69,117 @@
quickbind_desc = "Creates a Vitality Matrix, which drains non-Servants on it to heal Servants that cross it."
+//Mending Mantra: Channeled for up to ten times over twenty seconds to repair structures and heal allies
+/datum/clockwork_scripture/channeled/mending_mantra
+ descname = "Channeled, Area Healing and Repair"
+ name = "Mending Mantra"
+ desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed. Channeled every two seconds for a maximum of twenty seconds."
+ chant_invocations = list("Mend our dents!", "Heal our scratches!", "Repair our gears!")
+ chant_amount = 10
+ chant_interval = 20
+ consumed_components = list(VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 1)
+ usage_tip = "This is a very effective way to rapidly reinforce a base after an attack."
+ tier = SCRIPTURE_SCRIPT
+ primary_component = VANGUARD_COGWHEEL
+ sort_priority = 4
+ quickbind = TRUE
+ quickbind_desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed.
Maximum 10 chants."
+ var/heal_attempts = 4
+ var/heal_amount = 2.5
+ var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
+ var/static/list/heal_finish_messages = list("There, all mended!", "Try not to get too damaged.", "No more dents and scratches for you!", "Champions never die.", "All patched up.", \
+ "Ah, child, it's okay now.", "Pain is temporary.", "What you do for the Justiciar is eternal.", "Bear this for me.", "Be strong, child.", "Please, be careful!", \
+ "If you die, you will be remembered.")
+ var/static/list/heal_target_typecache = typecacheof(list(
+ /obj/structure/destructible/clockwork,
+ /obj/machinery/door/airlock/clockwork,
+ /obj/machinery/door/window/clockwork,
+ /obj/structure/window/reinforced/clockwork,
+ /obj/structure/table/reinforced/brass))
+ var/static/list/ratvarian_armor_typecache = typecacheof(list(
+ /obj/item/clothing/suit/armor/clockwork,
+ /obj/item/clothing/head/helmet/clockwork,
+ /obj/item/clothing/gloves/clockwork,
+ /obj/item/clothing/shoes/clockwork))
+
+/datum/clockwork_scripture/channeled/mending_mantra/chant_effects(chant_number)
+ var/turf/T
+ for(var/atom/movable/M in range(7, invoker))
+ if(isliving(M))
+ if(isclockmob(M) || istype(M, /mob/living/simple_animal/drone/cogscarab))
+ var/mob/living/simple_animal/S = M
+ if(S.health == S.maxHealth || S.stat == DEAD)
+ continue
+ T = get_turf(M)
+ 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")
+ 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
+ else
+ to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
+ break
+ else if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
+ continue
+ T = get_turf(M)
+ 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")
+ if(i == heal_attempts && S.health >= S.maxHealth)
+ to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
+ break
+ else
+ to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
+ break
+ else if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.health == H.maxHealth || H.stat == DEAD || !is_servant_of_ratvar(H))
+ continue
+ T = get_turf(M)
+ var/heal_ticks = 0 //one heal tick for each piece of ratvarian armor worn
+ var/obj/item/I = H.get_item_by_slot(slot_wear_suit)
+ if(is_type_in_typecache(I, ratvarian_armor_typecache))
+ heal_ticks++
+ I = H.get_item_by_slot(slot_head)
+ if(is_type_in_typecache(I, ratvarian_armor_typecache))
+ heal_ticks++
+ I = H.get_item_by_slot(slot_gloves)
+ if(is_type_in_typecache(I, ratvarian_armor_typecache))
+ heal_ticks++
+ I = H.get_item_by_slot(slot_shoes)
+ if(is_type_in_typecache(I, ratvarian_armor_typecache))
+ heal_ticks++
+ if(heal_ticks)
+ 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")
+ if(i == heal_ticks && H.health >= H.maxHealth)
+ to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"")
+ break
+ else
+ to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"")
+ break
+ else if(is_type_in_typecache(M, heal_target_typecache))
+ var/obj/structure/destructible/clockwork/C = M
+ if(C.obj_integrity == C.max_integrity || (istype(C) && !C.can_be_repaired))
+ continue
+ T = get_turf(M)
+ for(var/i in 1 to heal_attempts)
+ 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")
+ else
+ break
+ return TRUE
+
+
//Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay.
/datum/clockwork_scripture/create_object/sigil_of_submission
descname = "Trap, Conversion"
diff --git a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm
index c32bcb0b4b7..2bebb4c9a5c 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm
@@ -44,45 +44,50 @@
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
if(!is_servant_of_ratvar(user) || total_accessable_power() < hierophant_cost || !anchored)
- to_chat(user, "You place your hand on the obelisk, but it doesn't react.")
+ to_chat(user, "You place your hand on [src], but it doesn't react.")
return
- var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spatial Gateway","Cancel")
+ var/choice = alert(user,"You place your hand on [src]...",,"Hierophant Broadcast","Spatial Gateway","Cancel")
switch(choice)
if("Hierophant Broadcast")
if(active)
- to_chat(user, "The obelisk is sustaining a gateway and cannot broadcast!")
+ to_chat(user, "[src] is sustaining a gateway and cannot broadcast!")
return
if(!user.can_speak_vocal())
- to_chat(user, "You cannot speak through the obelisk!")
+ to_chat(user, "You cannot speak through [src]!")
return
var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "")
if(!is_servant_of_ratvar(user) || !input || !user.canUseTopic(src, !issilicon(user)))
return
+ if(anchored)
+ to_chat(user, "[src] is no longer secured!")
+ return FALSE
if(active)
- to_chat(user, "The obelisk is sustaining a gateway and cannot broadcast!")
- return
- if(!try_use_power(hierophant_cost))
- to_chat(user, "The obelisk lacks the power to broadcast!")
+ to_chat(user, "[src] is sustaining a gateway and cannot broadcast!")
return
if(!user.can_speak_vocal())
- to_chat(user, "You cannot speak through the obelisk!")
+ to_chat(user, "You cannot speak through [src]!")
+ return
+ if(!try_use_power(hierophant_cost))
+ to_chat(user, "[src] lacks the power to broadcast!")
return
clockwork_say(user, text2ratvar("Hierophant Broadcast, activate! [html_decode(input)]"))
titled_hierophant_message(user, input, "big_brass", "large_brass")
if("Spatial Gateway")
if(active)
- to_chat(user, "The obelisk is already sustaining a gateway!")
- return
- if(!try_use_power(gateway_cost))
- to_chat(user, "The obelisk lacks the power to open a gateway!")
+ to_chat(user, "[src] is already sustaining a gateway!")
return
if(!user.can_speak_vocal())
to_chat(user, "You need to be able to speak to open a gateway!")
return
- if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1) && !active)
- clockwork_say(user, text2ratvar("Spatial Gateway, activate!"))
- else
- return_power(gateway_cost)
+ if(!try_use_power(gateway_cost))
+ to_chat(user, "[src] lacks the power to open a gateway!")
+ return
+ if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1))
+ process()
+ if(!active)
+ clockwork_say(user, text2ratvar("Spatial Gateway, activate!"))
+ return
+ return_power(gateway_cost) //if we didn't return above, ie, successfully create a gateway, we give the power back
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/process()
if(!anchored)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/mending_motor.dm b/code/game/gamemodes/clock_cult/clock_structures/mending_motor.dm
deleted file mode 100644
index 6bd0f46e9dc..00000000000
--- a/code/game/gamemodes/clock_cult/clock_structures/mending_motor.dm
+++ /dev/null
@@ -1,107 +0,0 @@
-//Mending Motor: A prism that consumes replicant alloy or power to repair nearby mechanical servants at a quick rate.
-/obj/structure/destructible/clockwork/powered/mending_motor
- name = "mending motor"
- desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
- clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures."
- icon_state = "mending_motor_inactive"
- active_icon = "mending_motor"
- inactive_icon = "mending_motor_inactive"
- unanchored_icon = "mending_motor_unwrenched"
- construction_value = 20
- max_integrity = 125
- obj_integrity = 125
- break_message = "The prism falls to the ground with a heavy thud!"
- debris = list(/obj/item/clockwork/alloy_shards/small = 3, \
- /obj/item/clockwork/alloy_shards/medium = 1, \
- /obj/item/clockwork/alloy_shards/large = 1, \
- /obj/item/clockwork/component/vanguard_cogwheel/onyx_prism = 1)
- var/heal_attempts = 4
- var/heal_cost = MIN_CLOCKCULT_POWER*2
- var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
- var/static/list/heal_finish_messages = list("There, all mended!", "Try not to get too damaged.", "No more dents and scratches for you!", "Champions never die.", "All patched up.", \
- "Ah, child, it's okay now.")
- var/static/list/heal_failure_messages = list("Pain is temporary.", "What you do for the Justiciar is eternal.", "Bear this for me.", "Be strong, child.", "Please, be careful!", \
- "If you die, you will be remembered.")
- var/static/list/mending_motor_typecache = typecacheof(list(
- /obj/structure/destructible/clockwork,
- /obj/machinery/door/airlock/clockwork,
- /obj/machinery/door/window/clockwork,
- /obj/structure/window/reinforced/clockwork,
- /obj/structure/table/reinforced/brass))
-
-/obj/structure/destructible/clockwork/powered/mending_motor/examine(mob/user)
- ..()
- if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It requires at least [heal_cost]W to attempt to repair clockwork mobs, structures, or converted silicons.")
-
-/obj/structure/destructible/clockwork/powered/mending_motor/forced_disable(bad_effects)
- if(active)
- if(bad_effects)
- try_use_power(heal_cost)
- visible_message("[src] emits an airy chuckling sound and falls dark!")
- toggle()
- return TRUE
-
-/obj/structure/destructible/clockwork/powered/mending_motor/attack_hand(mob/living/user)
- if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
- if(total_accessable_power() < MIN_CLOCKCULT_POWER)
- to_chat(user, "[src] needs more power to function!")
- return 0
- toggle(0, user)
-
-/obj/structure/destructible/clockwork/powered/mending_motor/process()
- var/efficiency = get_efficiency_mod()
- for(var/atom/movable/M in range(7, src))
- var/turf/T
- if(isclockmob(M) || istype(M, /mob/living/simple_animal/drone/cogscarab))
- T = get_turf(M)
- var/mob/living/simple_animal/S = M
- if(S.health == S.maxHealth || S.stat == DEAD)
- continue
- for(var/i in 1 to heal_attempts)
- if(S.health < S.maxHealth)
- if(try_use_power(heal_cost))
- S.adjustHealth(-(8 * efficiency))
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
- else
- to_chat(S, "\"[text2ratvar(pick(heal_failure_messages))]\"")
- break
- else
- to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
- break
- else if(is_type_in_typecache(M, mending_motor_typecache))
- T = get_turf(M)
- var/obj/structure/destructible/clockwork/C = M
- if(C.obj_integrity == C.max_integrity || (istype(C) && !C.can_be_repaired))
- continue
- for(var/i in 1 to heal_attempts)
- if(C.obj_integrity < C.max_integrity)
- if(try_use_power(heal_cost))
- C.obj_integrity = min(C.obj_integrity + (8 * efficiency), C.max_integrity)
- if(C == src)
- efficiency = get_efficiency_mod()
- C.update_icon()
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
- else
- break
- else
- break
- else if(issilicon(M))
- T = get_turf(M)
- var/mob/living/silicon/S = M
- if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
- continue
- for(var/i in 1 to heal_attempts)
- if(S.health < S.maxHealth)
- if(try_use_power(heal_cost))
- S.heal_ordered_damage(8 * efficiency, damage_heal_order)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
- else
- to_chat(S, "\"[text2ratvar(pick(heal_failure_messages))]\"")
- break
- else
- to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
- break
- . = ..()
- if(. < heal_cost)
- forced_disable(FALSE)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index 9b2d868730e..0529b67ffdd 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -40,8 +40,8 @@
/obj/structure/destructible/clockwork/massive/ratvar/attack_ghost(mob/dead/observer/O)
var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Yes", "No")
- if(alertresult == "No" || !O)
- return 0
+ if(alertresult == "No" || QDELETED(O) || !istype(O) || !O.key)
+ return FALSE
var/mob/living/simple_animal/drone/cogscarab/ratvar/R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src))
R.visible_message("[R] forms, and its eyes blink open, glowing bright red!")
R.key = O.key
@@ -77,7 +77,7 @@
if(!prey && LAZYLEN(meals))
prey = pick(meals)
to_chat(prey, "\"You will do, heretic.\"\n\
- ")
+ You feel something massive turn its crushing focus to you...")
prey << 'sound/effects/ratvar_reveal.ogg'
else
if((!istype(prey, /obj/singularity/narsie) && prob(10) && LAZYLEN(meals) > 1) || prey.z != z || !(prey in meals))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index f3832a830bc..7780ae5db9d 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -5,7 +5,7 @@
var/list/cult_objectives = list()
/proc/iscultist(mob/living/M)
- return istype(M) && M.has_antag_datum(/datum/antagonist/cultist, TRUE)
+ return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT)
/proc/is_sacrifice_target(datum/mind/mind)
if(SSticker.mode.name == "cult")
@@ -158,18 +158,18 @@
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE
if (!istype(cult_mind))
return 0
- if(cult_mind.current.gain_antag_datum(/datum/antagonist/cultist))
+ if(cult_mind.add_antag_datum(ANTAG_DATUM_CULT))
if(stun)
cult_mind.current.Paralyse(5)
return 1
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1, stun)
if(cult_mind.current)
- var/datum/antagonist/cultist/cult_datum = cult_mind.current.has_antag_datum(/datum/antagonist/cultist, TRUE)
+ var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(ANTAG_DATUM_CULT)
if(!cult_datum)
return FALSE
- cult_datum.silent_update = show_message
- cult_datum.on_remove()
+ cult_datum.silent = show_message
+ cult_datum.on_removal()
if(stun)
cult_mind.current.Paralyse(5)
return TRUE
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 296b248938f..892ba114c53 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -211,7 +211,7 @@ structure_check() searches for nearby cultist structures required for the invoca
log_game("Talisman Creation rune failed - already in use")
return
- for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak)
+ for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak - /obj/item/weapon/paper/talisman/summon_tome)
var/obj/item/weapon/paper/talisman/J = I
var/talisman_cult_name = initial(J.cultist_name)
if(talisman_cult_name)
@@ -514,7 +514,7 @@ structure_check() searches for nearby cultist structures required for the invoca
//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people GLOB.sacrificed
/obj/effect/rune/raise_dead
- cultist_name = "Raise Dead"
+ cultist_name = "Resurrect Cultist"
cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
invocation = null //Depends on the name of the user - see below
icon_state = "1"
@@ -633,9 +633,9 @@ structure_check() searches for nearby cultist structures required for the invoca
qdel(src) //delete before pulsing because it's a delay reee
empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
-//Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active.
-/obj/effect/rune/astral
- cultist_name = "Astral Communion"
+//Rite of Spirit Sight: Separates one's spirit from their body. They will take damage while it is active.
+/obj/effect/rune/spirit
+ cultist_name = "Spirit Sight"
cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active."
invocation = "Fwe'sh mah erl nyag r'ya!"
icon_state = "7"
@@ -644,24 +644,24 @@ structure_check() searches for nearby cultist structures required for the invoca
construct_invoke = 0
var/mob/living/affecting = null
-/obj/effect/rune/astral/examine(mob/user)
+/obj/effect/rune/spirit/examine(mob/user)
..()
if(affecting)
to_chat(user, "A translucent field encases [user] above the rune!")
-/obj/effect/rune/astral/can_invoke(mob/living/user)
+/obj/effect/rune/spirit/can_invoke(mob/living/user)
if(rune_in_use)
to_chat(user, "[src] cannot support more than one body!")
- log_game("Astral Communion rune failed - more than one user")
+ log_game("Spirit Sight rune failed - more than one user")
return list()
var/turf/T = get_turf(src)
if(!(user in T))
to_chat(user, "You must be standing on top of [src]!")
- log_game("Astral Communion rune failed - user not standing on rune")
+ log_game("Spirit Sight rune failed - user not standing on rune")
return list()
return ..()
-/obj/effect/rune/astral/invoke(var/list/invokers)
+/obj/effect/rune/spirit/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
..()
var/turf/T = get_turf(src)
@@ -898,45 +898,6 @@ structure_check() searches for nearby cultist structures required for the invoca
if(is_servant_of_ratvar(L))
L.adjustStaminaLoss(tick_damage*0.5)
-
-//Deals brute damage to all targets on the rune and heals the invoker for each target drained.
-/obj/effect/rune/leeching
- cultist_name = "Drain Life"
- cultist_desc = "drains the life of all targets on the rune, restoring life to the user."
- invocation = "Yu'gular faras desdae. Umathar uf'kal thenar!"
- icon_state = "3"
- color = "#9F1C34"
-
-/obj/effect/rune/leeching/can_invoke(mob/living/user)
- if(world.time <= user.next_move)
- return list()
- var/turf/T = get_turf(src)
- var/list/potential_targets = list()
- for(var/mob/living/carbon/M in T.contents - user)
- if(M.stat != DEAD)
- potential_targets += M
- if(!potential_targets.len)
- to_chat(user, "There must be at least one valid target on the rune!")
- log_game("Leeching rune failed - no valid targets")
- return list()
- return ..()
-
-/obj/effect/rune/leeching/invoke(var/list/invokers)
- var/mob/living/user = invokers[1]
- user.changeNext_move(CLICK_CD_CLICK_ABILITY)
- ..()
- var/turf/T = get_turf(src)
- for(var/mob/living/carbon/M in T.contents - user)
- if(M.stat != DEAD)
- var/drained_amount = rand(10,20)
- M.apply_damage(drained_amount, BRUTE, "chest")
- user.adjustBruteLoss(-drained_amount)
- to_chat(M, "You feel extremely weak.")
- user.Beam(T,icon_state="drainbeam",time=5)
- user.visible_message("Blood flows from the rune into [user]!", \
- "Blood flows into you, healing your wounds and revitalizing your spirit.")
-
-
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
cultist_name = "Manifest Spirit"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 2876e80373b..2411f0c40da 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -176,7 +176,7 @@
invocation = "Kla'atu barada nikt'o!"
health_cost = 1
creation_time = 30
- uses = 2
+ uses = 6
var/revealing = FALSE //if it reveals or not
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
@@ -186,7 +186,7 @@
"You speak the words of the talisman, hiding nearby runes.")
invocation = "Nikt'o barada kla'atu!"
revealing = TRUE
- for(var/obj/effect/rune/R in range(3,user))
+ for(var/obj/effect/rune/R in range(4,user))
R.talismanhide()
else
user.visible_message("A flash of light shines from [user]'s hand!", \
@@ -194,22 +194,6 @@
for(var/obj/effect/rune/R in range(3,user))
R.talismanreveal()
-//Rite of False Truths: Same as rune
-/obj/item/weapon/paper/talisman/make_runes_fake
- cultist_name = "Talisman of Disguising"
- cultist_desc = "A talisman that will make nearby runes appear fake."
- color = "#ff80d5" // honk
- invocation = "By'o nar'nar!"
- creation_time = 20
-
-/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1)
- . = ..()
- user.visible_message("Dust flows from [user]s hand.", \
- "You speak the words of the talisman, making nearby runes appear fake.")
- for(var/obj/effect/rune/R in orange(6,user))
- R.desc = "A rune vandalizing the station."
-
-
//Rite of Disruption: Weaker than rune
/obj/item/weapon/paper/talisman/emp
cultist_name = "Talisman of Electromagnetic Pulse"
@@ -379,7 +363,7 @@
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
invocation = "In'totum Lig'abis!"
color = "#B27300" // burnt-orange
- uses = 4
+ uses = 6
/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm
index ef9091891f0..01437cdf2ea 100644
--- a/code/game/gamemodes/devil/devilinfo.dm
+++ b/code/game/gamemodes/devil/devilinfo.dm
@@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(lawlorify, list (
notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK)
sleep(50)
if(!SSticker.mode.devil_ascended)
- SSshuttle.emergency.request(null, 0.3)
+ SSshuttle.emergency.request(null, set_coefficient = 0.3)
SSticker.mode.devil_ascended++
form = ARCH_DEVIL
@@ -449,7 +449,7 @@ GLOBAL_LIST_INIT(lawlorify, list (
A.convert_to_archdevil()
else
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
-
+
/datum/devilinfo/proc/update_hud()
if(istype(owner.current, /mob/living/carbon))
diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm
index 0e01532190b..621d40cc458 100644
--- a/code/game/gamemodes/gang/gang_pen.dm
+++ b/code/game/gamemodes/gang/gang_pen.dm
@@ -11,7 +11,7 @@
..()
last_used = world.time
-/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user)
+/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
if(!istype(M))
return
if(ishuman(M) && ishuman(user) && M.stat != DEAD)
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index a7c466e746b..4f09f2e3621 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -556,7 +556,7 @@
var/mob/living/silicon/ai/A = usr
if(A.stat == DEAD)
- A <<"You are already dead!" //Omae Wa Mou Shindeiru
+ to_chat(A, "You are already dead!") //Omae Wa Mou Shindeiru
return
for(var/datum/AI_Module/AM in possible_modules)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index e692654bf3d..0e4a11f8ab3 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -166,7 +166,7 @@
var/obj/machinery/abductor/console/con = get_team_console(team_number)
var/datum/objective/objective = team_objectives[team_number]
if (con.experiment.points >= objective.target_amount)
- SSshuttle.emergency.request(null, 0.5)
+ SSshuttle.emergency.request(null, set_coefficient = 0.5)
finished = 1
return ..()
return ..()
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index e6365d5e651..d7ab46cb9cd 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -14,6 +14,13 @@
origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70)
actions_types = list(/datum/action/item_action/hands_free/activate)
+ allowed = list(
+ /obj/item/device/abductor,
+ /obj/item/weapon/abductor_baton,
+ /obj/item/weapon/melee/baton,
+ /obj/item/weapon/gun/energy,
+ /obj/item/weapon/restraints/handcuffs
+ )
var/mode = VEST_STEALTH
var/stealth_active = 0
var/combat_cooldown = 10
@@ -21,6 +28,11 @@
var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70)
var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50, fire = 90, acid = 90)
+/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
+ flags ^= NODROP
+ if(ismob(loc))
+ to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].")
+
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode)
if(VEST_STEALTH)
@@ -107,6 +119,18 @@
if(combat_cooldown==initial(combat_cooldown))
STOP_PROCESSING(SSobj, src)
+/obj/item/clothing/suit/armor/abductor/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ for(var/obj/machinery/abductor/console/C in GLOB.machines)
+ if(C.vest == src)
+ C.vest = null
+ break
+ . = ..()
+
+
+/obj/item/device/abductor
+ icon = 'icons/obj/abductor.dmi'
+
/obj/item/device/abductor/proc/AbductorCheck(user)
if(isabductor(user))
return TRUE
@@ -114,14 +138,19 @@
return FALSE
/obj/item/device/abductor/proc/ScientistCheck(user)
+ if(!AbductorCheck(user))
+ return FALSE
+
var/mob/living/carbon/human/H = user
var/datum/species/abductor/S = H.dna.species
- return S.scientist
+ if(S.scientist)
+ return TRUE
+ to_chat(user, "You're not trained to use this!")
+ return FALSE
/obj/item/device/abductor/gizmo
name = "science tool"
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
- icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "silencer"
origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
@@ -130,11 +159,12 @@
var/obj/machinery/abductor/console/console
/obj/item/device/abductor/gizmo/attack_self(mob/user)
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this!")
return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
if(mode == GIZMO_SCAN)
mode = GIZMO_MARK
icon_state = "gizmo_mark"
@@ -144,11 +174,12 @@
to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE")
/obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user)
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this")
return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
switch(mode)
if(GIZMO_SCAN)
scan(M, user)
@@ -159,11 +190,12 @@
/obj/item/device/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params)
if(flag)
return
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this")
return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
switch(mode)
if(GIZMO_SCAN)
scan(target, user)
@@ -172,9 +204,8 @@
/obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user)
if(ishuman(target))
- if(console!=null)
- console.AddSnapshot(target)
- to_chat(user, "You scan [target] and add them to the database.")
+ console.AddSnapshot(target)
+ to_chat(user, "You scan [target] and add them to the database.")
/obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user)
if(marked == target)
@@ -198,11 +229,15 @@
marked = target
to_chat(user, "You finish preparing [target] for transport.")
+/obj/item/device/abductor/gizmo/Destroy()
+ if(console)
+ console.gizmo = null
+ . = ..()
+
/obj/item/device/abductor/silencer
name = "abductor silencer"
desc = "A compact device used to shut down communications equipment."
- icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "gizmo"
origin_tech = "materials=4;programming=7;abductor=3"
@@ -419,10 +454,10 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C)
C.update_handcuffed()
- to_chat(user, "You handcuff [C].")
+ to_chat(user, "You restrain [C].")
add_logs(user, C, "handcuffed")
else
- to_chat(user, "You fail to handcuff [C].")
+ to_chat(user, "You fail to restrain [C].")
else
to_chat(user, "[C] doesn't have two hands...")
@@ -471,11 +506,11 @@ Congratulations! You are now trained for invasive xenobiology research!"}
..()
switch(mode)
if(BATON_STUN)
- user <<"The baton is in stun mode."
+ to_chat(user, "The baton is in stun mode.")
if(BATON_SLEEP)
- user <<"The baton is in sleep inducement mode."
+ to_chat(user, "The baton is in sleep inducement mode.")
if(BATON_CUFF)
- user <<"The baton is in restraining mode."
+ to_chat(user, "The baton is in restraining mode.")
if(BATON_PROBE)
to_chat(user, "The baton is in probing mode.")
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
index 100c4852632..c92fdddf26a 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
@@ -22,13 +22,13 @@
if(console)
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
if(V)
- console.vest = V
+ console.AddVest(V)
V.flags |= NODROP
- var/obj/item/device/abductor/gizmo/G = locate() in H.getBackSlot()
- if(G)
- console.gizmo = G
- G.console = console
+ var/obj/item/weapon/storage/backpack/B = locate() in H
+ if(B)
+ for(var/obj/item/device/abductor/gizmo/G in B.contents)
+ console.AddGizmo(G)
/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -40,10 +40,10 @@
name = "Abductor Agent"
head = /obj/item/clothing/head/helmet/abductor
suit = /obj/item/clothing/suit/armor/abductor/vest
+ suit_store = /obj/item/weapon/abductor_baton
belt = /obj/item/weapon/storage/belt/military/abductor/full
backpack_contents = list(
- /obj/item/weapon/abductor_baton = 1,
/obj/item/weapon/gun/energy/alien = 1,
/obj/item/device/abductor/silencer = 1
)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index 27a358081d2..8ad8cc84747 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -7,7 +7,7 @@
//Console
/obj/machinery/abductor/console
- name = "Abductor console"
+ name = "abductor console"
desc = "Ship command center."
icon = 'icons/obj/abductor.dmi'
icon_state = "console"
@@ -32,7 +32,7 @@
var/dat = ""
dat += " Abductsoft 3000
"
- if(experiment != null)
+ if(experiment)
var/points = experiment.points
var/credits = experiment.credits
dat += "Collected Samples : [points]
"
@@ -46,18 +46,18 @@
else
dat += "NO EXPERIMENT MACHINE DETECTED
"
- if(pad!=null)
+ if(pad)
dat += "Emergency Teleporter System."
dat += "Consider using primary observation console first."
dat += "Activate Teleporter
"
- if(gizmo!=null && gizmo.marked!=null)
+ if(gizmo && gizmo.marked)
dat += "Retrieve Mark
"
else
dat += "Retrieve Mark
"
else
dat += "NO TELEPAD DETECTED"
- if(vest!=null)
+ if(vest)
dat += " Agent Vest Mode
"
var/mode = vest.mode
if(mode == VEST_STEALTH)
@@ -88,7 +88,8 @@
else if(href_list["flip_vest"])
FlipVest()
else if(href_list["toggle_vest"])
- toggle_vest()
+ if(vest)
+ vest.toggle_nodrop()
else if(href_list["select_disguise"])
SelectDisguise()
else if(href_list["dispense"])
@@ -105,23 +106,22 @@
Dispense(/obj/item/clothing/suit/armor/abductor/vest)
updateUsrDialog()
-
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
- if(gizmo!=null && pad!=null && gizmo.marked)
+ if(pad && gizmo && gizmo.marked)
pad.Retrieve(gizmo.marked)
/obj/machinery/abductor/console/proc/TeleporterSend()
- if(pad!=null)
+ if(pad)
pad.Send()
/obj/machinery/abductor/console/proc/FlipVest()
- if(vest!=null)
+ if(vest)
vest.flip_mode()
/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
var/datum/icon_snapshot/chosen = disguises[entry_name]
- if(chosen && (remote || in_range(usr,src)))
+ if(chosen && vest && (remote || in_range(usr,src)))
vest.SetDisguise(chosen)
/obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user)
@@ -169,36 +169,48 @@
return
disguises[entry.name] = entry
+/obj/machinery/abductor/console/proc/AddGizmo(obj/item/device/abductor/gizmo/G)
+ if(G == gizmo && G.console == src)
+ return FALSE
+
+ if(G.console)
+ G.console.gizmo = null
+
+ gizmo = G
+ G.console = src
+ return TRUE
+
+/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V)
+ if(vest == V)
+ return FALSE
+
+ for(var/obj/machinery/abductor/console/C in GLOB.machines)
+ if(C.vest == V)
+ C.vest = null
+ break
+
+ vest = V
+ return TRUE
+
/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
- if(istype(O, /obj/item/device/abductor/gizmo))
- var/obj/item/device/abductor/gizmo/G = O
+ if(istype(O, /obj/item/device/abductor/gizmo) && AddGizmo(O))
to_chat(user, "You link the tool to the console.")
- gizmo = G
- G.console = src
- else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest))
- var/obj/item/clothing/suit/armor/abductor/vest/V = O
+ else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O))
to_chat(user, "You link the vest to the console.")
- if(istype(vest))
- if(vest.flags & NODROP)
- toggle_vest()
- vest = V
else
return ..()
+
+
/obj/machinery/abductor/console/proc/Dispense(item,cost=1)
if(experiment && experiment.credits >= cost)
experiment.credits -=cost
say("Incoming supply!")
+ var/drop_location = loc
if(pad)
flick("alien-pad", pad)
- new item(pad.loc)
- else
- new item(loc)
+ drop_location = pad.loc
+ new item(drop_location)
+
else
say("Insufficent data!")
-
-/obj/machinery/abductor/console/proc/toggle_vest()
- vest.flags ^= NODROP
- var/mob/M = vest.loc
- if(istype(M))
- to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].")
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
index d006ba0f687..8cf9acac0ba 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
@@ -1,5 +1,5 @@
/obj/machinery/abductor/gland_dispenser
- name = "Replacement Organ Storage"
+ name = "replacement organ storage"
desc = "A tank filled with replacement organs."
icon = 'icons/obj/abductor.dmi'
icon_state = "dispenser"
@@ -49,7 +49,7 @@
var/g_color = gland_colors[i]
var/amount = amounts[i]
dat += "[amount]"
- if(item_count == 3) // Three boxes per line
+ if(item_count == 4) // Four boxes per line
dat +=""
item_count = 0
var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 193aecd9cea..8f3dfb7ac3c 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -116,12 +116,13 @@
else
dat += "Subject Status :
"
dat += "[occupant.name] => "
- switch(occupant.stat)
- if(0)
+ var/mob/living/mob_occupant = occupant
+ switch(mob_occupant.stat)
+ if(CONSCIOUS)
dat += "Conscious"
- if(1)
+ if(UNCONSCIOUS)
dat += "Unconscious"
- else
+ else // DEAD
dat += "Deceased"
dat += "
"
dat += "[flash]"
@@ -146,9 +147,11 @@
if(href_list["close"])
close_machine()
return
- if(occupant && occupant.stat != DEAD)
- if(href_list["experiment"])
- flash = Experiment(occupant,href_list["experiment"])
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant.stat != DEAD)
+ if(href_list["experiment"])
+ flash = Experiment(occupant,href_list["experiment"])
updateUsrDialog()
add_fingerprint(usr)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index c6e6534667b..dbc12094d38 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -623,7 +623,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
chemicals -= 250
to_chat(src, "You send a jolt of energy to your host, reviving them!")
victim.grab_ghost(force = TRUE) //brings the host back, no eggscape
- victim <<"You bolt upright, gasping for breath!"
+ to_chat(victim, "You bolt upright, gasping for breath!")
/mob/living/simple_animal/borer/verb/bond_brain()
set category = "Borer"
@@ -667,7 +667,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
if(!bonding)
return
if(docile)
- src <<"You are feeling far too docile to do that."
+ to_chat(src, "You are feeling far too docile to do that.")
return
if(is_servant_of_ratvar(victim) || iscultist(victim) || victim.isloyal())
to_chat(src, "[victim]'s mind seems to be blocked by some unknown force!")
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index c3d06bfe2c5..53e92c639d6 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -92,7 +92,7 @@
playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1)
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
- user <<"...and you don't feel any different."
+ to_chat(user, "...and you don't feel any different.")
qdel(src)
return
user.visible_message("[user]'s eyes flare a deep crimson!", \
diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
index a273b946b6d..5de3c2b418a 100644
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ b/code/game/gamemodes/traitor/double_agents.dm
@@ -1,22 +1,24 @@
-/datum/game_mode/traitor/double_agents
- name = "double agents"
- config_tag = "double_agents"
+/datum/game_mode/traitor/internal_affairs
+ name = "Internal Affairs"
+ config_tag = "internal_affairs"
+ employer = "Internal Affairs"
required_players = 25
required_enemies = 5
recommended_enemies = 8
reroll_friendly = 0
+ traitor_name = "Nanotrasen Internal Affairs Agent"
traitors_possible = 10 //hard limit on traitors if scaling is turned off
num_modifier = 4 // Four additional traitors
- announce_text = "There are double agents trying to kill each other!\n\
- Traitors: Eliminate your targets and protect yourself!\n\
- Crew: Stop the double agents before they can cause too much mayhem."
+ announce_text = "There are Nanotrasen Internal Affairs Agents trying to kill each other!\n\
+ IAA: Eliminate your targets and protect yourself!\n\
+ Crew: Stop the IAA agents before they can cause too much mayhem."
var/list/target_list = list()
var/list/late_joining_list = list()
-/datum/game_mode/traitor/double_agents/post_setup()
+/datum/game_mode/traitor/internal_affairs/post_setup()
var/i = 0
for(var/datum/mind/traitor in traitors)
i++
@@ -25,7 +27,7 @@
target_list[traitor] = traitors[i + 1]
..()
-/datum/game_mode/traitor/double_agents/forge_traitor_objectives(datum/mind/traitor)
+/datum/game_mode/traitor/internal_affairs/forge_traitor_objectives(datum/mind/traitor)
if(target_list.len && target_list[traitor]) // Is a double agent
@@ -58,7 +60,7 @@
..() // Give them standard objectives.
return
-/datum/game_mode/traitor/double_agents/add_latejoin_traitor(datum/mind/character)
+/datum/game_mode/traitor/internal_affairs/add_latejoin_traitor(datum/mind/character)
check_potential_agents()
@@ -87,7 +89,7 @@
late_joining_list += character
return
-/datum/game_mode/traitor/double_agents/proc/check_potential_agents()
+/datum/game_mode/traitor/internal_affairs/proc/check_potential_agents()
for(var/M in late_joining_list)
if(istype(M, /datum/mind))
@@ -100,3 +102,18 @@
// If any check fails, remove them from our list
late_joining_list -= M
+
+
+/datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor)
+ var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
+ to_chat(traitor.current, "You are the [traitor_name].")
+ to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
+ to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
+ to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
+ to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
+ traitor.announce_objectives()
+
+
+
+/datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob)
+ return
\ No newline at end of file
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 196a08ba9f0..ce034fdb5b1 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -1,5 +1,6 @@
/datum/game_mode
var/traitor_name = "traitor"
+ var/employer = "The Syndicate"
var/list/datum/mind/traitors = list()
var/datum/mind/exchange_red
@@ -213,7 +214,7 @@
..()
return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder.
-/proc/give_codewords(mob/living/traitor_mob)
+/datum/game_mode/proc/give_codewords(mob/living/traitor_mob)
to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:")
to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]")
to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]")
@@ -335,7 +336,7 @@
uplink_loc = R
if (!uplink_loc)
- to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you an Uplink.")
+ to_chat(traitor_mob, "Unfortunately, [employer] wasn't able to get you an Uplink.")
. = 0
else
var/obj/item/device/uplink/U = new(uplink_loc)
@@ -345,19 +346,19 @@
if(uplink_loc == R)
R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ))
- to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.")
+ to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.")
traitor_mob.mind.store_memory("Radio Frequency: [format_frequency(R.traitor_frequency)] ([R.name]).")
else if(uplink_loc == PDA)
PDA.lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","X-ray","Yankee","Zulu")]"
- to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.")
+ to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.")
traitor_mob.mind.store_memory("Uplink Passcode: [PDA.lock_code] ([PDA.name]).")
else if(uplink_loc == P)
P.traitor_unlock_degrees = rand(1, 360)
- to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.")
+ to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.")
traitor_mob.mind.store_memory("Uplink Degrees: [P.traitor_unlock_degrees] ([P.name]).")
if(!safety) // If they are not a rev. Can be added on to.
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index d13671885c7..b326aea5d97 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -253,7 +253,7 @@
/datum/spellbook_entry/the_traps
name = "The Traps!"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps
- category = "Offensive"
+ category = "Defensive"
cost = 1
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 817f7f682ab..cad4bb6e8e0 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -79,7 +79,8 @@
/obj/machinery/sleeper/close_machine(mob/user)
if((isnull(user) || istype(user)) && state_open && !panel_open)
..(user)
- if(occupant && occupant.stat != DEAD)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant && mob_occupant.stat != DEAD)
to_chat(occupant, "You feel cool air surround you. You go numb as your senses turn inward.")
/obj/machinery/sleeper/emp_act(severity)
@@ -128,27 +129,30 @@
data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem)))
data["occupant"] = list()
- if(occupant)
- data["occupant"]["name"] = occupant.name
- data["occupant"]["stat"] = occupant.stat
- data["occupant"]["health"] = occupant.health
- data["occupant"]["maxHealth"] = occupant.maxHealth
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
+ data["occupant"]["name"] = mob_occupant.name
+ data["occupant"]["stat"] = mob_occupant.stat
+ data["occupant"]["health"] = mob_occupant.health
+ data["occupant"]["maxHealth"] = mob_occupant.maxHealth
data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
- data["occupant"]["bruteLoss"] = occupant.getBruteLoss()
- data["occupant"]["oxyLoss"] = occupant.getOxyLoss()
- data["occupant"]["toxLoss"] = occupant.getToxLoss()
- data["occupant"]["fireLoss"] = occupant.getFireLoss()
- data["occupant"]["cloneLoss"] = occupant.getCloneLoss()
- data["occupant"]["brainLoss"] = occupant.getBrainLoss()
+ data["occupant"]["bruteLoss"] = mob_occupant.getBruteLoss()
+ data["occupant"]["oxyLoss"] = mob_occupant.getOxyLoss()
+ data["occupant"]["toxLoss"] = mob_occupant.getToxLoss()
+ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
+ data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
+ data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss()
data["occupant"]["reagents"] = list()
if(occupant.reagents.reagent_list.len)
- for(var/datum/reagent/R in occupant.reagents.reagent_list)
+ for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
return data
/obj/machinery/sleeper/ui_act(action, params)
if(..())
return
+ var/mob/living/mob_occupant = occupant
+
switch(action)
if("door")
if(state_open)
@@ -158,9 +162,9 @@
. = TRUE
if("inject")
var/chem = params["chem"]
- if(!is_operational() || !occupant)
+ if(!is_operational() || mob_occupant)
return
- if(occupant.health < min_health && chem != "epinephrine")
+ if(mob_occupant.health < min_health && chem != "epinephrine")
return
if(inject_chem(chem))
. = TRUE
@@ -177,10 +181,11 @@
return TRUE
/obj/machinery/sleeper/proc/chem_allowed(chem)
- if(!occupant)
+ var/mob/living/mob_occupant = occupant
+ if(!mob_occupant)
return
- var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
- var/occ_health = occupant.health > min_health || chem == "epinephrine"
+ var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
+ var/occ_health = mob_occupant.health > min_health || chem == "epinephrine"
return amount && occ_health
/obj/machinery/sleeper/proc/reset_chem_buttons()
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 35f7babe1e1..ace9b543d16 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -4,7 +4,21 @@
icon = 'goon/icons/obj/goon_terminals.dmi'
idle_power_usage = 100
var/siphoning = FALSE
- var/last_warning = 0
+ var/next_warning = 0
+ var/obj/item/device/radio/radio
+ var/radio_channel = "Common"
+ var/minimum_time_between_warnings = 400
+
+/obj/machinery/computer/bank_machine/Initialize(mapload)
+ ..()
+ radio = new(src)
+ radio.subspace_transmission = TRUE
+ radio.canhear_range = 0
+ radio.recalculateChannels()
+
+/obj/machinery/computer/bank_machine/Destroy()
+ QDEL_NULL(radio)
+ . = ..()
/obj/machinery/computer/bank_machine/attackby(obj/item/I, mob/user)
var/value = 0
@@ -32,18 +46,17 @@
say("Station funds depleted. Halting siphon.")
siphoning = FALSE
else
- var/obj/item/stack/spacecash/c200/on_turf = locate() in src.loc
- if(on_turf && on_turf.amount < on_turf.max_amount)
- on_turf.amount++
- else
- new /obj/item/stack/spacecash/c200(get_turf(src))
+ new /obj/item/stack/spacecash/c200(get_turf(src)) // will autostack
playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1)
SSshuttle.points -= 200
- if(last_warning < world.time && prob(15))
+ if(next_warning < world.time && prob(15))
var/area/A = get_area(loc)
- minor_announce("Unauthorized credit withdrawal underway in [A.map_name]." , "Network Breach", TRUE)
- last_warning = world.time + 400
+ var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!"
+ radio.talk_into(src, message, radio_channel, get_spans())
+ next_warning = world.time + minimum_time_between_warnings
+/obj/machinery/computer/bank_machine/get_spans()
+ . = ..() | SPAN_ROBOT
/obj/machinery/computer/bank_machine/attack_hand(mob/user)
if(..())
@@ -67,8 +80,8 @@
if(..())
return
if(href_list["siphon"])
- say("Siphon of station credits has begun!")
+ say("Siphon of station credits has begun!")
siphoning = TRUE
if(href_list["halt"])
- say("Station credit withdrawal halted.")
- siphoning = FALSE
\ No newline at end of file
+ say("Station credit withdrawal halted.")
+ siphoning = FALSE
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 175fccac77d..a27ee04e606 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -121,10 +121,12 @@
/obj/machinery/clonepod/examine(mob/user)
..()
+ var/mob/living/mob_occupant = occupant
if(mess)
to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...")
- if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD))
- to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
+ if(is_operational() && mob_occupant)
+ if(mob_occupant.stat != DEAD)
+ to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
/obj/machinery/clonepod/return_air()
// We want to simulate the clone not being in contact with
@@ -136,7 +138,10 @@
return GM
/obj/machinery/clonepod/proc/get_completion()
- . = (100 * ((occupant.health + 100) / (heal_level + 100)))
+ . = FALSE
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
+ . = (100 * ((mob_occupant.health + 100) / (heal_level + 100)))
/obj/machinery/clonepod/attack_ai(mob/user)
return examine(user)
@@ -223,25 +228,26 @@
//Grow clones to maturity then kick them out. FREELOADERS
/obj/machinery/clonepod/process()
+ var/mob/living/mob_occupant = occupant
if(!is_operational()) //Autoeject if power is lost
- if (occupant)
+ if(mob_occupant)
go_out()
connected_message("Clone Ejected: Loss of power.")
- else if((occupant) && (occupant.loc == src))
- if((occupant.stat == DEAD) || (occupant.suiciding) || occupant.hellbound) //Autoeject corpses and suiciding dudes.
+ else if(mob_occupant && (mob_occupant.loc == src))
+ if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
connected_message("Clone Rejected: Deceased.")
- SPEAK("The cloning of [occupant.real_name] has been \
+ SPEAK("The cloning of [mob_occupant.real_name] has been \
aborted due to unrecoverable tissue failure.")
go_out()
- else if(occupant.cloneloss > (100 - heal_level))
- occupant.Paralyse(4)
+ else if(mob_occupant.cloneloss > (100 - heal_level))
+ mob_occupant.Paralyse(4)
//Slowly get that clone healed and finished.
- occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
- var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
+ mob_occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
+ var/progress = CLONE_INITIAL_DAMAGE - mob_occupant.getCloneLoss()
// To avoid the default cloner making incomplete clones
progress += (100 - MINIMUM_HEAL_LEVEL)
var/milestone = CLONE_INITIAL_DAMAGE / flesh_number
@@ -252,24 +258,24 @@
var/obj/item/I = pick_n_take(unattached_flesh)
if(isorgan(I))
var/obj/item/organ/O = I
- O.Insert(occupant)
+ O.Insert(mob_occupant)
else if(isbodypart(I))
var/obj/item/bodypart/BP = I
- BP.attach_limb(occupant)
+ BP.attach_limb(mob_occupant)
//Premature clones may have brain damage.
- occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
+ mob_occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
check_brine()
use_power(7500) //This might need tweaking.
- else if((occupant.cloneloss <= (100 - heal_level)))
+ else if((mob_occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
- SPEAK("The cloning cycle of [occupant.real_name] is complete.")
+ SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
go_out()
- else if ((!occupant) || (occupant.loc != src))
+ else if (!mob_occupant || mob_occupant.loc != src)
occupant = null
if (!mess && !panel_open)
icon_state = "pod_0"
@@ -305,16 +311,17 @@
to_chat(user, "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-")
return
+ var/mob/living/mob_occupant = occupant
if(W.GetID())
if(!check_access(W))
to_chat(user, "Access Denied.")
return
- if(!(occupant || mess))
+ if(!(mob_occupant || mess))
to_chat(user, "Error: Pod has no occupant.")
return
else
connected_message("Authorized Ejection")
- SPEAK("An authorized ejection of [occupant.real_name] has occurred.")
+ SPEAK("An authorized ejection of [clonemind.name] has occurred.")
to_chat(user, "You force an emergency ejection. ")
go_out()
else
@@ -339,6 +346,7 @@
/obj/machinery/clonepod/proc/go_out()
countdown.stop()
+ var/mob/living/mob_occupant = occupant
if(mess) //Clean that mess and dump those gibs!
mess = FALSE
@@ -347,44 +355,50 @@
icon_state = "pod_0"
return
- if(!occupant)
+ if(!mob_occupant)
return
+
if(grab_ghost_when == CLONER_MATURE_CLONE)
- occupant.grab_ghost()
+ mob_occupant.grab_ghost()
to_chat(occupant, "There is a bright flash!
You feel like a new being.")
- occupant.flash_act()
+ mob_occupant.flash_act()
var/turf/T = get_turf(src)
occupant.forceMove(T)
icon_state = "pod_0"
- occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
+ mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
+
occupant = null
/obj/machinery/clonepod/proc/malfunction()
- if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
connected_message("Critical Error!")
SPEAK("Critical error! Please contact a Thinktronic Systems \
technician, as your warranty may be affected.")
mess = TRUE
+ for(var/obj/item/O in unattached_flesh)
+ qdel(O)
icon_state = "pod_g"
- if(occupant.mind != clonemind)
- clonemind.transfer_to(occupant)
- occupant.grab_ghost() // We really just want to make you suffer.
- flash_color(occupant, flash_color="#960000", flash_time=100)
- to_chat(occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.")
+ if(mob_occupant.mind != clonemind)
+ clonemind.transfer_to(mob_occupant)
+ mob_occupant.grab_ghost() // We really just want to make you suffer.
+ flash_color(mob_occupant, flash_color="#960000", flash_time=100)
+ to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.")
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
- occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
- QDEL_IN(occupant, 40)
+ mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
+ QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
if(user.stat == CONSCIOUS)
go_out()
/obj/machinery/clonepod/emp_act(severity)
- if(prob(100/(severity*efficiency)))
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
- SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [occupant.real_name] prematurely." ,0))
+ SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
go_out()
..()
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index 753cd42a4f7..0c1b870771b 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -108,7 +108,7 @@
if(!authenticated) //Check for emags
var/obj/item/weapon/card/emag/E = usr.get_active_held_item()
if(E && istype(E) && usr.Adjacent(src))
- usr << "You bypass [src]'s access requirements using your emag."
+ to_chat(usr, "You bypass [src]'s access requirements using your emag.")
authenticated = TRUE
log_activity("logged in") //Auth ID doesn't change, hinting that it was illicit
if(href_list["log_out"])
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 0f18a68bf89..21fe22ee58a 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -304,17 +304,17 @@
build_path = /obj/machinery/computer/gulag_teleporter_computer
/obj/item/weapon/circuitboard/computer/rdconsole
- name = "RD Console (Computer Board)"
+ name = "R&D Console (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/core
/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params)
if(istype(I,/obj/item/weapon/screwdriver))
if(build_path == /obj/machinery/computer/rdconsole/core)
- name = "RD Console - Robotics (Computer Board)"
+ name = "R&D Console - Robotics (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/robotics
to_chat(user, "Access protocols successfully updated.")
else
- name = "RD Console (Computer Board)"
+ name = "R&D Console (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/core
to_chat(user, "Defaulting access protocols.")
else
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 5f0299be0ea..a65c30a4e6a 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
else
SSjob.prioritized_jobs += j
prioritycount++
- usr << "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request."
+ to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if ("print")
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 5c16861932c..bdb2044f407 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -186,21 +186,23 @@
// Scanner
if (!isnull(src.scanner))
+ var/mob/living/scanner_occupant = scanner.occupant
+
dat += "Scanner Functions
"
dat += ""
- if (!src.scanner.occupant)
+ if(!scanner_occupant)
dat += "Scanner Unoccupied"
else if(loading)
- dat += "[src.scanner.occupant] => Scanning..."
+ dat += "[scanner_occupant] => Scanning..."
else
- if (src.scanner.occupant.ckey != scantemp_ckey)
+ if(scanner_occupant.ckey != scantemp_ckey)
scantemp = "Ready to Scan"
- scantemp_ckey = src.scanner.occupant.ckey
- dat += "[src.scanner.occupant] => [scantemp]"
+ scantemp_ckey = scanner_occupant.ckey
+ dat += "[scanner_occupant] => [scantemp]"
dat += "
"
- if (src.scanner.occupant)
+ if(scanner_occupant)
dat += "Start Scan"
dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
else
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 27ef955ccc5..7bc41bacc66 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -153,8 +153,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
U = H.w_uniform
// Are the suit sensors on?
- if (U.has_sensor && U.sensor_mode)
- pos = H.z == 0 || U.sensor_mode == 3 ? get_turf(H) : null
+ if ((U.has_sensor > 0) && U.sensor_mode)
+ pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null
// Special case: If the mob is inside an object confirm the z-level on turf level.
if (H.z == 0 && (!pos || pos.z != z)) continue
@@ -170,10 +170,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
assignment = ""
ijob = 80
- if (U.sensor_mode >= 1) life_status = (!H.stat ? "true" : "false")
+ if (U.sensor_mode >= SENSOR_LIVING) life_status = (!H.stat ? "true" : "false")
else life_status = null
- if (U.sensor_mode >= 2)
+ if (U.sensor_mode >= SENSOR_VITALS)
dam1 = round(H.getOxyLoss(),1)
dam2 = round(H.getToxLoss(),1)
dam3 = round(H.getFireLoss(),1)
@@ -184,7 +184,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
dam3 = null
dam4 = null
- if (U.sensor_mode >= 3)
+ if (U.sensor_mode >= SENSOR_COORDS)
if (!pos) pos = get_turf(H)
var/area/player_area = get_area(H)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 7a2f58bc01b..f65e4e65901 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -455,14 +455,16 @@
name = "monitor decryption key"
var/obj/machinery/message_server/server = null
-/obj/item/weapon/paper/monitorkey/New()
+/obj/item/weapon/paper/monitorkey/Initialize()
..()
- spawn(10)
- if(GLOB.message_servers)
- for(var/obj/machinery/message_server/server in GLOB.message_servers)
- if(!isnull(server))
- if(!isnull(server.decryptkey))
- info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one."
- info_links = info
- add_overlay("paper_words")
- break
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/item/weapon/paper/monitorkey/LateInitialize()
+ if(GLOB.message_servers)
+ for(var/obj/machinery/message_server/server in GLOB.message_servers)
+ if(!isnull(server))
+ if(!isnull(server.decryptkey))
+ info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one."
+ info_links = info
+ add_overlay("paper_words")
+ break
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index fe3992724be..214163c7397 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -113,7 +113,8 @@
to_chat(R.connected_ai, "
ALERT - Cyborg detonation detected: [R.name]
")
R.ResetSecurityCodes()
else
- message_admins("[key_name_admin(usr)] (FLW) detonated [key_name(R, R.client)](JMP)!")
+ var/turf/T = get_turf(R)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!")
log_game("\[key_name(usr)] detonated [key_name(R)]!")
if(R.connected_ai)
to_chat(R.connected_ai, "
ALERT - Cyborg detonation detected: [R.name]
")
@@ -127,7 +128,7 @@
if(can_control(usr, R))
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm" && can_control(usr, R) && !..())
- message_admins("[key_name_admin(usr)] (FLW) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](FLW)!")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!")
R.SetLockdown(!R.lockcharge)
to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]")
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 8c935419a5b..3e367767733 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -13,8 +13,6 @@
var/list/rangers = list()
var/charge = 35
var/stop = 0
- var/list/available = list()
- var/list/select_name = list()
var/list/spotlights = list()
var/list/sparkles = list()
var/static/list/songs = list(
@@ -30,6 +28,7 @@
var/song_path = null
var/song_length = 0
var/song_beat = 0
+ var/GBP_required = 0
/datum/track/New(name, path, length, beat)
song_name = name
@@ -37,6 +36,19 @@
song_length = length
song_beat = beat
+/obj/machinery/disco/proc/add_track(file, name, length, beat)
+ var/sound/S = file
+ if(!istype(S))
+ return
+ if(!name)
+ name = "[file]"
+ if(!beat)
+ beat = 5
+ if(!length)
+ length = 2400 //Unless there's a way to discern via BYOND.
+ var/datum/track/T = new /datum/track(name, file, length, beat)
+ songs += T
+
/obj/machinery/disco/Initialize()
..()
selection = songs[1]
@@ -73,7 +85,7 @@
return
if(!allowed(user))
to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.")
- playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1)
+ user.playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1)
return
if(!Adjacent(user) && !isAI(user))
return
@@ -126,14 +138,14 @@
if(active)
to_chat(usr, "Error: You cannot change the song until the current one is over.")
return
- check_GBP()
- select_name = input(usr, "Choose your song", "Track:") as null|anything in available
- if (QDELETED(src))
- return
+
+ var/list/available = list()
for(var/datum/track/S in songs)
- if(select_name == S.song_name)
- selection = S
- break
+ available[S.song_name] = S
+ var/selected = input(usr, "Choose your song", "Track:") as null|anything in available
+ if(QDELETED(src) || !selected || !istype(available[selected], /datum/track))
+ return
+ selection = available[selected]
updateUsrDialog()
if("horn")
deejay('sound/items/AirHorn2.ogg')
@@ -159,13 +171,6 @@
charge -= 5
playsound(src, S,300,1)
-/obj/machinery/disco/proc/check_GBP()
- available |= "Engineering's Basic Beat"
- available |= "Engineering's Domination Dance"
- available |= "Engineering's Superiority Shimmy"
- available |= "Engineering's Ultimate High-Energy Hustle"
-
-
/obj/machinery/disco/proc/dance_setup()
stop = world.time + selection.song_length
var/turf/cen = get_turf(src)
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index af59f63888d..d572b3e9dc1 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -105,13 +105,14 @@
..()
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
- if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant)
if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
- if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound)
- occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
+ if(!mob_occupant.suiciding && !(mob_occupant.disabilities & NOCLONE) && !mob_occupant.hellbound)
+ mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
var/obj/machinery/computer/scan_consolenew/console
for(dir in list(NORTH,EAST,SOUTH,WEST))
@@ -157,4 +158,4 @@
if(..(user,1,0)) //don't set the machine, since there's no dialog
return
- toggle_open(user)
\ No newline at end of file
+ toggle_open(user)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a9331cd142f..7ff38f53c93 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1283,8 +1283,6 @@
if(!density)
return 1
- if(!SSticker || !SSticker.mode)
- return 0
operating = 1
update_icon(AIRLOCK_OPENING, 1)
src.set_opacity(0)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 807d4c9aca9..51695317344 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -229,8 +229,6 @@
return 1
if(operating)
return
- if(!SSticker || !SSticker.mode)
- return 0
operating = 1
do_animate("opening")
set_opacity(0)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 47e18f32e68..77f33e45138 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -129,8 +129,6 @@
/obj/machinery/door/window/open(forced=0)
if (src.operating == 1) //doors can still open when emag-disabled
return 0
- if(!SSticker || !SSticker.mode)
- return 0
if(!forced)
if(!hasPower())
return 0
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index 92a550b17cf..5979abdc29e 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -136,13 +136,14 @@ The console is located at computer/gulag_teleporter.dm
/obj/machinery/gulag_teleporter/proc/strip_occupant()
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] = list()
- for(var/obj/item/W in occupant)
- if(!is_type_in_typecache(W, required_items) && occupant.temporarilyRemoveItemFromInventory(W))
+ var/mob/living/mob_occupant = occupant
+ for(var/obj/item/W in mob_occupant)
+ if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W))
if(istype(W, /obj/item/weapon/restraints/handcuffs))
W.forceMove(get_turf(src))
continue
if(linked_reclaimer)
- linked_reclaimer.stored_items[occupant] += W
+ linked_reclaimer.stored_items[mob_occupant] += W
linked_reclaimer.contents += W
W.forceMove(linked_reclaimer)
else
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index ae55fdf4ae8..0a819ee7e66 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -26,14 +26,13 @@ Possible to do for anyone motivated enough:
#define HOLOPAD_PASSIVE_POWER_USAGE 1
#define HOLOGRAM_POWER_USAGE 2
-#define RANGE_BASED 4
-#define AREA_BASED 6
+GLOBAL_LIST_EMPTY(holopads)
#define HOLOPAD_MODE RANGE_BASED
/obj/machinery/holopad
- name = "\improper AI holopad"
- desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
+ name = "Holopad"
+ desc = "It's a floor-mounted device for projecting holographic images."
icon_state = "holopad0"
layer = LOW_OBJ_LAYER
flags = HEAR
@@ -44,21 +43,32 @@ Possible to do for anyone motivated enough:
obj_integrity = 300
max_integrity = 300
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
- var/list/masters = list()//List of AIs that use the holopad
+ var/list/masters = list()//List of living mobs that use the holopad
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
var/temp = ""
+ var/list/holo_calls //array of /datum/holocalls
+ var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs
+ var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging
var/static/list/holopads = list()
-/obj/machinery/holopad/New()
+/obj/machinery/holopad/Initialize()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null)
B.apply_default_parts(src)
holopads += src
/obj/machinery/holopad/Destroy()
- for (var/mob/living/silicon/ai/master in masters)
- clear_holo(master)
+ if(outgoing_call)
+ LAZYADD(holo_calls, outgoing_call)
+
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ HC.ConnectionFailure(src)
+ LAZYCLEARLIST(holo_calls)
+
+ for (var/I in masters)
+ clear_holo(I)
holopads -= src
return ..()
@@ -91,20 +101,58 @@ Possible to do for anyone motivated enough:
return
return ..()
+/obj/machinery/holopad/proc/CheckCallClose()
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(usr == HC.eye)
+ HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad
+ return TRUE
+ return FALSE
+
+/obj/machinery/holopad/Click(location,control,params)
+ if(!CheckCallClose())
+ return ..()
+
/obj/machinery/holopad/AltClick(mob/living/carbon/human/user)
- interact(user)
+ if(!CheckCallClose())
+ interact(user)
/obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
return
- if(user.stat || !is_operational())
+
+ if(outgoing_call || user.incapacitated() || !is_operational())
return
+
user.set_machine(src)
var/dat
if(temp)
dat = temp
else
- dat = "request an AI's presence."
+ dat = "Request an AI's presence.
"
+ dat += "Call another holopad.
"
+
+ if(LAZYLEN(holo_calls))
+ dat += "=====================================================
"
+
+ var/one_answered_call = FALSE
+ var/one_unanswered_call = FALSE
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad != src)
+ dat += "Answer call from [get_area(HC.calling_holopad)].
"
+ one_unanswered_call = TRUE
+ else
+ one_answered_call = TRUE
+
+ if(one_answered_call && one_unanswered_call)
+ dat += "=====================================================
"
+ //we loop twice for formatting
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad == src)
+ dat += "Disconnect call from [HC.user].
"
+
var/datum/browser/popup = new(user, "holopad", name, 300, 130)
popup.set_content(dat)
@@ -112,7 +160,10 @@ Possible to do for anyone motivated enough:
popup.open()
/obj/machinery/holopad/Topic(href, href_list)
- if(..() || !is_operational())
+ if(..() || isAI(usr))
+ return
+ add_fingerprint(usr)
+ if(!is_operational())
return
if (href_list["AIrequest"])
if(last_request + 200 < world.time)
@@ -120,7 +171,7 @@ Possible to do for anyone motivated enough:
temp = "You requested an AI's presence.
"
temp += "Main Menu"
var/area/area = get_area(src)
- for(var/mob/living/silicon/ai/AI in GLOB.living_mob_list)
+ for(var/mob/living/silicon/ai/AI in GLOB.silicon_mobs)
if(!AI.client)
continue
to_chat(AI, "Your presence is requested at \the [area].")
@@ -128,12 +179,49 @@ Possible to do for anyone motivated enough:
temp = "A request for AI presence was already sent recently.
"
temp += "Main Menu"
- else if(href_list["mainmenu"])
+ else if(href_list["Holocall"])
+ if(outgoing_call)
+ return
+
+ temp = "You must stand on the holopad to make a call!
"
+ temp += "Main Menu"
+ if(usr.loc == loc)
+ var/list/callnames = list()
+ for(var/I in holopads)
+ var/area/A = get_area(I)
+ if(A)
+ LAZYADD(callnames[A], I)
+ callnames -= get_area(src)
+
+ var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames
+ if(QDELETED(usr) || !result || outgoing_call)
+ return
+
+ if(usr.loc == loc)
+ temp = "Dialing...
"
+ temp += "Main Menu"
+ new /datum/holocall(usr, src, callnames[result])
+
+ else if(href_list["connectcall"])
+ var/datum/holocall/call_to_connect = locate(href_list["connectcall"])
+ if(!QDELETED(call_to_connect))
+ call_to_connect.Answer(src)
temp = ""
- updateDialog()
- add_fingerprint(usr)
+ else if(href_list["disconnectcall"])
+ var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"])
+ if(!QDELETED(call_to_disconnect))
+ call_to_disconnect.Disconnect(src)
+ temp = ""
+ else if(href_list["mainmenu"])
+ temp = ""
+ if(outgoing_call)
+ outgoing_call.Disconnect()
+
+ updateDialog()
+
+//do not allow AIs to answer calls or people will use it to meta the AI sattelite
/obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user)
if (!istype(user))
return
@@ -148,39 +236,75 @@ Possible to do for anyone motivated enough:
clear_holo(user)
/obj/machinery/holopad/process()
- if(masters.len)//If there is a hologram.
- for (var/mob/living/silicon/ai/master in masters)
- if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
- if(!(stat & NOPOWER))//If the machine has power.
- if(HOLOPAD_MODE == RANGE_BASED)
- if(get_dist(master.eyeobj, src) <= holo_range)
- return TRUE
- else
- var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, master.eyeobj)
- if(get_dist(pad_close, master.eyeobj) <= holo_range)
- var/obj/effect/overlay/holo_pad_hologram/h = masters[master]
- unset_holo(master)
- pad_close.set_holo(master, h)
- return TRUE
+ for(var/I in masters)
+ var/mob/living/master = I
+ var/mob/living/silicon/ai/AI = master
+ if(!istype(AI))
+ AI = null
- else if (HOLOPAD_MODE == AREA_BASED)
+ if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
+ if(is_operational())//If the machine has power.
+ if(AI) //ais are range based
+ if(get_dist(AI.eyeobj, src) <= holo_range)
+ continue
+ else
+ var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj)
+ if(get_dist(pad_close, AI.eyeobj) <= holo_range)
+ var/obj/effect/overlay/holo_pad_hologram/h = masters[master]
+ unset_holo(master)
+ pad_close.set_holo(master, h)
+ continue
+ else
+ continue
+ clear_holo(master)//If not, we want to get rid of the hologram.
- var/area/holo_area = get_area(src)
- var/area/eye_area = get_area(master.eyeobj)
+ if(outgoing_call)
+ outgoing_call.Check()
- if(eye_area in holo_area.related)
- return TRUE
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad != src)
+ if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2)))
+ HC.Answer(src)
+ break
+ if(outgoing_call)
+ HC.Disconnect(src)//can't answer calls while calling
+ else
+ playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring!
- clear_holo(master)//If not, we want to get rid of the hologram.
- return TRUE
+/obj/machinery/holopad/proc/activate_holo(mob/living/user)
+ var/mob/living/silicon/ai/AI = user
+ if(!istype(AI))
+ AI = null
-/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user)
- if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it
- if (istype(user.current, /obj/machinery/holopad))
+ if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it
+ if (AI && istype(AI.current, /obj/machinery/holopad))
to_chat(user, "ERROR: \black Image feed in progress.")
return
- create_holo(user)//Create one.
- src.visible_message("A holographic image of [user] flicks to life right before your eyes!")
+
+ var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location.
+ if(AI)
+ Hologram.icon = AI.holo_icon
+ else //make it like real life
+ Hologram.icon = user.icon
+ Hologram.icon_state = user.icon_state
+ Hologram.copy_overlays(user, TRUE)
+ //codersprite some holo effects here
+ Hologram.alpha = 100
+ Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY)
+ Hologram.Impersonation = user
+
+ Hologram.languages = user.languages
+ Hologram.mouse_opacity = 0//So you can't click on it.
+ Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
+ Hologram.anchored = 1//So space wind cannot drag it.
+ Hologram.name = "[user.name] (Hologram)"//If someone decides to right click.
+ Hologram.set_light(2) //hologram lighting
+
+ set_holo(user, Hologram)
+ visible_message("A holographic image of [user] flicks to life right before your eyes!")
+
+ return Hologram
else
to_chat(user, "ERROR: \black Unable to project hologram.")
@@ -191,59 +315,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
for(var/mob/living/silicon/ai/master in masters)
if(masters[master] && speaker != master)
master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad == src && speaker != HC.hologram)
+ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans)
+
+ if(outgoing_call && speaker == outgoing_call.user)
+ outgoing_call.hologram.say(raw_message)
-/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
- var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location.
- h.icon = A.holo_icon
- h.mouse_opacity = 0//So you can't click on it.
- h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
- h.anchored = 1//So space wind cannot drag it.
- h.name = "[A.name] (Hologram)"//If someone decides to right click.
- h.set_light(2) //hologram lighting
- set_holo(A, h)
+/obj/machinery/holopad/proc/SetLightsAndPower()
+ var/total_users = masters.len + LAZYLEN(holo_calls)
+ use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users
+ if(total_users)
+ set_light(2)
+ icon_state = "holopad1"
+ else
+ set_light(0)
+ icon_state = "holopad0"
+
+/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h)
+ masters[user] = h
+ var/mob/living/silicon/ai/AI = user
+ if(istype(AI))
+ AI.current = src
+ SetLightsAndPower()
return TRUE
-/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h)
- masters[A] = h
- set_light(2) // pad lighting
- icon_state = "holopad1"
- A.current = src
- use_power += HOLOGRAM_POWER_USAGE
- return TRUE
-
-/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user)
+/obj/machinery/holopad/proc/clear_holo(mob/living/user)
qdel(masters[user]) // Get rid of user's hologram
unset_holo(user)
return TRUE
-/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user)
- if(user.current == src)
- user.current = null
+/obj/machinery/holopad/proc/unset_holo(mob/living/user)
+ var/mob/living/silicon/ai/AI = user
+ if(istype(AI) && AI.current == src)
+ AI.current = null
masters -= user // Discard AI from the list of those who use holopad
- use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage
- if (!masters.len) // If no users left
- set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted)
- icon_state = "holopad0"
- use_power = HOLOPAD_PASSIVE_POWER_USAGE
+ SetLightsAndPower()
return TRUE
-/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user)
+/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf)
if(masters[user])
- step_to(masters[user], user.eyeobj)
var/obj/effect/overlay/holo_pad_hologram/H = masters[user]
- H.loc = get_turf(user.eyeobj)
+ step_to(H, new_turf)
+ H.loc = new_turf
+ var/area/holo_area = get_area(src)
+ var/area/eye_area = new_turf.loc
+
+ if(!(eye_area in holo_area.related))
+ clear_holo(user)
return TRUE
+/obj/effect/overlay/holo_pad_hologram
+ var/mob/living/Impersonation
+ var/datum/holocall/HC
+
+/obj/effect/overlay/holo_pad_hologram/Destroy()
+ Impersonation = null
+ if(HC)
+ HC.Disconnect(HC.calling_holopad)
+ return ..()
+
/obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0)
return 1
+/obj/effect/overlay/holo_pad_hologram/examine(mob/user)
+ if(Impersonation)
+ return Impersonation.examine(user)
+ return ..()
+
/obj/item/weapon/circuitboard/machine/holopad
name = "AI Holopad (Machine Board)"
build_path = /obj/machinery/holopad
origin_tech = "programming=1"
req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
-#undef RANGE_BASED
-#undef AREA_BASED
#undef HOLOPAD_PASSIVE_POWER_USAGE
-#undef HOLOGRAM_POWER_USAGE
+#undef HOLOGRAM_POWER_USAGE
\ No newline at end of file
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index e6d84699436..0da04fbaa2d 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -200,7 +200,7 @@
if(beaker.reagents && beaker.reagents.reagent_list.len)
to_chat(usr, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")
else
- to_chat(usr, "Attached is an empty [beaker].")
+ to_chat(usr, "Attached is an empty [beaker.name].")
else
to_chat(usr, "No chemicals are attached.")
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6cd8e75798f..96b0029134d 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -1,8 +1,8 @@
/*
Overview:
- Used to create objects that need a per step proc call. Default definition of 'New()'
+ Used to create objects that need a per step proc call. Default definition of 'Initialize()'
stores a reference to src machine in global 'machines list'. Default definition
- of 'Del' removes reference to src machine in global 'machines list'.
+ of 'Destroy' removes reference to src machine in global 'machines list'.
Class Variables:
use_power (num)
@@ -44,7 +44,7 @@ Class Variables:
EMPED:16 -- temporary broken by EMP pulse
Class Procs:
- New() 'game/machinery/machine.dm'
+ Initialize() 'game/machinery/machine.dm'
Destroy() 'game/machinery/machine.dm'
@@ -118,14 +118,15 @@ Class Procs:
var/panel_open = 0
var/state_open = 0
var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures.
- var/mob/living/occupant = null
+ var/list/occupant_typecache = list(/mob/living) // turned into typecache in Initialize
+ var/atom/movable/occupant = null
var/unsecuring_tool = /obj/item/weapon/wrench
var/interact_open = 0 // Can the machine be interacted with when in maint/when the panel is open.
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
var/speed_process = 0 // Process as fast as possible?
/obj/machinery/Initialize()
- if (!armor)
+ if(!armor)
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
. = ..()
GLOB.machines += src
@@ -135,6 +136,8 @@ Class Procs:
START_PROCESSING(SSfastprocess, src)
power_change()
+ occupant_typecache = typecacheof(occupant_typecache)
+
/obj/machinery/Destroy()
GLOB.machines.Remove(src)
if(!speed_process)
@@ -176,16 +179,24 @@ Class Procs:
L.update_canmove()
occupant = null
-/obj/machinery/proc/close_machine(mob/living/target = null)
+/obj/machinery/proc/close_machine(atom/movable/target = null)
state_open = 0
density = 1
if(!target)
- for(var/mob/living/carbon/C in loc)
- if(C.buckled || C.has_buckled_mobs())
+ for(var/am in loc)
+ if(!is_type_in_typecache(am, occupant_typecache))
continue
- else
- target = C
- if(target && !target.buckled && !target.has_buckled_mobs())
+ var/atom/movable/AM = am
+ if(AM.has_buckled_mobs())
+ continue
+ if(isliving(AM))
+ var/mob/living/L = am
+ if(L.buckled)
+ continue
+ target = am
+
+ var/mob/living/mobtarget = target
+ if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled))
occupant = target
target.forceMove(src)
updateUsrDialog()
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
old mode 100644
new mode 100755
index 9595d2ac02c..6cc42b73b5c
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -61,7 +61,7 @@
G.loc = src
charging = G
use_power = 2
- update_icon()
+ update_icon(scan = TRUE)
else
to_chat(user, "[src] isn't connected to anything!")
return 1
@@ -162,10 +162,13 @@
..()
-/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
if(stat & (NOPOWER|BROKEN) || !anchored)
icon_state = "rechargeroff"
return
+ if(scan)
+ icon_state = "rechargeroff"
+ return
if(panel_open)
icon_state = "rechargeropen"
return
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 0ab08814a0c..02cdbc88c48 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -439,12 +439,12 @@ GLOBAL_LIST_EMPTY(allConsoles)
updateUsrDialog()
return
-/obj/machinery/requests_console/say_quote(input, list/spans, message_mode)
+/obj/machinery/requests_console/say_mod(input, message_mode)
var/ending = copytext(input, length(input) - 2)
if (ending == "!!!")
- return "blares, \"[attach_spans(input, spans)]\""
-
- return ..()
+ . = "blares"
+ else
+ . = ..()
/obj/machinery/requests_console/proc/clear_emergency()
emergency = null
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 5db4276333f..f64f7617367 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -212,12 +212,12 @@
locked = TRUE
update_icon()
if(occupant)
+ var/mob/living/mob_occupant = occupant
if(uv_super)
- occupant.adjustFireLoss(rand(20, 36))
+ mob_occupant.adjustFireLoss(rand(20, 36))
else
- occupant.adjustFireLoss(rand(10, 16))
- if(iscarbon(occupant))
- occupant.emote("scream")
+ mob_occupant.adjustFireLoss(rand(10, 16))
+ mob_occupant.emote("scream")
addtimer(CALLBACK(src, .proc/cook), 50)
else
uv_cycles = initial(uv_cycles)
@@ -369,13 +369,14 @@
return
else
if(occupant)
- to_chat(occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!")
+ var/mob/living/mob_occupant = occupant
+ to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!")
cook()
. = TRUE
if("dispense")
if(!state_open)
return
-
+
var/static/list/valid_items = list("helmet", "suit", "mask", "storage")
var/item_name = params["item"]
if(item_name in valid_items)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index fea3b90390b..73555ce7c41 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -732,7 +732,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "sustenance"
products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24,
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
- /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6)
+ /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6,
+ /obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/weapon/kitchen/knife = 6,
/obj/item/weapon/reagent_containers/food/drinks/coffee = 12,
/obj/item/weapon/tank/internals/emergency_oxygen = 6,
@@ -749,7 +750,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
- /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10)
+ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/air = 1)
refill_canister = /obj/item/weapon/vending_refill/cola
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 5c0af6b13a1..20cb7aff0b8 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -337,8 +337,8 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/weapon/grenade/flashbang/F)
var/turf/T = get_turf(src)
- message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1)
- log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
+ message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("[key_name(chassis.occupant)] fired a [src] [COORD(T)]")
addtimer(CALLBACK(F, /obj/item/weapon/grenade/flashbang.proc/prime), det_time)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index a34e30e689f..9324c6edb7d 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -74,7 +74,7 @@
/obj/effect/particle_effect/smoke/proc/spread_smoke()
var/turf/t_loc = get_turf(src)
if(!t_loc)
- return
+ return
var/list/newsmokes = list()
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke!
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index ae283e5edb9..cf96bd4afbc 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -30,4 +30,23 @@
icon_state = "white"
plane = LIGHTING_PLANE
layer = LIGHTING_LAYER
- blend_mode = BLEND_ADD
\ No newline at end of file
+ blend_mode = BLEND_ADD
+
+/obj/effect/abstract/marker
+ name = "marker"
+ icon = 'icons/effects/effects.dmi'
+ anchored = TRUE
+ icon_state = "wave3"
+ layer = RIPPLE_LAYER
+
+/obj/effect/abstract/marker/Initialize(mapload)
+ . = ..()
+ GLOB.all_abstract_markers += src
+
+/obj/effect/abstract/marker/Destroy()
+ GLOB.all_abstract_markers -= src
+ . = ..()
+
+/obj/effect/abstract/marker/at
+ name = "active turf marker"
+
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 6aff1855fb5..9e7dbe7fa9d 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -63,7 +63,7 @@
return
if (istype(M, /atom/movable))
if(ismegafauna(M))
- message_admins("[M] (FLW) has teleported through [src].")
+ message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].")
do_teleport(M, target, precision) ///You will appear adjacent to the beacon
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index 60b992ac460..cffb1571790 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -183,8 +183,9 @@
if(!T)
return
- if(triggerer_only)
- A.playsound_local(T, sound, volume, freq_vary)
+ if(triggerer_only && ismob(A))
+ var/mob/B = A
+ B.playsound_local(T, sound, volume, freq_vary)
else
playsound(T, sound, volume, freq_vary, extra_range)
diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm
index 0cf73fd9ff6..186d2186900 100644
--- a/code/game/objects/items/charter.dm
+++ b/code/game/objects/items/charter.dm
@@ -60,7 +60,7 @@
to_chat(user, "Your name has been sent to your employers for approval.")
// Autoapproves after a certain time
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
- to_chat(GLOB.admins, "CUSTOM STATION RENAME:[key_name_admin(user)] (?) proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) (RPLY)")
+ to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]")
/obj/item/station_charter/proc/reject_proposed(user)
if(!user)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 039237c63c7..af8b9341f94 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -465,11 +465,13 @@
icon_state = "crayonblack"
paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black.
item_color = "black"
+ reagent_contents = list("nutriment" = 1, "blackcrayonpowder" = 1)
/obj/item/toy/crayon/white
icon_state = "crayonwhite"
paint_color = "#FFFFFF"
item_color = "white"
+ reagent_contents = list("nutriment" = 1, "whitecrayonpowder" = 1)
/obj/item/toy/crayon/mime
icon_state = "crayonmime"
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index b35697d802a..f54bd72af07 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -7,10 +7,14 @@ GLOBAL_LIST_EMPTY(GPS_list)
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "materials=2;magnets=1;bluespace=2"
+ unique_rename = TRUE
var/gpstag = "COM0"
var/emped = FALSE
var/turf/locked_location
var/tracking = TRUE
+ var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
+ var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
+
/obj/item/device/gps/Initialize()
..()
@@ -27,6 +31,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
cut_overlay("working")
add_overlay("emp")
addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early
+ SStgui.close_uis(src) //Close the UI control if it is open.
/obj/item/device/gps/proc/reboot()
emped = FALSE
@@ -34,6 +39,9 @@ GLOBAL_LIST_EMPTY(GPS_list)
add_overlay("working")
/obj/item/device/gps/AltClick(mob/user)
+ toggletracking(user)
+
+/obj/item/device/gps/proc/toggletracking(mob/user)
if(!user.canUseTopic(src, be_close=TRUE))
return //user not valid to use gps
if(emped)
@@ -48,36 +56,80 @@ GLOBAL_LIST_EMPTY(GPS_list)
to_chat(user, "[src] is now tracking, and visible to other GPS devices.")
tracking = TRUE
-/obj/item/device/gps/attack_self(mob/user)
- if(!tracking)
- to_chat(user, "[src] is turned off. Use alt+click to toggle it back on.")
- return
- var/obj/item/device/gps/t = ""
- var/gps_window_height = 110 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show
+/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
if(emped)
- t += "ERROR"
- else
- t += "
Set Tag "
- t += "
Tag: [gpstag]"
- if(locked_location && locked_location.loc)
- t += "
Bluespace coordinates saved: [locked_location.loc]"
- gps_window_height += 20
+ to_chat(user, "[src] fizzles weakly.")
+ return
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show
+ ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height
+ ui.open()
- for(var/obj/item/device/gps/G in GLOB.GPS_list)
- var/turf/pos = get_turf(G)
- var/area/gps_area = get_area(G)
- var/tracked_gpstag = G.gpstag
- if(G.emped == 1)
- t += "
[tracked_gpstag]: ERROR"
- else if(G.tracking)
- t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
- else
- continue
- var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800))
- popup.set_content(t)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
+ ui.set_autoupdate(state = updating)
+
+
+/obj/item/device/gps/ui_data(mob/user)
+ var/list/data = list()
+ data["power"] = tracking
+ data["tag"] = gpstag
+ data["updating"] = updating
+ data["globalmode"] = global_mode
+ if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed
+ return data
+
+ var/turf/curr = get_turf(src)
+ data["current"] = "[get_area_name(curr)] ([curr.x], [curr.y], [curr.z])"
+
+ var/list/signals = list()
+ data["signals"] = list()
+
+ for(var/gps in GLOB.GPS_list)
+ var/obj/item/device/gps/G = gps
+ if(G.emped || !G.tracking || G == src)
+ continue
+ var/turf/pos = get_turf(G)
+ if(!global_mode && pos.z != curr.z)
+ continue
+ var/area/gps_area = get_area_name(G)
+ var/list/signal = list()
+ signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS
+ signal["area"] = format_text(gps_area)
+ signal["coord"] = "[pos.x], [pos.y], [pos.z]"
+ if(pos.z == curr.z) //Distance/Direction calculations for same z-level only
+ signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs
+ signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision.
+ var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful.
+ if(!direction)
+ direction = "CENTER"
+ signal["degrees"] = "N/A"
+ signal["direction"] = direction
+
+ signals += list(signal) //Add this signal to the list of signals
+ data["signals"] = signals
+ return data
+
+
+
+/obj/item/device/gps/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("rename")
+ var/a = input("Please enter desired tag.", name, gpstag) as text
+ a = copytext(sanitize(a), 1, 20)
+ gpstag = a
+ . = TRUE
+ if("power")
+ toggletracking(usr)
+ . = TRUE
+ if("updating")
+ updating = !updating
+ . = TRUE
+ if("globalmode")
+ global_mode = !global_mode
+ . = TRUE
/obj/item/device/gps/Topic(href, href_list)
..()
@@ -157,4 +209,4 @@ GLOBAL_LIST_EMPTY(GPS_list)
clear()
tagged = null
STOP_PROCESSING(SSfastprocess, src)
- . = ..()
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index fc8b666fe15..fb70d77ff3a 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -95,8 +95,8 @@
"[user] activates \the [src]!", \
"You activate \the [src].",
"You hear a click.")
- message_admins("Power sink activated by [key_name_admin(user)](?) (FLW) at ([x],[y],[z] - JMP)")
- log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
+ message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]")
+ log_game("Power sink activated by [key_name(user)] at [COORD(src)]")
set_mode(OPERATING)
if(OPERATING)
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 450d0c021fe..9296dd9e090 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -178,21 +178,21 @@
var/log_attacher = ""
if(attacher)
- log_attacher = "(?) (FLW)"
+ log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
- last_touch_info = "(?) (FLW)"
+ last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]"
var/log_str3 = " Last touched by: [key_name_admin(mob)]"
- var/bomb_message = "[log_str1] [A.name] [log_str2][log_attacher] [log_str3][last_touch_info]"
+ var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]"
GLOB.bombers += bomb_message
message_admins(bomb_message, 0, 1)
- log_game("[log_str1] [A.name]([A.x],[A.y],[A.z]) [log_str2] [log_str3]")
+ log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]")
merge_gases()
spawn(20) // In case one tank bursts
for (var/i=0,i<5,i++)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 611ef76eb46..d81b8a5a69f 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -154,8 +154,9 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma sheets ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma sheets ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]")
fire_act()
else
return ..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a007dd45455..4700f81d824 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
/obj/item/stack/tile/brass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.brass_recipes
- ..()
+ . = ..()
pixel_x = 0
pixel_y = 0
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index f2432cee3d0..aecee4e0701 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -13,8 +13,8 @@
var/turf_type = null
var/mineralType = null
-/obj/item/stack/tile/New(loc, amount)
- ..()
+/obj/item/stack/tile/Initialize(mapload, amount)
+ . = ..()
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index ac53eb25ff7..aab6c9db484 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -158,7 +158,7 @@
if(lit)
START_PROCESSING(SSobj, src)
if(!warned_admins)
- message_admins("[key_name_admin(usr)]? (FLW) has lit a flamethrower.")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has lit a flamethrower.")
warned_admins = 1
if(href_list["amount"])
throw_amount = throw_amount + text2num(href_list["amount"])
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index e1e4c1acccd..fed13eb2622 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -19,10 +19,10 @@
var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy.
var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions.
-/obj/item/weapon/grenade/chem_grenade/New()
+/obj/item/weapon/grenade/chem_grenade/Initialize()
+ . = ..()
create_reagents(1000)
stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY.
- ..()
/obj/item/weapon/grenade/chem_grenade/examine(mob/user)
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
@@ -36,8 +36,8 @@
else if(clown_check(user))
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- message_admins("[key_name_admin(usr)]? (FLW) has primed a [name] for detonation at [A.name] (JMP).")
- log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].")
+ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
to_chat(user, "You prime the [name]! [det_time / 10] second\s!")
playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
active = 1
@@ -177,12 +177,12 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
- log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
+ message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].")
+ log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [COORD(T)]")
var/turf/DT = get_turf(src)
var/area/DA = get_area(DT)
- log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])")
+ log_game("A grenade detonated at [DA.name] [COORD(DT)]")
update_mob()
@@ -313,8 +313,8 @@
desc = "Used for emergency sealing of air breaches."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/metalfoam/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/metalfoam/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -331,8 +331,8 @@
desc = "Used for clearing rooms of living things."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/incendiary/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/incendiary/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -349,8 +349,8 @@
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/antiweed/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/antiweed/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -368,8 +368,8 @@
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/cleaner/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/cleaner/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -386,8 +386,8 @@
desc = "Waffle Co.-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/ez_clean/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/ez_clean/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
@@ -405,8 +405,8 @@
desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/teargas/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/teargas/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
@@ -424,8 +424,8 @@
desc = "Used for melting armoured opponents."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/facid/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/facid/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
@@ -444,8 +444,8 @@
desc = "Used for wide scale painting projects."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/colorful/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/colorful/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -463,8 +463,8 @@
stage = READY
var/glitter_type = "glitter"
-/obj/item/weapon/grenade/chem_grenade/glitter/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/glitter/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -496,8 +496,8 @@
desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/clf3/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/clf3/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
@@ -514,8 +514,8 @@
desc = "Tiger Cooperative chemical foam grenade. Causes temporary irration, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin"
stage = READY
-/obj/item/weapon/grenade/chem_grenade/bioterrorfoam/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/bioterrorfoam/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
@@ -534,8 +534,8 @@
desc = "WARNING: GRENADE WILL RELEASE DEADLY SPORES CONTAINING ACTIVE AGENTS. SEAL SUIT AND AIRFLOW BEFORE USE."
stage = READY
-/obj/item/weapon/grenade/chem_grenade/tuberculosis/New()
- ..()
+/obj/item/weapon/grenade/chem_grenade/tuberculosis/Initialize()
+ . = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
index aedf0954c2a..fb5b92aee2e 100644
--- a/code/game/objects/items/weapons/grenades/plastic.dm
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -119,8 +119,8 @@
qdel(src) //How?
/obj/item/weapon/grenade/plastic/suicide_act(mob/user)
- message_admins("[key_name_admin(user)](?) (FLW) suicided with [src] at ([user.x],[user.y],[user.z] - JMP)",0,1)
- message_admins("[key_name(user)] suicided with [src] at ([user.x],[user.y],[user.z])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_COORDJMP(user)]",0,1)
+ log_game("[key_name(user)] suicided with [src] at [COORD(user)]")
user.visible_message("[user] activates the [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!")
var/message_say = "FOR NO RAISIN!"
if(user.mind)
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index fb68e33f458..3b611883e68 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -87,7 +87,7 @@
var/mob/living/silicon/robot/R = user
if(shock)
- user <<"You clear all active holograms, and reset your projector to normal."
+ to_chat(user, "You clear all active holograms, and reset your projector to normal.")
holosign_type = /obj/structure/holosign/barrier/cyborg
creation_time = 5
if(signs.len)
@@ -96,7 +96,7 @@
shock = 0
return
else if(R.emagged&&!shock)
- user <<"You clear all active holograms, and overload your energy projector!"
+ to_chat(user, "You clear all active holograms, and overload your energy projector!")
holosign_type = /obj/structure/holosign/barrier/cyborg/hacked
creation_time = 30
if(signs.len)
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
index 369effbe7c4..009aae3b543 100644
--- a/code/game/objects/items/weapons/implants/implant_explosive.dm
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -44,7 +44,7 @@
active = TRUE
var/turf/boomturf = get_turf(imp_in)
var/area/A = get_area(boomturf)
- message_admins("[key_name_admin(imp_in)]? (FLW) has activated their [name] at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [A.name] [ADMIN_JMP(boomturf)].")
//If the delay is short, just blow up already jeez
if(delay <= 7)
explosion(src,heavy,medium,weak,weak, flame_range = weak)
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 733ba725909..2cc1e7824fb 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -42,8 +42,9 @@
data["occupant"] = list()
if(occupant)
- data["occupant"]["name"] = occupant.name
- data["occupant"]["stat"] = occupant.stat
+ var/mob/living/mob_occupant = occupant
+ data["occupant"]["name"] = mob_occupant.name
+ data["occupant"]["stat"] = mob_occupant.stat
data["special_name"] = special ? special_name : null
data["ready_implants"] = ready_implants
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 078cb97025f..1a3b4ff4faf 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -60,9 +60,9 @@
/obj/item/weapon/melee/baton/examine(mob/user)
..()
if(bcell)
- user <<"The baton is [round(bcell.percent())]% charged."
+ to_chat(user, "The baton is [round(bcell.percent())]% charged.")
else
- user <<"The baton does not have a power source installed."
+ to_chat(user, "The baton does not have a power source installed.")
/obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/cell))
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 0595076901d..e5ffbade4c8 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -116,7 +116,7 @@
var/mob/living/carbon/human/H = user
user.visible_message("[user] is putting [src]'s valve to [user.p_their()] lips! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3)
- if (H && !QDELETED(H))
+ if (!QDELETED(H) && air_contents && air_contents.return_pressure() >= 1000)
for(var/obj/item/W in H)
H.dropItemToGround(W)
if(prob(50))
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index d7465876c0e..71e7c0e5669 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -390,7 +390,7 @@
desc = "A chainsaw that has replaced your arm."
icon_state = "chainsaw_on"
item_state = "mounted_chainsaw"
- flags = NODROP | ABSTRACT
+ flags = NODROP | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 21
throwforce = 0
@@ -400,10 +400,17 @@
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
-/obj/item/weapon/mounted_chainsaw/dropped()
- ..()
+/obj/item/weapon/mounted_chainsaw/Destroy()
+ var/obj/item/bodypart/part
new /obj/item/weapon/twohanded/required/chainsaw(get_turf(src))
- qdel(src)
+ if(iscarbon(loc))
+ var/mob/living/carbon/holder = loc
+ var/index = holder.get_held_index_of_item(src)
+ if(index)
+ part = holder.hand_bodyparts[index]
+ . = ..()
+ if(part)
+ part.drop_limb()
/obj/item/weapon/statuebust
name = "bust"
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 47e41574087..3bf87ea9f98 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -16,27 +16,25 @@
var/obj/item/weapon/electronics/airlock/electronics
var/start_showpiece_type = null //add type for items on display
-/obj/structure/displaycase/New()
- ..()
+/obj/structure/displaycase/Initialize()
+ . = ..()
if(start_showpiece_type)
showpiece = new start_showpiece_type (src)
update_icon()
/obj/structure/displaycase/Destroy()
if(electronics)
- qdel(electronics)
- electronics = null
+ QDEL_NULL(electronics)
if(showpiece)
- qdel(showpiece)
- showpiece = null
+ QDEL_NULL(showpiece)
return ..()
/obj/structure/displaycase/examine(mob/user)
..()
- if(showpiece)
- to_chat(user, "There's [showpiece] inside.")
if(alert)
to_chat(user, "Hooked up with an anti-theft system.")
+ if(showpiece)
+ to_chat(user, "There's [showpiece] inside.")
/obj/structure/displaycase/proc/dump()
@@ -176,8 +174,8 @@
/obj/structure/displaycase/attack_hand(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
if (showpiece && (broken || open))
- dump()
to_chat(user, "You deactivate the hover field built into the case.")
+ dump()
src.add_fingerprint(user)
update_icon()
return
@@ -249,3 +247,96 @@
desc = "A glass lab container for storing interesting creatures."
start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr
req_access = list(GLOB.access_rd)
+
+
+
+/obj/structure/displaycase/trophy
+ name = "trophy display case"
+ desc = "Store your trophies of accomplishment in here, and they will stay forever."
+ var/trophy_message = ""
+ var/placer_key = ""
+ var/added_roundstart = TRUE
+ alert = TRUE
+ integrity_failure = 0
+
+/obj/structure/displaycase/trophy/Initialize()
+ . = ..()
+ GLOB.trophy_cases += src
+
+/obj/structure/displaycase/trophy/Destroy()
+ GLOB.trophy_cases -= src
+ return ..()
+
+/obj/structure/displaycase/trophy/examine(mob/user)
+ ..()
+ if(trophy_message)
+ to_chat(user, "The plaque reads:")
+ to_chat(user, trophy_message)
+
+/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params)
+
+ if(!user.Adjacent(src)) //no TK museology
+ return
+
+ if(!added_roundstart)
+ to_chat(user, "You've already put something new in this case.")
+ return
+
+ if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types))
+ to_chat(user, "The case rejects the [W].")
+ return
+
+ for(var/a in W.GetAllContents())
+ if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types))
+ to_chat(user, "The case rejects the [W].")
+ return
+
+ if(user.drop_item())
+
+ if(showpiece)
+ to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.")
+ QDEL_NULL(showpiece)
+
+ to_chat(user, "You insert [W] into the case.")
+ W.forceMove(src)
+ showpiece = W
+ added_roundstart = FALSE
+ update_icon()
+
+ placer_key = user.ckey
+
+ trophy_message = W.desc //default value
+
+ var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque")
+ if(chosen_plaque)
+ if(user.Adjacent(src))
+ trophy_message = chosen_plaque
+ to_chat(user, "You set the plaque's text.")
+ else
+ to_chat(user, "You are too far to set the plaque's text.")
+
+ SSpersistence.SaveTrophy(src)
+
+ else
+ to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!")
+
+ return
+
+/obj/structure/displaycase/trophy/dump()
+ if (showpiece)
+ if(added_roundstart)
+ visible_message("The [showpiece] crumbles to dust!")
+ new /obj/effect/decal/cleanable/ash(loc)
+ QDEL_NULL(showpiece)
+ else
+ ..()
+
+/obj/item/showpiece_dummy
+ name = "Cheap replica"
+
+/obj/item/showpiece_dummy/Initialize(mapload, path)
+ . = ..()
+ var/obj/item/I = path
+ name = initial(I.name)
+ icon = initial(I.icon)
+ icon_state = initial(I.icon_state)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 466be07c501..389ae40e880 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -234,8 +234,9 @@
/obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)
- message_admins("Plasma falsewall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma falsewall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma falsewall ignited by [key_name(user)] in [COORD(T)]")
burnbabyburn()
else
return ..()
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index e2331e13dc7..8d9c6685428 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -115,7 +115,7 @@
update_icon()
return
if(locked)
- user <<" The [name] won't budge!"
+ to_chat(user, "The [name] won't budge!")
return
else
open = !open
@@ -131,7 +131,7 @@
/obj/structure/fireaxecabinet/attack_tk(mob/user)
if(locked)
- user <<" The [name] won't budge!"
+ to_chat(user, "The [name] won't budge!")
return
else
open = !open
@@ -177,7 +177,7 @@
set src in oview(1)
if(locked)
- usr <<" The [name] won't budge!"
+ to_chat(usr, "The [name] won't budge!")
return
else
open = !open
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 82fb0191d02..ada75846e79 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -188,8 +188,9 @@
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot())
- message_admins("Plasma mineral door ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]")
TemperatureAct()
else
return ..()
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index f5defdab505..6909965614f 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -163,18 +163,20 @@
PlasmaBurn(500)
burn = TRUE
if(burn)
+ var/turf/T = get_turf(src)
if(Proj.firer)
- message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])")
+ message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(Proj.firer)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [key_name(Proj.firer)] in [COORD(T)]")
else
- message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.")
+ message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [Proj] in [COORD(T)]. No known firer.")
..()
/obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma statue ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])")
+ var/turf/T = get_turf(src)
+ message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Plasma statue ignited by [key_name(user)] in [COORD(T)]")
ignite(W.is_hot())
else
return ..()
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 90500f14db7..dad4e9b53e1 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -8,8 +8,10 @@
alpha = 30 //initially quite hidden when not "recharging"
var/last_trigger = 0
var/time_between_triggers = 600 //takes a minute to recharge
+ var/charges = INFINITY
var/list/static/ignore_typecache
+ var/list/mob/immune_minds = list()
var/datum/effect_system/spark_spread/spark_system
@@ -30,9 +32,11 @@
. = ..()
/obj/structure/trap/examine(mob/user)
- ..()
+ . = ..()
if(!isliving(user))
return
+ if(user.mind && user.mind in immune_minds)
+ return
if(get_dist(user, src) <= 1)
to_chat(user, "You reveal [src]!")
flare()
@@ -41,10 +45,15 @@
// Makes the trap visible, and starts the cooldown until it's
// able to be triggered again.
visible_message("[src] flares brightly!")
- alpha = 200
- animate(src, alpha = initial(alpha), time = time_between_triggers)
- last_trigger = world.time
spark_system.start()
+ alpha = 200
+ last_trigger = world.time
+ charges--
+ if(charges <= 0)
+ animate(src, alpha = 0, time = 10)
+ QDEL_IN(src, 10)
+ else
+ animate(src, alpha = initial(alpha), time = time_between_triggers)
/obj/structure/trap/Crossed(atom/movable/AM)
if(last_trigger + time_between_triggers > world.time)
@@ -52,6 +61,12 @@
// Don't want the traps triggered by sparks, ghosts or projectiles.
if(is_type_in_typecache(AM, ignore_typecache))
return
+ if(ismob(AM))
+ var/mob/M = AM
+ if(M.mind in immune_minds)
+ return
+ if(charges <= 0)
+ return
flare()
if(isliving(AM))
trap_effect(AM)
diff --git a/code/game/say.dm b/code/game/say.dm
index efad2f105fc..deab83ad101 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -56,10 +56,16 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
//End name span.
var/endspanpart = ""
- //Message
- var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]"
- return "[spanpart1][spanpart2][freqpart][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]"
+ //Message
+ var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans)]"
+
+ var/languageicon = ""
+ var/datum/language/D = get_language_instance(message_language)
+ if(D.display_icon(src))
+ languageicon = "[D.get_icon()] "
+
+ return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]"
/atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq)
return ""
@@ -67,33 +73,37 @@ GLOBAL_LIST_INIT(freqtospan, list(
/atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq)
return ""
-/atom/movable/proc/say_quote(input, list/spans=list(), message_mode)
- if(!input)
- return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
+/atom/movable/proc/say_mod(input, message_mode)
var/ending = copytext(input, length(input))
if(copytext(input, length(input) - 1) == "!!")
- spans |= SPAN_YELL
- return "[verb_yell], \"[attach_spans(input, spans)]\""
- input = attach_spans(input, spans)
- if(ending == "?")
- return "[verb_ask], \"[input]\""
- if(ending == "!")
- return "[verb_exclaim], \"[input]\""
+ return verb_yell
+ else if(ending == "?")
+ return verb_ask
+ else if(ending == "!")
+ return verb_exclaim
+ else
+ return verb_say
- return "[verb_say], \"[input]\""
+/atom/movable/proc/say_quote(input, list/spans=list(), message_mode)
+ if(!input)
+ input = "..."
+
+ if(copytext(input, length(input) - 1) == "!!")
+ spans |= SPAN_YELL
+
+ var/spanned = attach_spans(input, spans)
+ return "[say_mod(input, message_mode)], \"[spanned]\""
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode)
if(has_language(language))
var/atom/movable/AM = speaker.GetSource()
if(AM) //Basically means "if the speaker is virtual"
- if(AM.verb_say != speaker.verb_say || AM.verb_ask != speaker.verb_ask || AM.verb_exclaim != speaker.verb_exclaim || AM.verb_yell != speaker.verb_yell) //If the saymod was changed
- return speaker.say_quote(raw_message, spans, message_mode)
return AM.say_quote(raw_message, spans, message_mode)
else
return speaker.say_quote(raw_message, spans, message_mode)
else if(language)
var/atom/movable/AM = speaker.GetSource()
- var/datum/language/D = new language
+ var/datum/language/D = get_language_instance(language)
raw_message = D.scramble(raw_message)
if(AM)
return AM.say_quote(raw_message, spans, message_mode)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 2e716194132..847dc0d4bfd 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -23,10 +23,10 @@
if(T && T.z == turf_source.z)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, surround, channel, pressure_affected)
-/atom/proc/playsound_direct(soundin, vol as num, vary, frequency, falloff, surround = TRUE, channel = 0, pressure_affected = FALSE)
- playsound_local(get_turf(src), soundin, vol, vary, frequency, falloff, surround, channel)
+/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE)
+ if(!client || !can_hear())
+ return
-/atom/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE)
soundin = get_sfx(soundin)
var/sound/S = sound(soundin)
@@ -76,15 +76,10 @@
// The y value is for above your head, but there is no ceiling in 2d spessmens.
S.y = 1
- S.falloff = (falloff ? falloff : FALLOFF_SOUNDS)
+ S.falloff = falloff || FALLOFF_SOUNDS
src << S
-/mob/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE)
- if(!client || !can_hear())
- return
- ..()
-
/proc/open_sound_channel()
var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used
. = ++next_channel
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index 3e58e62854d..5024dfea90a 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -44,8 +44,8 @@
/turf/open/floor/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma flooring was ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Plasma flooring was ignited by [key_name(user)] in [COORD(src)]")
ignite(W.is_hot())
return
..()
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 398ff190f2f..54f3ad5ad5a 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -407,14 +407,14 @@
if(z != 5)
notify_admins = 1
if(!triggered_by_explosion)
- message_admins("[key_name_admin(user)]? (FLW) has triggered a gibtonite deposit reaction at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
else
- message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).")
+ message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
if(!triggered_by_explosion)
- log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).")
+ log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].")
else
- log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("An explosion has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)]")
countdown(notify_admins)
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index 355ba66a627..61a26954d32 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -101,8 +101,8 @@
/turf/closed/wall/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma wall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Plasma wall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in [COORD(src)]")
ignite(W.is_hot())
return
..()
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index 9411917c39a..bba253a9da6 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -9,6 +9,7 @@
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
+ occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
@@ -92,11 +93,12 @@
return
switch(action)
if("vr_connect")
- if(ishuman(occupant) && occupant.mind)
+ var/mob/living/carbon/human/human_occupant = occupant
+ if(human_occupant && human_occupant.mind)
to_chat(occupant, "Transfering to virtual reality...")
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
- occupant.mind.transfer_to(vr_human)
+ human_occupant.mind.transfer_to(vr_human)
vr_human.real_me = occupant
to_chat(vr_human, "Transfer successful! you are now playing as [vr_human] in VR!")
SStgui.close_user_uis(vr_human, src)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index e8803868fef..6b1d0e36f6d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -610,20 +610,41 @@
set desc = "(atom path) Spawn an atom"
set name = "Spawn"
+ return usr.client.spawn_atom_impl(object, FALSE)
+
+/datum/admins/proc/spawn_atom_adv(object as text)
+ set category = "Debug"
+ set desc = "(atom path) Spawn an atom with New() parameters"
+ set name = "Advanced Spawn"
+
+ return usr.client.spawn_atom_impl(object, TRUE)
+
+
+/client/proc/spawn_atom_impl(object, params)
if(!check_rights(R_SPAWN))
return
var/chosen = pick_closest_path(object)
if(!chosen)
return
+
+ var/list/arguments
if(ispath(chosen,/turf))
var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
- var/atom/A = new chosen(usr.loc)
+ if(params)
+ arguments = usr.client.get_callproc_args(TRUE)
+
+ if(!usr)
+ return
+
+ arguments = list(usr.loc) + arguments
+
+ var/atom/A = new chosen(arglist(arguments))
A.admin_spawned = TRUE
- log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
+ log_admin("[key_name(usr)] spawned [chosen] at [COORD(usr)][LAZYLEN(arguments) > 1 ? " with parameters [print_single_line(arguments)]": ""]")
SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index d3a86027bb0..f2656bd309c 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -4,7 +4,8 @@ atom/proc/investigate_log(message, subject)
var/F = file("[GLOB.log_directory]/[subject].html")
F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
"
-/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
+
+/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
set name = "Investigate"
set category = "Admin"
if(!holder)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index becffa0ec3b..068f68e2b96 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -1,7 +1,8 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
+//the procs are cause you can't put the comments in the GLOB var define
GLOBAL_PROTECT(admin_verbs_default)
-GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
-/proc/AVerbsDefault()
+GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
+/world/proc/AVerbsDefault()
return list(
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/
@@ -25,8 +26,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
/client/proc/stop_sounds
)
GLOBAL_PROTECT(admin_verbs_admin)
-GLOBAL_LIST_INIT(admin_verbs_admin, AVerbsAdmin())
-/proc/AVerbsAdmin()
+GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
+/world/proc/AVerbsAdmin()
return list(
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
@@ -76,9 +77,7 @@ GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_
GLOBAL_PROTECT(admin_verbs_sounds)
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound,/client/proc/play_sound,/client/proc/set_round_end_sound))
GLOBAL_PROTECT(admin_verbs_fun)
-GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
-/proc/AVerbsFun()
- return list(
+GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
@@ -100,12 +99,12 @@ GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
/client/proc/polymorph_all,
/client/proc/show_tip,
/client/proc/smite
- )
+ ))
GLOBAL_PROTECT(admin_verbs_spawn)
-GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character))
+GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/datum/admins/proc/spawn_atom_adv,/client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_server)
-GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
-/proc/AVerbsServer()
+GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
+/world/proc/AVerbsServer()
return list(
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
@@ -123,8 +122,8 @@ GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
/client/proc/toggle_hub
)
GLOBAL_PROTECT(admin_verbs_debug)
-GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
-/proc/AVerbsDebug()
+GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
+/world/proc/AVerbsDebug()
return list(
/client/proc/restart_controller,
/client/proc/cmd_admin_list_open_jobs,
@@ -169,9 +168,7 @@ GLOBAL_LIST_INIT(admin_verbs_rejuv, list(/client/proc/respawn_character))
//verbs which can be hidden - needs work
GLOBAL_PROTECT(admin_verbs_hideable)
-GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
-/proc/AVerbsHideable()
- return list(
+GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/set_ooc,
/client/proc/reset_ooc,
/client/proc/deadmin,
@@ -240,7 +237,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
/client/proc/debug_huds,
/client/proc/customiseSNPC,
/client/proc/resetSNPC,
- )
+ ))
/client/proc/add_admin_verbs()
if(holder)
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index aea7d3521a0..eabc7d3fd05 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -238,7 +238,7 @@
if("showgm")
if(!check_rights(R_ADMIN))
return
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
else if (SSticker.mode)
alert("The game mode is [SSticker.mode.name]")
@@ -327,7 +327,7 @@
if("traitor_all")
if(!check_rights(R_FUN))
return
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 6b77a705457..1f8778361fd 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -8,7 +8,7 @@
if(href_list["ahelp"])
if(!check_rights(R_ADMIN))
return
-
+
var/ahelp_ref = href_list["ahelp"]
var/datum/admin_help/AH = locate(ahelp_ref)
if(AH)
@@ -1170,7 +1170,7 @@
if(!check_rights(R_ADMIN))
return
- if(SSticker && SSticker.mode)
+ 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 +1184,7 @@
if(!check_rights(R_ADMIN))
return
- if(SSticker && SSticker.mode)
+ 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,7 +1199,7 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
- if (SSticker && SSticker.mode)
+ 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].")
@@ -1213,7 +1213,7 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
- if(SSticker && SSticker.mode)
+ 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)
@@ -1810,7 +1810,7 @@
if(!check_rights(R_ADMIN))
return
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 7375fac4664..a59f40e35a6 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -251,6 +251,11 @@
/proc/SDQL_from_objs(list/tree)
if("world" in tree)
+ if(IsAdminAdvancedProcCall())
+ var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
+ log_admin(msg)
+ message_admins(msg)
+ return
return world
return SDQL_expression(world, tree)
@@ -451,12 +456,17 @@
else
return null
if("world")
+ if(IsAdminAdvancedProcCall())
+ var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
+ log_admin(msg)
+ message_admins(msg)
+ return
v = world
if("global")
v = GLOB
else
return null
- else if(object == world) // Shitty ass hack kill me.
+ else if(object == GLOB) // Shitty ass hack kill me.
v = expression[start]
if(long)
if(expression[start + 1] == ".")
@@ -477,7 +487,7 @@
var/list/new_args = list()
for(var/arg in arguments)
new_args += SDQL_expression(source, arg)
- if(object == world) // Global proc.
+ if(object == GLOB) // Global proc.
procname = "/proc/[procname]"
return WrapAdminProcCall(GLOBAL_PROC, procname, new_args)
return WrapAdminProcCall(object, procname, new_args)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 54abb2844fe..643f6f3a936 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
for(var/I in l2b)
var/datum/admin_help/AH = I
dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
"
-
+
usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480")
//Tickets statpanel
@@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(state == AHELP_ACTIVE)
to_chat(usr, "This ticket is already open.")
return
-
+
if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey))
to_chat(usr, "This user already has an active ticket, cannot reopen this one.")
return
@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
RemoveActive()
state = AHELP_RESOLVED
GLOB.ahelp_tickets.ListInsert(src)
-
+
if(initiator)
initiator.giveadminhelpverb()
@@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/datum/admin_help/proc/Reject(key_name = key_name_admin(usr))
if(state != AHELP_ACTIVE)
return
-
+
if(initiator)
initiator.giveadminhelpverb()
@@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
current_ticket.MessageNoRecipient(msg)
current_ticket.TimeoutVerb()
return
- else
+ else
to_chat(usr, "Ticket not found, creating new one...")
else
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
@@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(!check_rights(R_ADMIN, TRUE))
return
-
+
var/browse_to
switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets"))
@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
browse_to = AHELP_RESOLVED
else
return
-
+
GLOB.ahelp_tickets.BrowseTickets(browse_to)
//
@@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
for(var/admin in admin_keys)
- if(LAZYLEN(admin_keys) > 1)
+ if(LAZYLEN(message) > 1)
message += ", [admin]"
else
message += "[admin]"
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index c8edb35ec91..c71c8321905 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -19,7 +19,7 @@
if (!msg)
return
- var/nicknames = world.file2list("config/admin_nicknames.txt")
+ var/static/nicknames = world.file2list("config/admin_nicknames.txt")
var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\""
@@ -29,4 +29,4 @@
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M.show_message(rendered, 2)
- SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
+ SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 9fb18c86599..1b099a9e0a5 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -145,8 +145,8 @@ GLOBAL_PROTECT(AdminProcCallCount)
-/client/proc/get_callproc_args()
- var/argnum = input("Number of arguments","Number:",0) as num|null
+/client/proc/get_callproc_args(is_atom_new = FALSE)
+ var/argnum = input("Number of arguments[is_atom_new ? " (Excluding loc)" : ""]","Number:",0) as num|null
if(isnull(argnum))
return
@@ -213,7 +213,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Robot"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -229,7 +229,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Blob"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -247,7 +247,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Simple Animal"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
@@ -295,7 +295,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Alien"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -312,7 +312,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make slime"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -423,7 +423,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Admin"
set name = "Grant Full Access"
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index 9fdb3169711..ba50ecae32d 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -19,7 +19,7 @@
usr.client.images += preview
if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes")
if(template.load(T, centered = TRUE))
- message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP)")
+ message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]")
else
to_chat(usr, "Failed to place map")
usr.client.images -= preview
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 8a8d18d5fd4..681a58f95fb 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
/client/proc/disable_communication,
/client/proc/print_pointers,
/client/proc/cmd_show_at_list,
- /client/proc/cmd_show_at_list,
+ /client/proc/cmd_show_at_markers,
/client/proc/manipulate_organs
))
@@ -154,14 +154,35 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
var/dat = {"Coordinate list of Active Turfs at Roundstart
Real-time Active Turfs list you can see in Air Subsystem at active_turfs var
"}
- for(var/i=1; i<=GLOB.active_turfs_startlist.len; i++)
- dat += GLOB.active_turfs_startlist[i]
+ for(var/t in GLOB.active_turfs_startlist)
+ var/turf/T = t
+ dat += "[ADMIN_COORDJMP(T)]\n"
dat += "
"
usr << browse(dat, "window=at_list")
SSblackbox.add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/cmd_show_at_markers()
+ set category = "Mapping"
+ set name = "Show roundstart AT markers"
+ set desc = "Places a marker on all active-at-roundstart turfs"
+
+ var/count = 0
+ for(var/obj/effect/abstract/marker/at/AT in GLOB.all_abstract_markers)
+ qdel(AT)
+ count++
+
+ if(count)
+ to_chat(usr, "[count] AT markers removed.")
+ else
+ for(var/t in GLOB.active_turfs_startlist)
+ new /obj/effect/abstract/marker/at(t)
+ count++
+ to_chat(usr, "[count] AT markers placed.")
+
+ SSblackbox.add_details("admin_verb","Show Roundstart Active Turf Markers")
+
/client/proc/enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs - Enable"
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 94d955bdd0c..c4a4d249e99 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -213,7 +213,14 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
- .["value"] = new type()
+
+ var/list/arguments
+ if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
+ arguments = get_callproc_args(FALSE)
+ else
+ arguments = list()
+
+ .["value"] = new type(arglist(arguments))
if (VV_NEW_DATUM)
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
@@ -221,7 +228,13 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
- .["value"] = new type()
+ var/list/arguments
+ if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
+ arguments = get_callproc_args(FALSE)
+ else
+ arguments = list()
+
+ .["value"] = new type(arglist(arguments))
if (VV_NEW_TYPE)
var/type = current_value
@@ -237,7 +250,14 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
- .["value"] = new type()
+
+ var/list/arguments
+ if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
+ arguments = get_callproc_args(FALSE);
+ else
+ arguments = list()
+
+ .["value"] = new type(arglist(arguments))
if (VV_NEW_LIST)
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index d8db479d5b8..feba659d725 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -1,6 +1,6 @@
GLOBAL_VAR_INIT(highlander, FALSE)
/client/proc/only_one() //Gives everyone kilts, berets, claymores, and pinpointers, with the objective to hijack the emergency shuttle.
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
GLOB.highlander = TRUE
@@ -79,7 +79,7 @@ GLOBAL_VAR_INIT(highlander, FALSE)
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.")
/proc/only_me()
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index c49009daabd..e781473634c 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -4,9 +4,6 @@
if(!check_rights(R_SOUNDS))
return
- log_admin("[key_name(src)] played sound [S]")
- message_admins("[key_name_admin(src)] played sound [S]")
-
var/freq = 1
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
freq = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
@@ -20,6 +17,16 @@
admin_sound.wait = 1
admin_sound.repeat = 0
admin_sound.status = SOUND_STREAM
+
+ var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel")
+ switch(res)
+ if("Yes")
+ to_chat(world, "An admin played: [S]")
+ if("Cancel")
+ return
+
+ log_admin("[key_name(src)] played sound [S]")
+ message_admins("[key_name_admin(src)] played sound [S]")
for(var/mob/M in GLOB.player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 255dcc05f47..be0738106d3 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -108,8 +108,8 @@
for(var/mob/M in view(range,A))
to_chat(M, msg)
- log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]")
- message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
")
+ log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]")
+ message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
")
SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
@@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
-/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
+/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
set category = "Admin"
set name = "Delete"
@@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(src, "Only administrators may use this command.")
return
- if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
- log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
- message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
+ admin_delete(A)
+
+/client/proc/admin_delete(datum/D)
+ var/atom/A = D
+ var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : ""
+ if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes")
+ log_admin("[key_name(usr)] deleted [D][coords]")
+ message_admins("[key_name_admin(usr)] deleted [D][coords]")
SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- if(isturf(O))
- var/turf/T = O
+ if(isturf(D))
+ var/turf/T = D
T.ChangeTurf(T.baseturf)
else
- qdel(O)
+ qdel(D)
/client/proc/cmd_admin_list_open_jobs()
set category = "Admin"
@@ -696,7 +701,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
- if(SSticker && SSticker.mode)
+ if(SSticker.HasRoundStarted())
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index f4c36c1f4a4..44c77bb19a4 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -93,10 +93,10 @@
if(href_list["time"])
timing = text2num(href_list["time"])
if(timing && istype(holder, /obj/item/device/transfer_valve))
- var/timer_message = "[key_name_admin(usr)](?) (FLW) activated [src] attachment on [holder]."
+ var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
message_admins(timer_message)
GLOB.bombers += timer_message
- log_game("[key_name(usr)] activated [src] attachment for [loc]")
+ log_game("[key_name(usr)] activated [src] attachment on [holder]")
update_icon()
if(href_list["repeat"])
loop = text2num(href_list["repeat"])
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index a52a7259549..bbbc3f12ed4 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -64,6 +64,8 @@
setDir(pick(GLOB.cardinal))
air_update_turf()
+/obj/effect/hotspot/make_frozen_visual()
+ return //you take my fun i take yours
/obj/effect/hotspot/proc/perform_exposure()
var/turf/open/location = loc
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 5c197332d12..a8a998e3495 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -662,7 +662,7 @@
playsound(src.loc, W.usesound, 50, 1)
if (do_after(user, 20*W.toolspeed, target = src))
if (buildstage == 1)
- user <<"You remove the air alarm electronics."
+ to_chat(user, "You remove the air alarm electronics.")
new /obj/item/weapon/electronics/airalarm( src.loc )
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
buildstage = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index c601d1601d7..40f9781fdbd 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -111,7 +111,8 @@
var/datum/gas_mixture/air1 = AIR1
var/turf/T = get_turf(src)
if(occupant)
- if(occupant.health >= 100) // Don't bother with fully healed people.
+ var/mob/living/mob_occupant = occupant
+ if(mob_occupant.health >= 100) // Don't bother with fully healed people.
on = FALSE
update_icon()
playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
@@ -120,15 +121,15 @@
radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language())
open_machine()
return
- else if(occupant.stat == DEAD) // We don't bother with dead people.
+ else if(mob_occupant.stat == DEAD) // We don't bother with dead people.
return
if(autoeject) // Eject if configured.
open_machine()
return
if(air1.gases.len)
- if(occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
- occupant.Sleeping((occupant.bodytemperature / sleep_factor) * 100)
- occupant.Paralyse((occupant.bodytemperature / paralyze_factor) * 100)
+ if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
+ mob_occupant.Sleeping((mob_occupant.bodytemperature / sleep_factor) * 100)
+ mob_occupant.Paralyse((mob_occupant.bodytemperature / paralyze_factor) * 100)
if(beaker)
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
@@ -149,19 +150,20 @@
update_icon()
return
if(occupant)
+ var/mob/living/mob_occupant = occupant
var/cold_protection = 0
var/mob/living/carbon/human/H = occupant
if(istype(H))
cold_protection = H.get_cold_protection(air1.temperature)
- var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
+ var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \
* temperature_delta * \
(air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
- occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB)
+ mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
@@ -254,16 +256,17 @@
var/list/occupantData = list()
if(occupant)
- occupantData["name"] = occupant.name
- occupantData["stat"] = occupant.stat
- occupantData["health"] = occupant.health
- occupantData["maxHealth"] = occupant.maxHealth
+ var/mob/living/mob_occupant = occupant
+ occupantData["name"] = mob_occupant.name
+ occupantData["stat"] = mob_occupant.stat
+ occupantData["health"] = mob_occupant.health
+ occupantData["maxHealth"] = mob_occupant.maxHealth
occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD
- occupantData["bruteLoss"] = occupant.getBruteLoss()
- occupantData["oxyLoss"] = occupant.getOxyLoss()
- occupantData["toxLoss"] = occupant.getToxLoss()
- occupantData["fireLoss"] = occupant.getFireLoss()
- occupantData["bodyTemperature"] = occupant.bodytemperature
+ occupantData["bruteLoss"] = mob_occupant.getBruteLoss()
+ occupantData["oxyLoss"] = mob_occupant.getOxyLoss()
+ occupantData["toxLoss"] = mob_occupant.getToxLoss()
+ occupantData["fireLoss"] = mob_occupant.getFireLoss()
+ occupantData["bodyTemperature"] = mob_occupant.bodytemperature
data["occupant"] = occupantData
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index f5613c0b7ea..7c9989c15d7 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -400,8 +400,8 @@
var/bz = air_contents.gases["bz"]
var/freon = air_contents.gases["freon"]
if(n2o || plasma || bz || freon)
- message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains the following: (JMP)")
- log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]")
+ log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:")
if(plasma)
log_admin("Plasma")
message_admins("Plasma")
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 33f50a3c503..376e907ab64 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -103,8 +103,9 @@
var/plasma = air_contents.gases["plasma"]
var/n2o = air_contents.gases["n2o"]
if(n2o || plasma)
- message_admins("[key_name_admin(usr)] (?) (FLW) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (JMP)")
- log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]")
+ var/area/A = get_area(src)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
+ log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]")
. = TRUE
if("direction")
if(direction == PUMP_OUT)
diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm
index c2a07349584..8f3292df3a1 100644
--- a/code/modules/cargo/exports/materials.dm
+++ b/code/modules/cargo/exports/materials.dm
@@ -50,11 +50,6 @@
material_id = MAT_PLASMA
message = "cm3 of plasma"
-/datum/export/material/plasma/get_cost(obj/O, contr = 0, emag = 0)
- . = ..()
- if(emag) // Syndicate pays you more for the plasma.
- . = round(. * 1.5)
-
// Uranium. Still useful for both power generation and nuclear annihilation.
/datum/export/material/uranium
cost = 400
@@ -98,4 +93,4 @@
message = "cm3 of glass"
material_id = MAT_GLASS
export_types = list(/obj/item/stack/sheet/glass, /obj/item/weapon/ore,
- /obj/item/weapon/shard)
\ No newline at end of file
+ /obj/item/weapon/shard)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index b7c7a7e3771..1a61048f486 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -182,14 +182,14 @@
/datum/supply_pack/emergency/syndicate
name = "NULL_ENTRY"
hidden = TRUE
- cost = 14000
+ cost = 20000
contains = list()
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
dangerous = TRUE
/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C)
- var/crate_value = 50
+ var/crate_value = 30
var/list/uplink_items = get_uplink_items(SSticker.mode)
while(crate_value)
var/category = pick(uplink_items)
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 6d8ffa64381..a29c3179b21 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
//DEFINITIONS FOR ASSET DATUMS START HERE.
-
/datum/asset/simple/tgui
assets = list(
"tgui.css" = 'tgui/assets/tgui.css',
@@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
)
-
-
-
-
-
-
-
/datum/asset/simple/pda
assets = list(
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
@@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums)
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
)
+/datum/asset/simple/changelog
+ assets = list(
+ "88x31.png" = 'html/88x31.png',
+ "bug-minus.png" = 'html/bug-minus.png',
+ "cross-circle.png" = 'html/cross-circle.png',
+ "hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
+ "image-minus.png" = 'html/image-minus.png',
+ "image-plus.png" = 'html/image-plus.png',
+ "music-minus.png" = 'html/music-minus.png',
+ "music-plus.png" = 'html/music-plus.png',
+ "tick-circle.png" = 'html/tick-circle.png',
+ "wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
+ "spell-check.png" = 'html/spell-check.png',
+ "burn-exclamation.png" = 'html/burn-exclamation.png',
+ "chevron.png" = 'html/chevron.png',
+ "chevron-expand.png" = 'html/chevron-expand.png',
+ "scales.png" = 'html/scales.png',
+ "changelog.css" = 'html/changelog.css'
+ )
+
//Registers HTML Interface assets.
/datum/asset/HTML_interface/register()
for(var/path in typesof(/datum/html_interface))
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index 58095cd857e..a32da8ab69b 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -33,7 +33,7 @@
entry += " - DEAD"
if(is_special_character(C.mob))
entry += " - Antagonist"
- entry += " (?)"
+ entry += " [ADMIN_QUE(C.mob)]"
entry += " ([round(C.avgping, 1)]ms)"
Lines += entry
else//If they don't have +ADMIN, only show hidden admins
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index ce8cbcd04c9..81037bd0374 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -202,7 +202,7 @@
item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
origin_tech = "syndicate=2"
- sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
+ sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = 0
resistance_flags = 0
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 7db86ee3594..0994c2f1777 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -83,7 +83,7 @@
C.use(1)
update_clothes_damaged_state(FALSE)
obj_integrity = max_integrity
- to_chat(user, "You fix the damages on [src] with [C].")
+ to_chat(user, "You fix the damage on [src] with [C].")
return 1
if(pockets)
var/i = pockets.attackby(W, user, params)
@@ -161,7 +161,7 @@
/obj/item/clothing/obj_break(damage_flag)
if(!damaged_clothes)
update_clothes_damaged_state(TRUE)
-
+ to_chat(usr, "Your [src] starts to fall apart!")
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
var/index = "\ref[initial(icon)]-[initial(icon_state)]"
@@ -519,9 +519,9 @@ BLIND // can't see anything
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
- var/has_sensor = 1//For the crew computer 2 = unable to change mode
+ var/has_sensor = HAS_SENSORS // For the crew computer
var/random_sensor = 1
- var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */
+ var/sensor_mode = NO_SENSORS
var/can_adjust = 1
var/adjusted = NORMAL_STYLE
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
@@ -546,16 +546,26 @@ BLIND // can't see anything
tie.color = hastie.color
. += tie
+/obj/item/clothing/under/attackby(obj/item/W, mob/user, params)
+ if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ C.use(1)
+ has_sensor = HAS_SENSORS
+ to_chat(user,"You repair the suit sensors on [src] with [C].")
+ return 1
+
/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
..()
if(ismob(loc))
var/mob/M = loc
M.update_inv_w_uniform()
+ if(has_sensor > NO_SENSORS)
+ has_sensor = BROKEN_SENSORS
/obj/item/clothing/under/New()
if(random_sensor)
//make the sensor mode favor higher levels, except coords.
- sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
+ sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
adjusted = NORMAL_STYLE
..()
@@ -633,15 +643,18 @@ BLIND // can't see anything
to_chat(user, "Alt-click on [src] to wear it normally.")
else
to_chat(user, "Alt-click on [src] to wear it casually.")
- switch(sensor_mode)
- if(0)
- to_chat(user, "Its sensors appear to be disabled.")
- if(1)
- to_chat(user, "Its binary life sensors appear to be enabled.")
- if(2)
- to_chat(user, "Its vital tracker appears to be enabled.")
- if(3)
- to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
+ if (has_sensor == BROKEN_SENSORS)
+ to_chat(user, "Its sensors appear to be shorted out.")
+ else if(has_sensor > NO_SENSORS)
+ switch(sensor_mode)
+ if(SENSOR_OFF)
+ to_chat(user, "Its sensors appear to be disabled.")
+ if(SENSOR_LIVING)
+ to_chat(user, "Its binary life sensors appear to be enabled.")
+ if(SENSOR_VITALS)
+ to_chat(user, "Its vital tracker appears to be enabled.")
+ if(SENSOR_COORDS)
+ to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
if(hastie)
to_chat(user, "\A [hastie] is attached to it.")
@@ -661,10 +674,13 @@ BLIND // can't see anything
return
if (!can_use(M))
return
- if(src.has_sensor >= 2)
+ if(src.has_sensor == LOCKED_SENSORS)
to_chat(usr, "The controls are locked.")
return 0
- if(src.has_sensor <= 0)
+ if(src.has_sensor == BROKEN_SENSORS)
+ to_chat(usr, "The sensors have shorted out!")
+ return 0
+ if(src.has_sensor <= NO_SENSORS)
to_chat(usr, "This suit does not have any sensors.")
return 0
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 2cdd1dfb871..25e09b9af77 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -178,6 +178,7 @@
pockets = /obj/item/weapon/storage/internal/pocket/shoes
actions_types = list(/datum/action/item_action/bhop)
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
+ var/jumpspeed = 3
var/recharging_rate = 60 //default 6 seconds between each dash
var/recharging_time = 0 //time until next dash
var/jumping = FALSE //are we mid-jump?
@@ -198,7 +199,7 @@
jumping = TRUE
playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1)
usr.visible_message("[usr] dashes foward into the air!")
- usr.throw_at(target, jumpdistance, 1, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
+ usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
/obj/item/clothing/shoes/bhop/proc/hop_end()
jumping = FALSE
@@ -214,4 +215,4 @@
name = "blue performer's boots"
desc = "These boots were made for dancing."
icon_state = "bsing"
- put_on_delay = 50
\ No newline at end of file
+ put_on_delay = 50
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index f05923f8998..91a54b0b7a7 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -13,7 +13,7 @@
armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/armor/vest
- name = "armor"
+ name = "armor vest"
desc = "A slim armored vest that protects against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
@@ -140,7 +140,7 @@
return 1
/obj/item/clothing/suit/armor/vest/det_suit
- name = "armor"
+ name = "detective's armor vest"
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 45606035a42..3e3791ef427 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -335,7 +335,7 @@
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
name = "Vape Naysh shirt"
- desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironicly?"
+ desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
icon_state = "vapeshirt"
item_state = "vapeshirt"
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index bd59d31cc76..42d978e5dec 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -224,5 +224,5 @@
to_chat(user, "The rune can only be used on battlemage armour!")
return
W.current_charges += 8
- user <<"You charge \the [W]. It can now absorb [W.current_charges] hits."
+ to_chat(user, "You charge \the [W]. It can now absorb [W.current_charges] hits.")
qdel(src)
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 11951fcf685..509d5421c2f 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -14,7 +14,7 @@
icon_state = "captain"
item_state = "b_suit"
item_color = "captain"
- sensor_mode = 3
+ sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/cargo
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index a83e85e585f..27e6f061f8b 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -18,7 +18,7 @@
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 30)
strip_delay = 50
alt_covers_chest = 1
- sensor_mode = 3
+ sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/security/grey
@@ -27,7 +27,7 @@
icon_state = "security"
item_state = "gy_suit"
item_color = "security"
-
+
/obj/item/clothing/under/rank/warden
name = "security suit"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index be458b7a4c4..0a8be08e809 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -61,8 +61,8 @@
icon_state = "prisoner"
item_state = "o_suit"
item_color = "prisoner"
- has_sensor = 2
- sensor_mode = 3
+ has_sensor = LOCKED_SENSORS
+ sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/mailman
@@ -404,7 +404,7 @@
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
- has_sensor = 0
+ has_sensor = NO_SENSORS
/obj/item/clothing/under/sundress
name = "sundress"
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 0da22fc678e..1464c4a6848 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -8,25 +8,31 @@
can_adjust = 0
/obj/item/clothing/under/shorts/red
+ name = "red athletic shorts"
icon_state = "redshorts"
item_color = "redshorts"
/obj/item/clothing/under/shorts/green
+ name = "green athletic shorts"
icon_state = "greenshorts"
item_color = "greenshorts"
/obj/item/clothing/under/shorts/blue
+ name = "blue athletic shorts"
icon_state = "blueshorts"
item_color = "blueshorts"
/obj/item/clothing/under/shorts/black
+ name = "black athletic shorts"
icon_state = "blackshorts"
item_color = "blackshorts"
/obj/item/clothing/under/shorts/grey
+ name = "grey athletic shorts"
icon_state = "greyshorts"
item_color = "greyshorts"
/obj/item/clothing/under/shorts/purple
+ name = "purple athletic shorts"
icon_state = "purpleshorts"
item_color = "purpleshorts"
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index ec506accf51..f2e70367e1e 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -4,7 +4,7 @@
icon_state = "syndicate"
item_state = "bl_suit"
item_color = "syndicate"
- has_sensor = 0
+ has_sensor = NO_SENSORS
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 40)
alt_covers_chest = 1
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index cd034a11174..9710098c5fa 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -178,7 +178,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
- if(A == target)
+ if(A == target && target.stat!=DEAD)
target.Weaken(5)
target.visible_message("[target] flails around wildly.","[name] pounces on you!")
@@ -286,7 +286,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
bubblegum = new(wall, target)
sleep(10) //ominous wait
var/charged = FALSE //only get hit once
- while(get_turf(bubblegum) != landing && target)
+ while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
bubblegum.forceMove(get_step_towards(bubblegum, landing))
bubblegum.setDir(get_dir(bubblegum, landing))
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
@@ -356,9 +356,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/i=0,i[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!")
- message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)")
- log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]")
+ log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].")
prime()
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 401347edf93..8eb1057becd 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -28,8 +28,8 @@
throw_speed = 3
throw_range = 10
-/obj/item/weapon/reagent_containers/spray/weedspray/New()
- ..()
+/obj/item/weapon/reagent_containers/spray/weedspray/Initialize()
+ . = ..()
reagents.add_reagent("weedkiller", 100)
/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
@@ -50,8 +50,8 @@
throw_speed = 3
throw_range = 10
-/obj/item/weapon/reagent_containers/spray/pestspray/New()
- ..()
+/obj/item/weapon/reagent_containers/spray/pestspray/Initialize()
+ . = ..()
reagents.add_reagent("pestkiller", 100)
/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
@@ -135,8 +135,8 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
-/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/Initialize()
+ . = ..()
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
@@ -147,8 +147,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
-/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/Initialize()
+ . = ..()
reagents.add_reagent("eznutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
@@ -157,8 +157,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
-/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/Initialize()
+ . = ..()
reagents.add_reagent("left4zednutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
@@ -167,8 +167,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
-/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/Initialize()
+ . = ..()
reagents.add_reagent("robustharvestnutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
@@ -191,8 +191,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
-/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/Initialize()
+ . = ..()
reagents.add_reagent("weedkiller", 50)
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
@@ -201,6 +201,6 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
-/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
- ..()
+/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/Initialize()
+ . = ..()
reagents.add_reagent("pestkiller", 50)
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 605a0a9c358..3ff8892d7e4 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -143,6 +143,15 @@ Librarian
/obj/item/soapstone = 1
)
+
+/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+
+ if(visualsOnly)
+ return
+
+ H.grant_all_languages(omnitongue=TRUE)
+
/*
Lawyer
*/
diff --git a/code/modules/language/common.dm b/code/modules/language/common.dm
index b6fb555729a..c00ab328ec1 100644
--- a/code/modules/language/common.dm
+++ b/code/modules/language/common.dm
@@ -5,9 +5,11 @@
speech_verb = "says"
whisper_verb = "whispers"
key = "0"
- flags = TONGUELESS_SPEECH
+ flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD
default_priority = 100
+ icon_state = "galcom"
+
//Syllable Lists
/*
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
diff --git a/code/modules/language/drone.dm b/code/modules/language/drone.dm
index 18f0ed3842c..390e0027cf8 100644
--- a/code/modules/language/drone.dm
+++ b/code/modules/language/drone.dm
@@ -4,7 +4,7 @@
speech_verb = "chitters"
ask_verb = "chitters inquisitively"
exclaim_verb = "chitters loudly"
- spans = list(SPAN_ROBOT, "drone")
+ spans = list(SPAN_ROBOT)
key = "d"
flags = NO_STUTTER
syllables = list(".", "|")
@@ -12,3 +12,5 @@
space_chance = 0
sentence_chance = 0
default_priority = 20
+
+ icon_state = "drone"
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index 08d45a4a6a2..f01eb2c7006 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -21,6 +21,21 @@
var/static/list/scramble_cache = list()
var/default_priority = 0 // the language that an atom knows with the highest "default_priority" is selected by default.
+ // if you are seeing someone speak popcorn language, then something is wrong.
+ var/icon = 'icons/misc/language.dmi'
+ var/icon_state = "popcorn"
+
+/datum/language/proc/display_icon(atom/movable/hearer)
+ var/understands = hearer.has_language(src.type)
+ if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands)
+ return FALSE
+ if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands)
+ return FALSE
+ return TRUE
+
+/datum/language/proc/get_icon()
+ return "
"
+
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
if(gender==FEMALE)
@@ -93,3 +108,13 @@
return speech_verb
#undef SCRAMBLE_CACHE_LEN
+
+/proc/get_language_instance(langtype)
+ if(!ispath(langtype, /datum/language))
+ return
+
+ if(!GLOB.language_datums[langtype])
+ var/datum/language/langdatum = new langtype
+ GLOB.language_datums[langtype] = langdatum
+
+ . = GLOB.language_datums[langtype]
diff --git a/code/modules/language/machine.dm b/code/modules/language/machine.dm
index 620e70d012b..4d88bcb4160 100644
--- a/code/modules/language/machine.dm
+++ b/code/modules/language/machine.dm
@@ -4,13 +4,15 @@
speech_verb = "whistles"
ask_verb = "chirps"
exclaim_verb = "whistles loudly"
- spans = list(SPAN_ROBOT, "changeling")
+ spans = list(SPAN_ROBOT)
key = "6"
flags = NO_STUTTER
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
space_chance = 10
default_priority = 90
+ icon_state = "eal"
+
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(GLOB.posibrain_names)]-[rand(100, 999)]"
diff --git a/code/modules/language/monkey.dm b/code/modules/language/monkey.dm
index 3b6ee332f1d..3f19008754b 100644
--- a/code/modules/language/monkey.dm
+++ b/code/modules/language/monkey.dm
@@ -4,8 +4,9 @@
speech_verb = "chimpers"
ask_verb = "chimpers"
exclaim_verb = "screeches"
- spans = list("monkey")
key = "1"
space_chance = 100
syllables = list("oop", "aak", "chee", "eek")
default_priority = 80
+
+ icon_state = "animal"
diff --git a/code/modules/language/ratvar.dm b/code/modules/language/ratvar.dm
index 2319b408892..cef4a3164ec 100644
--- a/code/modules/language/ratvar.dm
+++ b/code/modules/language/ratvar.dm
@@ -6,7 +6,9 @@
exclaim_verb = "clanks"
key = "r"
default_priority = 10
- spans = list(SPAN_ROBOT, "brass")
+ spans = list(SPAN_ROBOT)
+
+ icon_state = "ratvar"
/datum/language/ratvar/scramble(var/input)
. = text2ratvar(input)
diff --git a/code/modules/language/slime.dm b/code/modules/language/slime.dm
index cc4c36e2ef7..7171c07b391 100644
--- a/code/modules/language/slime.dm
+++ b/code/modules/language/slime.dm
@@ -4,7 +4,8 @@
speech_verb = "warbles"
ask_verb = "warbles"
exclaim_verb = "warbles"
- spans = list("slime")
key = "k"
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
default_priority = 70
+
+ icon_state = "slime"
diff --git a/code/modules/language/swarmer.dm b/code/modules/language/swarmer.dm
index b17cb88bf2a..e3b78267060 100644
--- a/code/modules/language/swarmer.dm
+++ b/code/modules/language/swarmer.dm
@@ -4,12 +4,15 @@
speech_verb = "tones"
ask_verb = "tones inquisitively"
exclaim_verb = "tones loudly"
- spans = list(SPAN_ROBOT, "swarmer")
+ spans = list(SPAN_ROBOT)
key = "s"
flags = NO_STUTTER
space_chance = 100
sentence_chance = 0
default_priority = 60
+
+ icon_state = "swarmer"
+
// since various flats and sharps are the same,
// all non-accidental notes are doubled in the list
/* The list with unicode symbols for the accents.
diff --git a/code/modules/language/xenocommon.dm b/code/modules/language/xenocommon.dm
index 263c3d0a9e0..6684ab31f85 100644
--- a/code/modules/language/xenocommon.dm
+++ b/code/modules/language/xenocommon.dm
@@ -4,7 +4,8 @@
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
- spans = list("alien")
key = "4"
syllables = list("sss","sSs","SSS")
default_priority = 50
+
+ icon_state = "xeno"
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index d47c4da04b2..e0588acf2b5 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -51,7 +51,7 @@
return FALSE
smooth_zlevel(world.maxz)
- SortAreas()
+ repopulate_sorted_areas()
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
@@ -74,6 +74,9 @@
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
+ if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
+ repopulate_sorted_areas()
+
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
return TRUE
diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm
index 0049c86ae92..12d0d5cd826 100644
--- a/code/modules/mining/machine_input_output_plates.dm
+++ b/code/modules/mining/machine_input_output_plates.dm
@@ -25,7 +25,7 @@
var/output_dir = SOUTH
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
- S.loc = loc
+ S.forceMove(loc)
var/turf/T = get_step(src,output_dir)
if(T)
- S.loc = T
\ No newline at end of file
+ S.forceMove(T)
\ No newline at end of file
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 0ffe9ae3a7e..32eb964de8e 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -1,3 +1,5 @@
+#define SMELT_AMOUNT 10
+
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral/processing_unit_console
@@ -10,182 +12,50 @@
var/machinedir = EAST
speed_process = 1
-/obj/machinery/mineral/processing_unit_console/New()
- ..()
- spawn(7)
- src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
- if (machine)
- machine.CONSOLE = src
- else
- qdel(src)
+/obj/machinery/mineral/processing_unit_console/Initialize()
+ . = ..()
+ machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
+ if (machine)
+ machine.CONSOLE = src
+ else
+ qdel(src)
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
- var/dat = "Smelter control console
"
- //iron
- if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine)
- if(machine.ore_iron)
- if (machine.selected_iron==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Iron: [machine.ore_iron]
"
- else
- machine.selected_iron = 0
-
- //sand - glass
- if(machine.ore_glass)
- if (machine.selected_glass==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Sand: [machine.ore_glass]
"
- else
- machine.selected_glass = 0
-
- //plasma
- if(machine.ore_plasma)
- if (machine.selected_plasma==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Plasma: [machine.ore_plasma]
"
- else
- machine.selected_plasma = 0
-
- //uranium
- if(machine.ore_uranium)
- if (machine.selected_uranium==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Uranium: [machine.ore_uranium]
"
- else
- machine.selected_uranium = 0
-
- //gold
- if(machine.ore_gold)
- if (machine.selected_gold==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Gold: [machine.ore_gold]
"
- else
- machine.selected_gold = 0
-
- //silver
- if(machine.ore_silver)
- if (machine.selected_silver==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Silver: [machine.ore_silver]
"
- else
- machine.selected_silver = 0
-
- //diamond
- if(machine.ore_diamond)
- if (machine.selected_diamond==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Diamond: [machine.ore_diamond]
"
- else
- machine.selected_diamond = 0
-
- //bananium
- if(machine.ore_clown)
- if (machine.selected_clown==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Bananium: [machine.ore_clown]
"
- else
- machine.selected_clown = 0
-
- //titanium
- if(machine.ore_titanium)
- if (machine.selected_titanium==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Titanium: [machine.ore_titanium]
"
- else
- machine.selected_titanium = 0
-
-
- //On or off
- dat += text("Machine is currently ")
- if (machine.on==1)
- dat += text("On ")
- else
- dat += text("Off ")
- else
- dat+="---No Materials Loaded---"
-
-
- user << browse(dat, "window=console_processing_unit")
+ if(!machine)
+ return
+ var/dat = machine.get_machine_data()
+ var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500)
+ popup.set_content(dat)
+ popup.open()
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
- src.add_fingerprint(usr)
- if(href_list["sel_iron"])
- if (href_list["sel_iron"] == "yes")
- machine.selected_iron = 1
- else
- machine.selected_iron = 0
- if(href_list["sel_glass"])
- if (href_list["sel_glass"] == "yes")
- machine.selected_glass = 1
- else
- machine.selected_glass = 0
- if(href_list["sel_plasma"])
- if (href_list["sel_plasma"] == "yes")
- machine.selected_plasma = 1
- else
- machine.selected_plasma = 0
- if(href_list["sel_uranium"])
- if (href_list["sel_uranium"] == "yes")
- machine.selected_uranium = 1
- else
- machine.selected_uranium = 0
- if(href_list["sel_gold"])
- if (href_list["sel_gold"] == "yes")
- machine.selected_gold = 1
- else
- machine.selected_gold = 0
- if(href_list["sel_silver"])
- if (href_list["sel_silver"] == "yes")
- machine.selected_silver = 1
- else
- machine.selected_silver = 0
- if(href_list["sel_diamond"])
- if (href_list["sel_diamond"] == "yes")
- machine.selected_diamond = 1
- else
- machine.selected_diamond = 0
- if(href_list["sel_clown"])
- if (href_list["sel_clown"] == "yes")
- machine.selected_clown = 1
- else
- machine.selected_clown = 0
- if(href_list["sel_titanium"])
- if (href_list["sel_titanium"] == "yes")
- machine.selected_titanium = 1
- else
- machine.selected_titanium = 0
+ add_fingerprint(usr)
+
+ if(href_list["material"])
+ machine.selected_material = href_list["material"]
+ machine.selected_alloy = null
+
+ if(href_list["alloy"])
+ machine.selected_material = null
+ machine.selected_alloy = href_list["alloy"]
+
if(href_list["set_on"])
- if (href_list["set_on"] == "on")
- machine.on = 1
- else
- machine.on = 0
- src.updateUsrDialog()
+ machine.on = (href_list["set_on"] == "on")
+
+ updateUsrDialog()
return
+/obj/machinery/mineral/processing_unit_console/Destroy()
+ machine = null
+ return ..()
+
+
/**********************Mineral processing unit**************************/
@@ -196,117 +66,84 @@
density = 1
anchored = 1
var/obj/machinery/mineral/CONSOLE = null
- var/ore_gold = 0;
- var/ore_silver = 0;
- var/ore_diamond = 0;
- var/ore_glass = 0;
- var/ore_plasma = 0;
- var/ore_uranium = 0;
- var/ore_iron = 0;
- var/ore_clown = 0;
- var/ore_adamantine = 0;
- var/ore_titanium = 0;
- var/selected_gold = 0
- var/selected_silver = 0
- var/selected_diamond = 0
- var/selected_glass = 0
- var/selected_plasma = 0
- var/selected_uranium = 0
- var/selected_iron = 0
- var/selected_clown = 0
- var/selected_titanium = 0
- var/on = 0 //0 = off, 1 =... oh you know!
+ var/datum/material_container/materials
+ var/on = FALSE
+ var/selected_material = MAT_METAL
+ var/selected_alloy = null
+ var/datum/research/files
+
+/obj/machinery/mineral/processing_unit/Initialize()
+ . = ..()
+ proximity_monitor = new(src, 1)
+ materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
+ files = new /datum/research/smelter(src)
+
+/obj/machinery/mineral/processing_unit/Destroy()
+ CONSOLE = null
+ QDEL_NULL(materials)
+ QDEL_NULL(files)
+ return ..()
+
+/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
+ if(istype(AM, /obj/item/weapon/ore) && AM.loc == get_step(src, input_dir))
+ process_ore(AM)
+
+/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/weapon/ore/O)
+ var/material_amount = materials.get_item_material_amount(O)
+ if(!materials.has_space(material_amount))
+ unload_mineral(O)
+ else
+ materials.insert_item(O)
+ qdel(O)
+ if(CONSOLE)
+ CONSOLE.updateUsrDialog()
+
+/obj/machinery/mineral/processing_unit/proc/get_machine_data()
+ var/dat = "Smelter control console
"
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ dat += "[M.name]: [M.amount] cm³"
+ if (selected_material == mat_id)
+ dat += " Smelting"
+ else
+ dat += " Not Smelting "
+ dat += "
"
+
+ dat += "
"
+ dat += "Smelt Alloys
"
+
+ for(var/v in files.known_designs)
+ var/datum/design/D = files.known_designs[v]
+ dat += "[D.name] "
+ if (selected_alloy == D.id)
+ dat += " Smelting"
+ else
+ dat += " Not Smelting "
+ dat += "
"
+
+ dat += "
"
+ //On or off
+ dat += "Machine is currently "
+ if (on)
+ dat += "On "
+ else
+ dat += "Off "
+
+ return dat
/obj/machinery/mineral/processing_unit/process()
- for(var/i in 1 to 10)
- if (on)
- if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_glass > 0)
- ore_glass--
- generate_mineral(/obj/item/stack/sheet/glass)
- else
- on = 0
- continue
- if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_glass > 0 && ore_iron > 0)
- ore_glass--
- ore_iron--
- generate_mineral(/obj/item/stack/sheet/rglass)
- else
- on = 0
- continue
- if (!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_gold > 0)
- ore_gold--
- generate_mineral(/obj/item/stack/sheet/mineral/gold)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_silver > 0)
- ore_silver--
- generate_mineral(/obj/item/stack/sheet/mineral/silver)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_diamond > 0)
- ore_diamond--
- generate_mineral(/obj/item/stack/sheet/mineral/diamond)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_plasma > 0)
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/mineral/plasma)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_uranium > 0)
- ore_uranium--
- generate_mineral(/obj/item/stack/sheet/mineral/uranium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_iron > 0)
- ore_iron--
- generate_mineral(/obj/item/stack/sheet/metal)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_iron > 0 && ore_plasma > 0)
- ore_iron--
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/plasteel)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_titanium)
- if (ore_clown > 0)
- ore_clown--
- generate_mineral(/obj/item/stack/sheet/mineral/bananium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
- if (ore_titanium > 0)
- ore_titanium--
- generate_mineral(/obj/item/stack/sheet/mineral/titanium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
- if (ore_titanium > 0)
- ore_titanium--
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/mineral/plastitanium)
- else
- on = 0
- continue
+ if (on)
+ if(selected_material)
+ smelt_ore()
+
+ else if(selected_alloy)
+ smelt_alloy()
+
+
+ if(CONSOLE)
+ CONSOLE.updateUsrDialog()
+
+
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
//Even in the dark year of 2016, where /tg/ is dead, Urist still hasn't finished this -Bawhoppennn
@@ -327,104 +164,57 @@
on = 0
continue*/
-
- //if a non valid combination is selected
-
- var/b = 1 //this part checks if all required ores are available
-
- if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
- b = 0
-
- if (selected_gold == 1)
- if (ore_gold <= 0)
- b = 0
- if (selected_silver == 1)
- if (ore_silver <= 0)
- b = 0
- if (selected_diamond == 1)
- if (ore_diamond <= 0)
- b = 0
- if (selected_uranium == 1)
- if (ore_uranium <= 0)
- b = 0
- if (selected_plasma == 1)
- if (ore_plasma <= 0)
- b = 0
- if (selected_iron == 1)
- if (ore_iron <= 0)
- b = 0
- if (selected_glass == 1)
- if (ore_glass <= 0)
- b = 0
- if (selected_clown == 1)
- if (ore_clown <= 0)
- b = 0
-
- if (b) //if they are, deduct one from each, produce slag and shut the machine off
- if (selected_gold == 1)
- ore_gold--
- if (selected_silver == 1)
- ore_silver--
- if (selected_diamond == 1)
- ore_diamond--
- if (selected_uranium == 1)
- ore_uranium--
- if (selected_plasma == 1)
- ore_plasma--
- if (selected_iron == 1)
- ore_iron--
- if (selected_clown == 1)
- ore_clown--
- generate_mineral(/obj/item/weapon/ore/slag)
- on = 0
- else
- on = 0
- break
- break
+/obj/machinery/mineral/processing_unit/proc/smelt_ore()
+ var/datum/material/mat = materials.materials[selected_material]
+ if(mat)
+ var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT)
+ if(!sheets_to_remove)
+ on = FALSE
else
- break
- var/turf/T = get_step(src,input_dir)
- if(T)
- var/n = 0
- for(var/obj/item/O in T)
- n++
- if(n>10)
- break
- if (istype(O,/obj/item/weapon/ore/iron))
- ore_iron++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/glass))
- ore_glass++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/diamond))
- ore_diamond++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/plasma))
- ore_plasma++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/gold))
- ore_gold++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/silver))
- ore_silver++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/uranium))
- ore_uranium++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/bananium))
- ore_clown++
- O.loc = null
- continue
- unload_mineral(O)
+ var/out = get_step(src, output_dir)
+ materials.retrieve_sheets(sheets_to_remove, selected_material, out)
+/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
+ var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
+ if(!alloy)
+ on = FALSE
+ return
+
+ var/amount = can_smelt(alloy)
+
+ if(!amount)
+ on = FALSE
+ return
+
+ materials.use_amount(alloy.materials, amount)
+
+ generate_mineral(alloy.build_path)
+
+/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D)
+ if(D.make_reagents.len)
+ return 0
+
+ var/build_amount = SMELT_AMOUNT
+
+
+ for(var/mat_id in D.materials)
+ var/M = D.materials[mat_id]
+ var/datum/material/smelter_mat = materials.materials[mat_id]
+
+ if(!M || !smelter_mat)
+ return 0
+
+ build_amount = min(build_amount, round(smelter_mat.amount / M))
+
+ return build_amount
+
/obj/machinery/mineral/processing_unit/proc/generate_mineral(P)
var/O = new P(src)
unload_mineral(O)
+
+/obj/machinery/mineral/processing_unit/on_deconstruction()
+ materials.retrieve_all()
+ ..()
+
+#undef SMELT_AMOUNT
\ No newline at end of file
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index db0b400fdaa..d93bcb50286 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -12,9 +12,6 @@
output_dir = SOUTH
req_access = list(GLOB.access_mineral_storeroom)
var/req_access_reclaim = GLOB.access_mining_station
- var/stk_types = list()
- var/stk_amt = list()
- var/stack_list = list() //Key: Type. Value: Instance of type.
var/obj/item/weapon/card/id/inserted_id
var/points = 0
var/ore_pickup_rate = 15
@@ -24,11 +21,20 @@
speed_process = 1
var/message_sent = FALSE
var/list/ore_buffer = list()
+ var/datum/material_container/materials
+ var/datum/research/files
-/obj/machinery/mineral/ore_redemption/New()
- ..()
+/obj/machinery/mineral/ore_redemption/Initialize()
+ . = ..()
var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new
B.apply_default_parts(src)
+ materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
+ files = new /datum/research/smelter(src)
+
+/obj/machinery/mineral/ore_redemption/Destroy()
+ QDEL_NULL(materials)
+ QDEL_NULL(files)
+ return ..()
/obj/item/weapon/circuitboard/machine/ore_redemption
name = "Ore Redemption (Machine Board)"
@@ -55,35 +61,67 @@
point_upgrade = point_upgrade_temp
sheet_per_ore = sheet_per_ore_temp
-/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O)
- var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O)
- if(processed_sheet)
- var/obj/item/stack/sheet/s
- if(!stack_list[processed_sheet])
- s = new processed_sheet(src, FALSE)
- s.amount = 0
- stack_list[processed_sheet] = s
- s = stack_list[processed_sheet]
- s.amount += sheet_per_ore //Stack the sheets
- ore_buffer -= O
- qdel(O) //... garbage collect
+/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/weapon/ore/O)
+
+ ore_buffer -= O
+
+ if(O && O.refined_type)
+ points += O.points * point_upgrade
+
+ var/material_amount = materials.get_item_material_amount(O)
+
+ if(!material_amount)
+ qdel(O) //no materials, incinerate it
+
+ else if(!materials.has_space(material_amount)) //if there is no space, eject it
+ unload_mineral(O)
+
+ else
+ materials.insert_item(O) //insert it
+ qdel(O)
+
+/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
+ if(D.make_reagents.len)
+ return 0
+
+ var/build_amount = 1
+
+ for(var/mat_id in D.materials)
+ var/M = D.materials[mat_id]
+ var/datum/material/redemption_mat = materials.materials[mat_id]
+
+ if(!M || !redemption_mat)
+ return 0
+
+ build_amount = min(build_amount, round(redemption_mat.amount / M))
+
+ return build_amount
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
var/current_amount = 0
for(var/ore in ores_to_process)
if(current_amount >= ore_pickup_rate)
break
- process_sheet(ore)
+ smelt_ore(ore)
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
- if(z != ZLEVEL_STATION || !LAZYLEN(stack_list))
+ if(z != ZLEVEL_STATION)
return
message_sent = TRUE
var/area/A = get_area(src)
var/msg = "Now available in [A]:
"
- for(var/s in stack_list)
- var/obj/item/stack/sheet/sheet = stack_list[s]
- msg += "[capitalize(sheet.name)]: [sheet.amount] sheets
"
+
+ var/has_minerals = FALSE
+
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
+ if(mineral_amount)
+ has_minerals = TRUE
+ msg += "[capitalize(M.name)]: [mineral_amount] sheets
"
+
+ if(!has_minerals)
+ return
for(var/obj/machinery/requests_console/D in GLOB.allConsoles)
if(D.receive_ore_updates)
@@ -144,15 +182,8 @@
return ..()
/obj/machinery/mineral/ore_redemption/on_deconstruction()
- empty_content()
-
-/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)
- if(O && O.refined_type)
- var/obj/item/stack/sheet/M = O.refined_type
- points += O.points * point_upgrade
- return M
- qdel(O)//No refined type? Purge it.
- return
+ materials.retrieve_all()
+ ..()
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
@@ -169,30 +200,26 @@
else
dat += "No ID inserted. Insert ID.
"
- for(var/O in stack_list)
- var/obj/item/stack/sheet/s = stack_list[O]
- if(s.amount)
- dat += "[capitalize(s.name)]: [s.amount] Release
"
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ if(M.amount)
+ var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
+ dat += "[capitalize(M.name)]: [sheet_amount] "
+ if(sheet_amount >= 1)
+ dat += "Release
"
+ else
+ dat += "Release
"
- var/obj/item/stack/sheet/metalstack
- if(/obj/item/stack/sheet/metal in stack_list)
- metalstack = stack_list[/obj/item/stack/sheet/metal]
+ for(var/v in files.known_designs)
+ var/datum/design/D = files.known_designs[v]
+ if(can_smelt_alloy(D))
+ dat += "[D.name]: Smelt
"
+ else
+ dat += "[D.name]: Smelt
"
- var/obj/item/stack/sheet/plasmastack
- if((/obj/item/stack/sheet/mineral/plasma in stack_list))
- plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma]
+ dat += "
Mineral Value List:
[get_ore_values()]
"
- var/obj/item/stack/sheet/mineral/titaniumstack
- if((/obj/item/stack/sheet/mineral/titanium in stack_list))
- titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium]
-
- if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount))
- dat += "Plasteel Alloy (Metal + Plasma): Smelt
"
- if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount))
- dat += "Plastitanium Alloy (Titanium + Plasma): Smelt
"
- dat += "
Mineral Value List:
[get_ore_values()]
"
-
- var/datum/browser/popup = new(user, "console_stacking_machine", "Ore Redemption Machine", 400, 500)
+ var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
popup.set_content(dat)
popup.open()
return
@@ -228,69 +255,52 @@
else
to_chat(usr, "Not a valid ID!")
if(href_list["release"])
- if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user.
- if(!(text2path(href_list["release"]) in stack_list))
+ if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
+ var/mat_id = href_list["release"]
+ if(!materials.materials[mat_id])
return
- var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
- var/obj/item/stack/sheet/out = new inp.type(src, 0, FALSE)
+
+ var/datum/material/mat = materials.materials[mat_id]
+ var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
+
+ if(!stored_amount)
+ return
+
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
- out.amount = round(min(desired,50,inp.amount))
- if(out.amount >= 1)
- inp.amount -= out.amount
- unload_mineral(out)
- if(inp.amount < 1)
- stack_list -= text2path(href_list["release"])
- qdel(inp)
+ var/sheets_to_remove = round(min(desired,50,stored_amount))
+
+ var/out = get_step(src, output_dir)
+ materials.retrieve_sheets(sheets_to_remove, mat_id, out)
+
else
to_chat(usr, "Required access not found.")
- if(href_list["alloytype1"] && href_list["alloytype2"] && href_list["alloytypeout"])
- var/alloytype1 = text2path(href_list["alloytype1"])
- var/alloytype2 = text2path(href_list["alloytype2"])
- var/alloytypeout = text2path(href_list["alloytypeout"])
- if(check_access(inserted_id) || allowed(usr))
- if(!(alloytype1 in stack_list))
- return
- if(!(alloytype2 in stack_list))
- return
- var/obj/item/stack/sheet/stack1 = stack_list[alloytype1]
- var/obj/item/stack/sheet/stack2 = stack_list[alloytype2]
+
+ if(href_list["alloy"])
+ var/alloy_id = href_list["alloy"]
+ var/datum/design/alloy = files.FindDesignByID(alloy_id)
+ if((check_access(inserted_id) || allowed(usr)) && alloy)
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
- var/obj/item/stack/sheet/alloyout = new alloytypeout
- alloyout.amount = round(min(desired,50,stack1.amount,stack2.amount))
- if(alloyout.amount >= 1)
- stack1.amount -= alloyout.amount
- stack2.amount -= alloyout.amount
- unload_mineral(alloyout)
- if(stack1.amount < 1)
- stack_list -= stack1
- qdel(stack1)
- if(stack2.amount < 1)
- stack_list -= stack2
- qdel(stack2)
+ var/smelt_amount = can_smelt_alloy(alloy)
+ var/amount = round(min(desired,50,smelt_amount))
+ materials.use_amount(alloy.materials, amount)
+
+ var/output = new alloy.build_path(src)
+ if(istype(output, /obj/item/stack/sheet))
+ var/obj/item/stack/sheet/mineral/produced_alloy = output
+ produced_alloy.amount = amount
+ unload_mineral(produced_alloy)
+ else
+ unload_mineral(output)
+
else
to_chat(usr, "Required access not found.")
updateUsrDialog()
return
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
..()
-//empty the redemption machine by stacks of at most max_amount (50 at this time) size
-/obj/machinery/mineral/ore_redemption/proc/empty_content()
- var/obj/item/stack/sheet/s
-
- for(var/O in stack_list)
- s = stack_list[O]
- while(s.amount > s.max_amount)
- new s.type(loc,s.max_amount)
- s.use(s.max_amount)
- s.forceMove(get_turf(src))
- s.layer = initial(s.layer)
- s.plane = initial(s.plane)
-
/obj/machinery/mineral/ore_redemption/power_change()
..()
update_icon()
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 0d651518b75..34cff303246 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -193,9 +193,7 @@
qdel(voucher)
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
if(prob(50 / severity) && severity < 3)
qdel(src)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 2bb438639bf..d15896a8db9 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -278,8 +278,8 @@
var/turf/T = deploy_location
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
- message_admins("[key_name_admin(usr)] (?) (FLW) activated a bluespace capsule away from the mining level! (JMP)")
- log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
+ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
template.load(deploy_location, centered = TRUE)
new /obj/effect/particle_effect/smoke(get_turf(src))
qdel(src)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 1f7f4b4695f..f5214e48362 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -248,18 +248,18 @@
if(notify_admins)
if(triggered_by == 1)
- message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).")
+ message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
else if(triggered_by == 2)
- message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]? (FLW)")
+ message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]")
else
- message_admins("[key_name_admin(user)]? (FLW) has triggered a [name] to detonate at [A.name] (JMP).")
+ message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
if(triggered_by == 1)
- log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]")
else if(triggered_by == 2)
- log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].")
+ log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].")
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.")
- log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
spawn(det_time)
if(primed)
if(quality == 3)
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 246bba711f1..bec7ba24fec 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -2,6 +2,11 @@
INITIALIZE_IMMEDIATE(/mob/dead)
+/mob/dead/Initialize()
+ . = ..()
+ if(config.cross_allowed)
+ verbs += /mob/dead/proc/server_hop
+
/mob/dead/dust() //ghosts can't be vaporised.
return
@@ -9,4 +14,29 @@ INITIALIZE_IMMEDIATE(/mob/dead)
return
/mob/dead/ConveyorMove() //lol
- return
\ No newline at end of file
+ return
+
+
+
+/mob/dead/proc/server_hop()
+ set category = "OOC"
+ set name = "Server Hop!"
+ set desc= "Jump to the other server"
+ if(notransform)
+ return
+ if(!config.cross_allowed)
+ verbs -= /mob/dead/proc/server_hop
+ to_chat(src, "Server Hop has been disabled.")
+ return
+ if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
+ return 0
+ if (client && config.cross_allowed)
+ to_chat(src, "Sending you to [config.cross_address].")
+ new /obj/screen/splash(client)
+ notransform = TRUE
+ sleep(29) //let the animation play
+ notransform = FALSE
+ winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
+ client << link(config.cross_address + "?server_hop=[key]")
+ else
+ to_chat(src, "There is no other server configured!")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 7946d67d10a..300c4636ea2 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
verbs += /mob/dead/observer/proc/dead_tele
- if(config.cross_allowed)
- verbs += /mob/dead/observer/proc/server_hop
-
if(icon_state in GLOB.ghost_forms_with_directions_list)
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
else
@@ -297,7 +294,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Stat()
..()
if(statpanel("Status"))
- if(SSticker && SSticker.mode)
+ if(SSticker.HasRoundStarted())
for(var/datum/gang/G in SSticker.mode.gangs)
if(G.is_dominating)
stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]")
@@ -354,9 +351,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!isobserver(usr))
to_chat(usr, "Not when you're not dead!")
return
- var/A
- A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas
- var/area/thearea = A
+ var/list/filtered = list()
+ for(var/V in GLOB.sortedAreas)
+ var/area/A = V
+ if(!A.hidden)
+ filtered += A
+ var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered
+
if(!thearea)
return
@@ -585,29 +586,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
target.faction = list("neutral")
return 1
-/mob/dead/observer/proc/server_hop()
- set category = "Ghost"
- set name = "Server Hop!"
- set desc= "Jump to the other server"
- if(notransform)
- return
- if(!config.cross_allowed)
- verbs -= /mob/dead/observer/proc/server_hop
- to_chat(src, "Server Hop has been disabled.")
- return
- if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
- return 0
- if (client && config.cross_allowed)
- to_chat(src, "Sending you to [config.cross_address].")
- new /obj/screen/splash(client)
- notransform = TRUE
- sleep(29) //let the animation play
- notransform = FALSE
- winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
- client << link(config.cross_address + "?server_hop=[key]")
- else
- to_chat(src, "There is no other server configured!")
-
/proc/show_server_hop_transfer_screen(expected_key)
//only show it to incoming ghosts
for(var/mob/dead/observer/O in GLOB.player_list)
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index ea97bc30ae7..f137299581c 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -50,7 +50,8 @@
if(C.has_brain_worms())
var/mob/living/simple_animal/borer/B = C.has_brain_worms()
B.leave_victim() //Should remove borer if the brain is removed - RR
- transfer_identity(C)
+ if(!gc_destroyed || (owner && !owner.gc_destroyed))
+ transfer_identity(C)
C.update_hair()
/obj/item/organ/brain/prepare_eat()
@@ -60,6 +61,8 @@
name = "[L.name]'s brain"
if(brainmob || decoy_override)
return
+ if(!L.mind)
+ return
brainmob = new(src)
brainmob.name = L.real_name
brainmob.real_name = L.real_name
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 44e578c909d..85f2dfc3e0e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -728,7 +728,7 @@
/mob/living/carbon/can_be_revived()
. = ..()
- if(!getorgan(/obj/item/organ/brain))
+ if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.changeling))
return 0
/mob/living/carbon/harvest(mob/living/user)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 7963273e6db..5651ed66b05 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -119,9 +119,7 @@
visible_message("The [M.name] has shocked [src]!", \
"The [M.name] has shocked [src]!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
var/power = M.powerlevel + rand(0,3)
Weaken(power)
if(stuttering < power)
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index 59c04c9841f..c6c7196755c 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -24,7 +24,8 @@
if(!no_bodyparts)
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
for(var/X in internal_organs)
- qdel(X)
+ if(no_brain || !istype(X, /obj/item/organ/brain))
+ qdel(X)
else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it.
for(var/X in internal_organs)
var/obj/item/organ/O = X
@@ -42,6 +43,9 @@
if(no_brain && istype(I, /obj/item/organ/brain))
qdel(I)
continue
+ if(no_organs && !istype(I, /obj/item/organ/brain))
+ qdel(I)
+ continue
I.Remove(src)
I.forceMove(get_turf(src))
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 5df1d9296ae..f239a64774a 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -32,7 +32,7 @@
dna.species.spec_death(gibbed, src)
- if(SSticker && SSticker.mode)
+ if(SSticker.HasRoundStarted())
SSblackbox.ReportDeath(src)
if(mind && mind.devilinfo)
INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 101b06849b0..1b5518008e5 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -142,10 +142,12 @@
return not_handled //For future deeper overrides
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
+ var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
-
+ if(index && dna.species.mutanthands)
+ put_in_hand(new dna.species.mutanthands(), index)
if(I == wear_suit)
if(s_store && invdrop)
dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit.
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index cb564e1b307..a4e733d5b25 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,10 +1,9 @@
-/mob/living/carbon/human/say_quote(input, spans, message_mode)
+/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
- . = ..()
- if(src.slurring)
- input = attach_spans(input, spans)
- return "slurs, \"[input]\""
-
+ if(slurring)
+ return "slurs"
+ else
+ . = ..()
/mob/living/carbon/human/treat_message(message)
message = dna.species.handle_speech(message,src)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index f64d30e90ac..fe75bf6cc86 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -73,6 +73,9 @@
//Ears
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
+ //Hands
+ var/obj/item/mutanthands = null
+
///////////
// PROCS //
///////////
@@ -139,15 +142,16 @@
qdel(lungs)
lungs = null
- if(eyes)
- qdel(eyes)
- eyes = new mutanteyes
- eyes.Insert(C)
+ if(C.get_bodypart("head"))
+ if(eyes)
+ qdel(eyes)
+ eyes = new mutanteyes
+ eyes.Insert(C)
- if(ears)
- qdel(ears)
- ears = new mutantears
- ears.Insert(C)
+ if(ears)
+ qdel(ears)
+ ears = new mutantears
+ ears.Insert(C)
if((!(NOBREATH in species_traits)) && !lungs)
if(mutantlungs)
@@ -169,6 +173,21 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
+ if(old_species.mutanthands)
+ for(var/obj/item/I in C.held_items)
+ if(istype(I, old_species.mutanthands))
+ qdel(I)
+
+ if(mutanthands)
+ // Drop items in hands
+ // If you're lucky enough to have a NODROP item, then it stays.
+ for(var/V in C.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+ C.dropItemToGround(I)
+ 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
+ C.put_in_hands(new mutanthands())
+
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
C.dna.blood_type = random_blood_type()
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index abd080bfaef..a2e26b4e5ef 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -13,6 +13,7 @@
name = "Infectious Zombie"
id = "memezombies"
limbs_id = "zombie"
+ mutanthands = /obj/item/zombie_hand
no_equip = list(slot_wear_mask, slot_head)
armor = 20 // 120 damage to KO a zombie, which kills it
speedmod = 2
@@ -27,29 +28,15 @@
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- // Drop items in hands
- // If you're a zombie lucky enough to have a NODROP item, then it stays.
- for(var/V in C.held_items)
- var/obj/item/I = V
- if(istype(I))
- if(C.dropItemToGround(I))
- var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
- C.put_in_hands(zh)
- 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/zombie_hand/zh = new /obj/item/zombie_hand()
- C.put_in_hands(zh)
- // Next, deal with the source of this zombie corruption
+ // Deal with the source of this zombie corruption
+ // Infection organ needs to be handled separately from mutant_organs
+ // because it persists through species transitions
var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot("zombie_infection")
if(!infection)
- infection = new(C)
-
-/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/C)
- . = ..()
- for(var/obj/item/I in C.held_items)
- if(istype(I, /obj/item/zombie_hand))
- qdel(I)
+ infection = new()
+ infection.Insert(C)
// Your skin falls off
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 78970c0bc97..0421ccabefd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -29,6 +29,13 @@
med_hud_set_status()
/mob/living/Destroy()
+ if(LAZYLEN(status_effects))
+ for(var/s in status_effects)
+ var/datum/status_effect/S = s
+ if(S.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
+ qdel(S)
+ else
+ S.be_replaced()
if(ranged_ability)
ranged_ability.remove_ranged_ability(src)
if(buckled)
@@ -597,7 +604,7 @@
return name
/mob/living/update_gravity(has_gravity,override = 0)
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
return
if(has_gravity)
clear_alert("weightless")
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 6e2b4c18217..c7f392d21bb 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -172,7 +172,7 @@
/mob/living/attack_slime(mob/living/simple_animal/slime/M)
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
to_chat(M, "You cannot attack people before the game has started.")
return
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 4818a58dad4..b0ab3b27af4 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -423,18 +423,17 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return 3
return 0
-/mob/living/say_quote(input, list/spans, message_mode)
- var/tempinput = attach_spans(input, spans)
+/mob/living/say_mod(input, message_mode)
if(message_mode == MODE_WHISPER)
- return "[verb_whisper], \"[tempinput]\""
- if(message_mode == MODE_WHISPER_CRIT)
- return "[verb_whisper] in [p_their()] last breath, \"[tempinput]\""
- if (stuttering)
- return "stammers, \"[tempinput]\""
- if (getBrainLoss() >= 60)
- return "gibbers, \"[tempinput]\""
-
- return ..()
+ . = verb_whisper
+ else if(message_mode == MODE_WHISPER_CRIT)
+ . = "[verb_whisper] in [p_their()] last breath"
+ else if(stuttering)
+ . = "stammers"
+ else if(getBrainLoss() >= 60)
+ . = "gibbers"
+ else
+ . = ..()
/mob/living/get_default_language()
if(selected_default_language)
@@ -448,5 +447,5 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/proc/open_language_menu(mob/user)
language_menu.ui_interact(user)
-/mob/living/whisper(message as text)
- say("#[message]")
+/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
+ say("#[message]", bubble_type, spans, sanitize, language)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 0047089cbf2..422acf49f9a 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -238,7 +238,7 @@
else if(icontype == "Angel")
icon_state = "ai-angel"
//else
- //usr <<"You can only change your display once!"
+ //to_chat(usr, "You can only change your display once!")
//return
/mob/living/silicon/ai/Stat()
@@ -351,7 +351,7 @@
if(isAI(usr))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
- src << "Wireless control is disabled!"
+ to_chat(src, "Wireless control is disabled!")
return
SSshuttle.cancelEvac(src)
return
diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm
index 75ef88768f7..d07f85ef6a0 100644
--- a/code/modules/mob/living/silicon/ai/ai_defense.dm
+++ b/code/modules/mob/living/silicon/ai/ai_defense.dm
@@ -6,7 +6,7 @@
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M)
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
to_chat(M, "You cannot attack people before the game has started.")
return
..()
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 263ccab4352..11091d97181 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -28,7 +28,7 @@
//Holopad
if(istype(ai.current, /obj/machinery/holopad))
var/obj/machinery/holopad/H = ai.current
- H.move_hologram(ai)
+ H.move_hologram(ai, T)
/mob/camera/aiEye/Move()
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1891e2a5520..fde80220572 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -271,6 +271,7 @@
/obj/item/roller/robo,
/obj/item/borg/cyborghug/medical,
/obj/item/stack/medical/gauze/cyborg,
+ /obj/item/weapon/organ_storage,
/obj/item/borg/lollipop)
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked)
ratvar_modules = list(
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 62575dd69c5..856179afc01 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -287,17 +287,13 @@
to_chat(user, "The welder must be on for this task!")
else
if(W.force) //if force is non-zero
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
..()
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
return ..()
/mob/living/simple_animal/bot/emp_act(severity)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 4c5c2c14c53..190e6a7db4f 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -259,9 +259,7 @@
if(prob(50))
new /obj/item/bodypart/l_arm/robot(Tsec)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/cleanbot
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 8c96a70cc0e..07ea0d7b5dd 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -390,9 +390,7 @@ Auto Patrol[]"},
if(lasercolor == "r")
new /obj/item/clothing/suit/redtag(Tsec)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index c8208e7a3b4..fe2b08e777c 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -381,9 +381,7 @@
var/obj/item/stack/tile/plasteel/T = new (Tsec)
T.amount = 1
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/floorbot
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index f1629296a7c..426c928af74 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -530,9 +530,7 @@
if(emagged && prob(25))
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
..()
/mob/living/simple_animal/bot/medbot/proc/declare(crit_patient)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 30c2c4e9a9a..bdf4277438d 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -719,9 +719,7 @@
cell.update_icon()
cell = null
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 1315793eeda..cba9e446ecd 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -397,9 +397,7 @@ Auto Patrol: []"},
if(prob(50))
new /obj/item/bodypart/l_arm/robot(Tsec)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index e6e66bc1f04..b3e7ff1af36 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -15,6 +15,7 @@
status_flags = CANPUSH
attack_sound = 'sound/weapons/punch1.ogg'
see_in_dark = 7
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -31,11 +32,14 @@
var/list/construct_spells = list()
var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this."
+
/mob/living/simple_animal/hostile/construct/Initialize()
. = ..()
+ update_health_hud()
for(var/spell in construct_spells)
AddSpell(new spell(null))
+
/mob/living/simple_animal/hostile/construct/Login()
..()
to_chat(src, playstyle_string)
@@ -84,6 +88,10 @@
/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
return 0
+/mob/living/simple_animal/hostile/construct/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ . = ..()
+ if(updating_health)
+ update_health_hud()
/////////////////Juggernaut///////////////
/mob/living/simple_animal/hostile/construct/armored
@@ -268,3 +276,22 @@
/mob/living/simple_animal/hostile/construct/harvester/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
+
+
+
+/////////////////////////////ui stuff/////////////////////////////
+
+/mob/living/simple_animal/hostile/construct/update_health_hud()
+ if(hud_used)
+ if(health >= maxHealth)
+ hud_used.healths.icon_state = "[icon_state]_health0"
+ else if(health > maxHealth*0.8)
+ hud_used.healths.icon_state = "[icon_state]_health2"
+ else if(health > maxHealth*0.6)
+ hud_used.healths.icon_state = "[icon_state]_health3"
+ else if(health > maxHealth*0.4)
+ hud_used.healths.icon_state = "[icon_state]_health4"
+ else if(health > maxHealth*0.2)
+ hud_used.healths.icon_state = "[icon_state]_health5"
+ else
+ hud_used.healths.icon_state = "[icon_state]_health6"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 7c751f70f4d..43290b860d1 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -53,7 +53,5 @@
ranged = 1
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
..(1)
\ No newline at end of file
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 3425d08e239..45139747fa0 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -187,8 +187,9 @@ Difficulty: Medium
animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING)
for(var/i in 1 to 3)
sleep(1)
- if(QDELETED(src)) //we got hit and died, rip us
+ if(QDELETED(src) || stat == DEAD) //we got hit and died, rip us
qdel(F)
+ swooping &= ~SWOOP_DAMAGEABLE
return
animate(src, transform = matrix()*0.7, time = 7)
swooping |= SWOOP_INVULNERABLE
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 455f893a5c1..a810d3fd67a 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -220,7 +220,7 @@
else
target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
name = "Toggle Nightvision \[ON]"
- target.update_sight()
+ target.update_sight()
/mob/living/simple_animal/hostile/statue/sentience_act()
faction -= "neutral"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index d3b27dd5df5..8db43623dcf 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -254,10 +254,10 @@
if(icon_gib)
new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
-/mob/living/simple_animal/say_quote(input, list/spans)
+/mob/living/simple_animal/say_mod(input, message_mode)
if(speak_emote && speak_emote.len)
verb_say = pick(speak_emote)
- return ..()
+ . = ..()
/mob/living/simple_animal/emote(act, m_type=1, message = null)
if(stat)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 95d3abfa288..0c8335f62df 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -3,6 +3,7 @@
GLOB.dead_mob_list -= src
GLOB.living_mob_list -= src
GLOB.all_clockwork_mobs -= src
+ GLOB.mob_directory -= tag
if(observers && observers.len)
for(var/M in observers)
var/mob/dead/observe = M
@@ -22,6 +23,7 @@
/mob/Initialize()
tag = "mob_[next_mob_id++]"
GLOB.mob_list += src
+ GLOB.mob_directory[tag] = src
if(stat == DEAD)
GLOB.dead_mob_list += src
else
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 2700d35092f..a704c2e43f0 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -326,7 +326,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return 0
/proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this.
- if(!SSticker || !SSticker.mode)
+ if(!SSticker.HasRoundStarted())
return 0
if(!istype(M))
return 0
@@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
A.action = action
A.target = source
if(!alert_overlay)
- alert_overlay = new(src)
+ alert_overlay = new(source)
alert_overlay.layer = FLOAT_LAYER
alert_overlay.plane = FLOAT_PLANE
A.add_overlay(alert_overlay)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 9bd3b582939..6545fcb505c 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -13,12 +13,6 @@
stored_implants += IMP
IMP.removed(src, 1, 1)
- if (tr_flags & TR_KEEPORGANS)
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- int_organs += I
- I.Remove(src, 1)
-
var/list/missing_bodyparts_zones = get_missing_limbs()
var/obj/item/cavity_object
@@ -92,10 +86,21 @@
var/obj/item/weapon/implant/IMP = Y
IMP.implant(O, null, 1)
- //re-add organs to new mob
+ //re-add organs to new mob. this order prevents moving the mind to a brain at any point
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
- qdel(X)
+ var/obj/item/organ/I = X
+ I.Remove(O, 1)
+
+ if(mind)
+ mind.transfer_to(O)
+ if(O.mind.changeling)
+ O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
+
+ for(var/X in internal_organs)
+ var/obj/item/organ/I = X
+ int_organs += I
+ I.Remove(src, 1)
for(var/X in int_organs)
var/obj/item/organ/I = X
@@ -118,7 +123,7 @@
qdel(G) //we lose the organs in the missing limbs
qdel(BP)
- //transfer mind and delete old mob
+ //transfer mind if we didn't yet
if(mind)
mind.transfer_to(O)
if(O.mind.changeling)
@@ -154,12 +159,6 @@
stored_implants += IMP
IMP.removed(src, 1, 1)
- if (tr_flags & TR_KEEPORGANS)
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- int_organs += I
- I.Remove(src, 1)
-
var/list/missing_bodyparts_zones = get_missing_limbs()
var/obj/item/cavity_object
@@ -244,7 +243,19 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
- qdel(X)
+ var/obj/item/organ/I = X
+ I.Remove(O, 1)
+
+ if(mind)
+ mind.transfer_to(O)
+ if(O.mind.changeling)
+ for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers)
+ mind.changeling.purchasedpowers -= HF
+
+ for(var/X in internal_organs)
+ var/obj/item/organ/I = X
+ int_organs += I
+ I.Remove(src, 1)
for(var/X in int_organs)
var/obj/item/organ/I = X
diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm
index b959ced6cf4..eec36d6c4c2 100644
--- a/code/modules/modular_computers/file_system/programs/card.dm
+++ b/code/modules/modular_computers/file_system/programs/card.dm
@@ -3,7 +3,7 @@
filedesc = "ID card modification program"
program_icon_state = "id"
extended_desc = "Program for programming employee ID cards to access parts of the station."
- transfer_access = GLOB.access_change_ids
+ transfer_access = GLOB.access_heads
requires_ntnet = 0
size = 8
var/mod_mode = 1
@@ -452,7 +452,7 @@
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
if(auth_card)
region_access = list()
- if(transfer_access in auth_card.GetAccess())
+ if(GLOB.access_change_ids in auth_card.GetAccess())
minor = 0
authenticated = 1
return 1
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 46332854887..6c6a088644a 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -497,9 +497,7 @@
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
return
C.use(10)
to_chat(user, "You add cables to the APC frame.")
@@ -1181,9 +1179,7 @@
/obj/machinery/power/apc/proc/shock(mob/user, prb)
if(!prob(prb))
return 0
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
if(isalien(user))
return 0
if(electrocute_mob(user, src, src, 1, TRUE))
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 4f4c6e4d1f0..d160d69daa7 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -156,9 +156,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(!prob(prb))
return 0
if (electrocute_mob(user, powernet, src, siemens_coeff))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
return 1
else
return 0
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index f3bbc205663..cfe0c8eb397 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -33,6 +33,7 @@
cold_circ = locate(circpath) in get_step(src, cold_dir)
hot_circ = locate(circpath) in get_step(src, hot_dir)
connect_to_network()
+ SSair.atmos_machinery += src
if(cold_circ)
switch(cold_dir)
@@ -54,7 +55,10 @@
stat |= BROKEN
update_icon()
-
+
+/obj/machinery/power/generator/Destroy()
+ SSair.atmos_machinery -= src
+ return ..()
/obj/machinery/power/generator/update_icon()
@@ -63,21 +67,20 @@
else
cut_overlays()
- if(lastgenlev != 0)
- add_overlay("teg-op[lastgenlev]")
+ var/L = min(round(lastgenlev/100000),11)
+ if(L != 0)
+ add_overlay(image('icons/obj/power.dmi', "teg-op[L]"))
add_overlay("teg-oc[lastcirc]")
#define GENRATE 800 // generator output coefficient from Q
-/obj/machinery/power/generator/process()
+/obj/machinery/power/generator/process_atmos()
if(!cold_circ || !hot_circ)
return
- lastgen = 0
-
if(powernet)
//to_chat(world, "cold_circ and hot_circ pass")
@@ -104,7 +107,7 @@
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency
+ lastgen += energy_transfer*efficiency
//to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];")
@@ -113,7 +116,7 @@
//to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
- add_avail(lastgen)
+ //add_avail(lastgen) This is done in process now
// update icon overlays only if displayed level has changed
if(hot_air)
@@ -123,15 +126,23 @@
if(cold_air)
var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1
cold_circ_air1.merge(cold_air)
+
+ update_icon()
- var/genlev = max(0, min( round(11*lastgen / 100000), 11))
var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
- if((genlev != lastgenlev) || (circ != lastcirc))
- lastgenlev = genlev
+ if(circ != lastcirc)
lastcirc = circ
update_icon()
src.updateDialog()
+
+/obj/machinery/power/generator/process()
+ //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math**
+ var/power_output = round(lastgen / 10)
+ add_avail(power_output)
+ lastgenlev = power_output
+ lastgen -= power_output
+ ..()
/obj/machinery/power/generator/attack_hand(mob/user)
if(..())
@@ -150,9 +161,15 @@
var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2
t += ""
-
- t += "Output: [round(lastgen)] W"
-
+
+ var/displaygen = lastgenlev
+ if(displaygen < 1000000) //less than a MW
+ displaygen /= 1000
+ t += "Output: [round(displaygen,0.01)] kW"
+ else
+ displaygen /= 1000000
+ t += "Output: [round(displaygen,0.01)] MW"
+
t += "
"
t += "
Cold loop"
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 17682376c56..2ba8705e481 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
use_power = on ? 2 : 1
// Sound the alert if gravity was just enabled or disabled.
var/alert = 0
- var/area/area = get_area(src)
+ var/area/A = get_area(src)
if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
if(gravity_in_level() == 0)
alert = 1
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
- message_admins("The gravity generator was brought online. (
[area.name])")
+ message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else
if(gravity_in_level() == 1)
alert = 1
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
- message_admins("The gravity generator was brought offline with no backup generator. (
[area.name])")
+ message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon()
update_list()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9d10624093a..c1ff1ee9ce0 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -93,13 +93,15 @@
connect_to_network()
sparks = new
+ sparks.attach(src)
sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/Destroy()
if(SSticker && SSticker.IsRoundInProgress())
- message_admins("Emitter deleted at ([x],[y],[z] -
JMP)",0,1)
- log_game("Emitter deleted at ([x],[y],[z])")
- investigate_log("
deleted at ([x],[y],[z]) at [get_area(src)]","singulo")
+ var/turf/T = get_turf(src)
+ message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Emitter deleted at [COORD(T)]")
+ investigate_log("
deleted at [get_area(src)] [COORD(T)]","singulo")
QDEL_NULL(sparks)
return ..()
@@ -120,8 +122,8 @@
if(src.active==1)
src.active = 0
to_chat(user, "
You turn off \the [src].")
- message_admins("Emitter turned off by [key_name_admin(user)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
investigate_log("turned
off by [key_name(user)] at [get_area(src)]","singulo")
else
src.active = 1
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 410181dede6..9deebdfe10a 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -39,7 +39,7 @@
narsie_spawn_animation()
sleep(70)
- SSshuttle.emergency.request(null, 0.1) // Cannot recall
+ SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 9cf19aff2dc..2045cb380cb 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -117,8 +117,8 @@
strength++
strength_change()
- message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("increased to
[strength] by [key_name(usr)]","singulo")
@@ -127,8 +127,8 @@
strength--
strength_change()
- message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("decreased to
[strength] by [key_name(usr)]","singulo")
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 1e1737661e4..8044132a0f6 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -170,7 +170,7 @@
//crowbarring it !
var/turf/T = get_turf(src)
if(default_deconstruction_crowbar(I))
- message_admins("[src] has been deconstructed by [key_name_admin(user)](
?) (
FLW) in ([T.x],[T.y],[T.z] -
JMP)",0,1)
+ message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
log_game("[src] has been deconstructed by [key_name(user)]")
investigate_log("SMES deconstructed by [key_name(user)]","singulo")
return
@@ -192,10 +192,11 @@
/obj/machinery/power/smes/Destroy()
if(SSticker && SSticker.IsRoundInProgress())
- var/area/area = get_area(src)
- message_admins("SMES deleted at (
[area.name])")
- log_game("SMES deleted at ([area.name])")
- investigate_log("
deleted at ([area.name])","singulo")
+ var/area/A = get_area(src)
+ var/turf/T = get_turf(src)
+ message_admins("SMES deleted at [A][ADMIN_JMP(T)]")
+ log_game("SMES deleted at [A][COORD(T)]")
+ investigate_log("
deleted at [A][COORD(T)]","singulo")
if(terminal)
disconnect_terminal()
return ..()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index fee8859de49..712cd5cd415 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -127,8 +127,9 @@
/obj/machinery/power/supermatter_shard/make_frozen_visual()
return
-/obj/machinery/power/supermatter_shard/New()
+/obj/machinery/power/supermatter_shard/Initialize()
. = ..()
+ SSair.atmos_machinery += src
countdown = new(src)
countdown.start()
GLOB.poi_list |= src
@@ -139,6 +140,7 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
+ SSair.atmos_machinery -= src
QDEL_NULL(radio)
GLOB.poi_list -= src
QDEL_NULL(countdown)
@@ -181,7 +183,7 @@
E.energy = power
qdel(src)
-/obj/machinery/power/supermatter_shard/process()
+/obj/machinery/power/supermatter_shard/process_atmos()
var/turf/T = loc
if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity.
@@ -296,6 +298,7 @@
if(produces_gas)
env.merge(removed)
+ air_update_turf()
for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them.
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
@@ -341,7 +344,7 @@
lastwarning = REALTIMEOFDAY
if(!has_reached_emergency)
investigate_log("has reached the emergency point for the first time.", "supermatter")
- message_admins("[src] has reached the emergency point
(JMP).")
+ message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].")
has_reached_emergency = 1
else if(damage >= damage_archived) // The damage is still going up
SPEAK("[warning_alert] Instability: [stability]%")
@@ -388,7 +391,7 @@
power += Proj.damage * config_bullet_energy
if(!has_been_powered)
investigate_log("has been powered for the first time.", "supermatter")
- message_admins("[src] has been powered for the first time
(JMP).")
+ message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = 1
else if(takes_damage)
damage += Proj.damage * config_bullet_energy
@@ -487,7 +490,7 @@
/obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM)
if(isliving(AM))
var/mob/living/user = AM
- message_admins("[src] has consumed [key_name_admin(user)]
? (
FLW)
(JMP).")
+ message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].")
investigate_log("has consumed [key_name(user)].", "supermatter")
user.dust()
matter_power += 200
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 57196e6c80b..65b9ef926f3 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -135,27 +135,27 @@
/// SAW ROUNDS
-/obj/item/ammo_casing/mm556x45
- desc = "A 556x45mm bullet casing."
+/obj/item/ammo_casing/mm195x129
+ desc = "A 1.95x129mm bullet casing."
icon_state = "762-casing"
- caliber = "mm55645"
+ caliber = "mm195129"
projectile_type = /obj/item/projectile/bullet/saw
-/obj/item/ammo_casing/mm556x45/bleeding
- desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
+/obj/item/ammo_casing/mm195x129/bleeding
+ desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
icon_state = "762-casing"
projectile_type = /obj/item/projectile/bullet/saw/bleeding
-/obj/item/ammo_casing/mm556x45/hollow
- desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets."
+/obj/item/ammo_casing/mm195x129/hollow
+ desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
projectile_type = /obj/item/projectile/bullet/saw/hollow
-/obj/item/ammo_casing/mm556x45/ap
- desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
+/obj/item/ammo_casing/mm195x129/ap
+ desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
projectile_type = /obj/item/projectile/bullet/saw/ap
-/obj/item/ammo_casing/mm556x45/incen
- desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
+/obj/item/ammo_casing/mm195x129/incen
+ desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
projectile_type = /obj/item/projectile/bullet/saw/incen
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index d4c6204233f..11112ec974e 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -234,35 +234,35 @@
//// SAW MAGAZINES
-/obj/item/ammo_box/magazine/mm556x45
- name = "box magazine (5.56x45mm)"
+/obj/item/ammo_box/magazine/mm195x129
+ name = "box magazine (1.95x129mm)"
icon_state = "a762-50"
origin_tech = "combat=2"
- ammo_type = /obj/item/ammo_casing/mm556x45
- caliber = "mm55645"
+ ammo_type = /obj/item/ammo_casing/mm195x129
+ caliber = "mm195129"
max_ammo = 50
-/obj/item/ammo_box/magazine/mm556x45/bleeding
- name = "box magazine (Bleeding 5.56x45mm)"
+/obj/item/ammo_box/magazine/mm195x129/bleeding
+ name = "box magazine (Bleeding 1.95x129mm)"
origin_tech = "combat=3"
- ammo_type = /obj/item/ammo_casing/mm556x45/bleeding
+ ammo_type = /obj/item/ammo_casing/mm195x129/bleeding
-/obj/item/ammo_box/magazine/mm556x45/hollow
- name = "box magazine (Hollow-Point 5.56x45mm)"
+/obj/item/ammo_box/magazine/mm195x129/hollow
+ name = "box magazine (Hollow-Point 1.95x129mm)"
origin_tech = "combat=3"
- ammo_type = /obj/item/ammo_casing/mm556x45/hollow
+ ammo_type = /obj/item/ammo_casing/mm195x129/hollow
-/obj/item/ammo_box/magazine/mm556x45/ap
- name = "box magazine (Armor Penetrating 5.56x45mm)"
+/obj/item/ammo_box/magazine/mm195x129/ap
+ name = "box magazine (Armor Penetrating 1.95x129mm)"
origin_tech = "combat=4"
- ammo_type = /obj/item/ammo_casing/mm556x45/ap
+ ammo_type = /obj/item/ammo_casing/mm195x129/ap
-/obj/item/ammo_box/magazine/mm556x45/incen
- name = "box magazine (Incendiary 5.56x45mm)"
+/obj/item/ammo_box/magazine/mm195x129/incen
+ name = "box magazine (Incendiary 1.95x129mm)"
origin_tech = "combat=4"
- ammo_type = /obj/item/ammo_casing/mm556x45/incen
+ ammo_type = /obj/item/ammo_casing/mm195x129/incen
-/obj/item/ammo_box/magazine/mm556x45/update_icon()
+/obj/item/ammo_box/magazine/mm195x129/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index b334b7b7759..1ffdaf0d29b 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -278,13 +278,13 @@
/obj/item/weapon/gun/ballistic/automatic/l6_saw
name = "\improper L6 SAW"
- desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
+ desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = WEIGHT_CLASS_HUGE
slot_flags = 0
origin_tech = "combat=6;engineering=3;syndicate=6"
- mag_type = /obj/item/ammo_box/magazine/mm556x45
+ mag_type = /obj/item/ammo_box/magazine/mm195x129
weapon_weight = WEAPON_HEAVY
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
var/cover_open = 0
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index e99ff04add9..73d3a34a1b9 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -19,15 +19,12 @@
/obj/item/weapon/gun/energy/pulse/prize/New()
. = ..()
GLOB.poi_list |= src
- var/msg = "A pulse rifle prize has been created at ([x],[y],[z] - (\
-
\
- JMP)"
+ var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]"
message_admins(msg)
log_game(msg)
- notify_ghosts("Someone won a pulse rifle as a prize!", source = src,
- action = NOTIFY_ORBIT)
+ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT)
/obj/item/weapon/gun/energy/pulse/prize/Destroy()
GLOB.poi_list -= src
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index e6fa3e9cfdf..90c3b4a72ab 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -138,7 +138,7 @@
/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user)
..()
if(power_supply)
- user <<"
[src] is [round(power_supply.percent())]% charged."
+ to_chat(user, "
[src] is [round(power_supply.percent())]% charged.")
/obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 9f5073075fa..2dbc0ff1c23 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -54,7 +54,9 @@
/obj/item/slime_extract = list(),
/obj/item/weapon/reagent_containers/pill = list(),
/obj/item/weapon/reagent_containers/food = list(),
- /obj/item/weapon/reagent_containers/honeycomb = list()
+ /obj/item/weapon/reagent_containers/honeycomb = list(),
+ /obj/item/toy/crayon = list()
+
)
var/list/juice_items = list (
@@ -455,3 +457,13 @@
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
remove_object(O)
+
+ for (var/obj/item/toy/crayon/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ for (var/r_id in O.reagent_contents)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ if (space == 0)
+ break
+ beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space))
+ remove_object(O)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index aa913ba8f0a..500147d2334 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -288,30 +288,43 @@
/datum/reagent/medicine/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
- description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip."
+ description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute."
reagent_state = LIQUID
color = "#DCDCDC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
taste_description = "sweetness and salt"
+ var/last_added = 0
+ var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M)
+ if(last_added)
+ M.blood_volume -= last_added
+ last_added = 0
+ if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level.
+ var/amount_to_add = min(M.blood_volume, volume*5)
+ var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable)
+ last_added = new_blood_level - M.blood_volume
+ M.blood_volume = new_blood_level
if(prob(33))
M.adjustBruteLoss(-0.5*REM, 0)
M.adjustFireLoss(-0.5*REM, 0)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.blood_volume += 0.2
. = 1
..()
-/datum/reagent/medicine/salglu_solution/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(ishuman(M) && method == INJECT)
- var/mob/living/carbon/human/H = M
- if(H.dna && !(NOBLOOD in H.dna.species.species_traits))
- var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute.
- efficiency = Clamp(efficiency, 0.1, 0.75)
- //As it's designed for an IV drip, make large injections not as effective as repeated small injections.
- H.blood_volume += round(efficiency * min(5,reac_volume), 0.1)
+/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M)
+ if(prob(3))
+ to_chat(M, "
You feel salty.")
+ holder.add_reagent("sodiumchloride", 1)
+ holder.remove_reagent("salglu_solution", 0.5)
+ else if(prob(3))
+ to_chat(M, "
You feel sweet.")
+ holder.add_reagent("sugar", 1)
+ holder.remove_reagent("salglu_solution", 0.5)
+ if(prob(33))
+ M.adjustBruteLoss(0.5*REM, 0)
+ M.adjustFireLoss(0.5*REM, 0)
+ . = 1
..()
/datum/reagent/medicine/mine_salve
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index cf956227ba1..b38d39e1392 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -658,7 +658,7 @@
taste_mult = 0 // apparently tasteless.
/datum/reagent/mercury/on_mob_life(mob/living/M)
- if(M.canmove && isspaceturf(M.loc))
+ if(M.canmove && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -738,7 +738,7 @@
taste_description = "metal"
/datum/reagent/lithium/on_mob_life(mob/living/M)
- if(M.canmove && isspaceturf(M.loc))
+ if(M.canmove && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -1128,7 +1128,7 @@
//For colouring in /proc/mix_color_from_reagents
-/datum/reagent/crayonpowder
+/datum/reagent/colorful_reagent/crayonpowder
name = "Crayon Powder"
id = "crayon powder"
var/colorname = "none"
@@ -1137,50 +1137,72 @@
color = "#FFFFFF" // rgb: 207, 54, 0
taste_description = "the back of class"
-/datum/reagent/crayonpowder/New()
+/datum/reagent/colorful_reagent/crayonpowder/New()
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
-/datum/reagent/crayonpowder/red
+/datum/reagent/colorful_reagent/crayonpowder/red
name = "Red Crayon Powder"
id = "redcrayonpowder"
colorname = "red"
+ color = "#DA0000" // red
+ random_color_list = list("#DA0000")
-/datum/reagent/crayonpowder/orange
+/datum/reagent/colorful_reagent/crayonpowder/orange
name = "Orange Crayon Powder"
id = "orangecrayonpowder"
colorname = "orange"
color = "#FF9300" // orange
+ random_color_list = list("#FF9300")
-/datum/reagent/crayonpowder/yellow
+/datum/reagent/colorful_reagent/crayonpowder/yellow
name = "Yellow Crayon Powder"
id = "yellowcrayonpowder"
colorname = "yellow"
color = "#FFF200" // yellow
+ random_color_list = list("#FFF200")
-/datum/reagent/crayonpowder/green
+/datum/reagent/colorful_reagent/crayonpowder/green
name = "Green Crayon Powder"
id = "greencrayonpowder"
colorname = "green"
color = "#A8E61D" // green
+ random_color_list = list("#A8E61D")
-/datum/reagent/crayonpowder/blue
+/datum/reagent/colorful_reagent/crayonpowder/blue
name = "Blue Crayon Powder"
id = "bluecrayonpowder"
colorname = "blue"
color = "#00B7EF" // blue
+ random_color_list = list("#00B7EF")
-/datum/reagent/crayonpowder/purple
+/datum/reagent/colorful_reagent/crayonpowder/purple
name = "Purple Crayon Powder"
id = "purplecrayonpowder"
colorname = "purple"
color = "#DA00FF" // purple
+ random_color_list = list("#DA00FF")
-/datum/reagent/crayonpowder/invisible
+/datum/reagent/colorful_reagent/crayonpowder/invisible
name = "Invisible Crayon Powder"
id = "invisiblecrayonpowder"
colorname = "invisible"
color = "#FFFFFF00" // white + no alpha
+ random_color_list = list(null) //because using the powder color turns things invisible
+
+/datum/reagent/colorful_reagent/crayonpowder/black
+ name = "Black Crayon Powder"
+ id = "blackcrayonpowder"
+ colorname = "black"
+ color = "#1C1C1C" // not quite black
+ random_color_list = list("#404040")
+
+/datum/reagent/colorful_reagent/crayonpowder/white
+ name = "White Crayon Powder"
+ id = "whitecrayonpowder"
+ colorname = "white"
+ color = "#FFFFFF" // white
+ random_color_list = list("#FFFFFF") //doesn't actually change appearance at all
@@ -1511,7 +1533,9 @@
/datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H)
// Silently add the zombie infection organ to be activated upon death
- new /obj/item/organ/zombie_infection(H)
+ if(!H.getorganslot("zombie_infection"))
+ var/obj/item/organ/zombie_infection/ZI = new()
+ ZI.Insert(H)
..()
/datum/reagent/growthserum
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 9e0bb2d0e4f..c13ff096e4c 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -36,12 +36,12 @@
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (
JMP)"
+ var/message = "A [reaction_name] reaction has occurred in [my_area.name] [ADMIN_COORDJMP(T)]"
message += " (
VV)"
var/mob/M = get(A, /mob)
if(M)
- message += " - Carried By: [key_name_admin(M)](
?) (
FLW)"
+ message += " - Carried By: [ADMIN_LOOKUPFLW(M)]"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 805aa936d43..6cfdd80cf53 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -6,6 +6,7 @@
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/inside_msg
if(ismob(holder.my_atom))
var/mob/M = holder.my_atom
@@ -14,9 +15,9 @@
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]
? (
FLW)"
- message_admins("Reagent explosion reaction occurred at
[T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].")
- log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]"
+ message_admins("Reagent explosion reaction occurred at [A] [ADMIN_COORDJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].")
+ log_game("Reagent explosion reaction occurred at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0)
e.start()
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index a1c4a74795f..e67557919e4 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -437,13 +437,14 @@
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]
?(
FLW)."
- message_admins("Slime Explosion reaction started at
[T.loc.name] (JMP). Last Fingerprint: [touch_msg]")
- log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].")
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]."
+ message_admins("Slime Explosion reaction started at [A] [ADMIN_COORDJMP(T)]. Last Fingerprint: [touch_msg]")
+ log_game("Slime Explosion reaction started at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("
The slime extract begins to vibrate violently !")
addtimer(CALLBACK(src, .proc/boom, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index ab467308733..2571e3573df 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -25,13 +25,10 @@
/obj/item/weapon/reagent_containers/blood/proc/update_pack_name()
if(!labelled)
- if(volume)
- if(blood_type)
- name = "blood pack [blood_type]"
- else
- name = "blood pack"
+ if(blood_type)
+ name = "blood pack - [blood_type]"
else
- name = "empty blood pack"
+ name = "blood pack"
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
@@ -69,7 +66,7 @@
blood_type = "L"
/obj/item/weapon/reagent_containers/blood/empty
- name = "empty blood pack"
+ name = "blood pack"
icon_state = "empty"
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index a697ccbe5b8..b2c657b02a7 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -279,3 +279,27 @@
slot_equipment_priority.Insert(index, slot_head)
return
return ..()
+
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle
+ name = "bottle of water"
+ desc = "A bottle of water filled at an old Earth bottling facility,"
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "smallbottle"
+ item_state = "bottle"
+ list_reagents = list("water" = 49.5, "fluorine" = 0.5)//see desc, don't think about it too hard
+ materials = list(MAT_GLASS=0)
+ volume = 50
+ amount_per_transfer_from_this = 10
+ origin_tech = null
+
+/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large
+ desc = "A fresh commercial-sized bottle of water."
+ icon_state = "largebottle"
+ materials = list(MAT_GLASS=0)
+ list_reagents = list("water" = 100)
+ volume = 100
+ amount_per_transfer_from_this = 20
+
+
+
+
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 79db908d507..df8f7927c0c 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -48,15 +48,16 @@
user.changeNext_move(CLICK_CD_RANGE*2)
user.newtonian_move(get_dir(A, user))
var/turf/T = get_turf(src)
+ var/area/area = get_area(src)
if(reagents.has_reagent("sacid"))
- message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
if(reagents.has_reagent("facid"))
- message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
if(reagents.has_reagent("lube"))
- message_admins("[key_name_admin(user)] fired Space lube from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
return
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
new file mode 100644
index 00000000000..2672e0e27a7
--- /dev/null
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -0,0 +1,18 @@
+///////SMELTABLE ALLOYS///////
+
+/datum/design/plasteel_alloy
+ name = "Plasma + Iron alloy"
+ id = "plasteel"
+ build_type = SMELTER
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ build_path = /obj/item/stack/sheet/plasteel
+ category = list("initial","Alloys")
+
+
+/datum/design/plastitanium_alloy
+ name = "Plasma + Titanium alloy"
+ id = "plastitanium"
+ build_type = SMELTER
+ materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ build_path = /obj/item/stack/sheet/mineral/plastitanium
+ category = list("initial","Alloys")
\ No newline at end of file
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index cf3a4825956..be96f758927 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -1068,7 +1068,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole/robotics/Initialize()
. = ..()
if(circuit)
- circuit.name = "RD Console - Robotics (Computer Board)"
+ circuit.name = "R&D Console - Robotics (Computer Board)"
circuit.build_path = /obj/machinery/computer/rdconsole/robotics
/obj/machinery/computer/rdconsole/core
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index a321c03b473..827cce162f7 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -175,6 +175,21 @@ research holder datum.
return
..()
+//Smelter files
+/datum/research/smelter/New()
+ for(var/T in (subtypesof(/datum/tech)))
+ possible_tech += new T(src)
+ for(var/path in subtypesof(/datum/design))
+ var/datum/design/D = new path(src)
+ possible_designs += D
+ if((D.build_type & SMELTER) && ("initial" in D.category))
+ AddDesign2Known(D)
+
+/datum/research/smelter/AddDesign2Known(datum/design/D)
+ if(!(D.build_type & SMELTER))
+ return
+ ..()
+
/***************************************************************
** Technology Datums **
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index c6685956996..708a155fb3c 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -20,7 +20,7 @@
if(Uses >= 5)
to_chat(user, "
You cannot enhance this extract further!")
return ..()
- user <<"
You apply the enhancer to the slime extract. It may now be reused one more time."
+ to_chat(user, "
You apply the enhancer to the slime extract. It may now be reused one more time.")
Uses++
qdel(O)
..()
@@ -146,8 +146,8 @@
M.docile = 1
M.nutrition = 700
- M <<"
You absorb the potion and feel your intense desire to feed melt away."
- user <<"
You feed the slime the potion, removing its hunger and calming it."
+ to_chat(M, "
You absorb the potion and feel your intense desire to feed melt away.")
+ to_chat(user, "
You feed the slime the potion, removing its hunger and calming it.")
var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
if (!newname)
@@ -261,10 +261,10 @@
to_chat(user, "
The slime is dead!")
return ..()
if(M.cores >= 5)
- user <<"
The slime already has the maximum amount of extract!"
+ to_chat(user, "
The slime already has the maximum amount of extract!")
return ..()
- user <<"
You feed the slime the steroid. It will now produce one more extract."
+ to_chat(user, "
You feed the slime the steroid. It will now produce one more extract.")
M.cores++
qdel(src)
@@ -288,10 +288,10 @@
to_chat(user, "
The slime is dead!")
return ..()
if(M.mutation_chance == 0)
- user <<"
The slime already has no chance of mutating!"
+ to_chat(user, "
The slime already has no chance of mutating!")
return ..()
- user <<"
You feed the slime the stabilizer. It is now less likely to mutate."
+ to_chat(user, "
You feed the slime the stabilizer. It is now less likely to mutate.")
M.mutation_chance = Clamp(M.mutation_chance-15,0,100)
qdel(src)
@@ -312,10 +312,10 @@
to_chat(user, "
This slime has already consumed a mutator, any more would be far too unstable!")
return ..()
if(M.mutation_chance == 100)
- user <<"
The slime is already guaranteed to mutate!"
+ to_chat(user, "
The slime is already guaranteed to mutate!")
return ..()
- user <<"
You feed the slime the mutator. It is now more likely to mutate."
+ to_chat(user, "
You feed the slime the mutator. It is now more likely to mutate.")
M.mutation_chance = Clamp(M.mutation_chance+12,0,100)
M.mutator_used = TRUE
qdel(src)
@@ -348,7 +348,7 @@
return ..()
R.vehicle_move_delay = 0
- user <<"
You slather the red gunk over the [C], making it faster."
+ to_chat(user, "
You slather the red gunk over the [C], making it faster.")
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY)
qdel(src)
@@ -373,7 +373,7 @@
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
to_chat(user, "
The [C] is already fireproof!")
return ..()
- user <<"
You slather the blue gunk over the [C], fireproofing it."
+ to_chat(user, "
You slather the blue gunk over the [C], fireproofing it.")
C.name = "fireproofed [C.name]"
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY)
@@ -420,7 +420,7 @@
item_color = "golem"
flags = ABSTRACT | NODROP
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- has_sensor = 0
+ has_sensor = NO_SENSORS
/obj/item/clothing/suit/golem
name = "adamantine shell"
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 32fb4a46e5c..e427400553f 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -119,7 +119,6 @@
name = "incomplete artificial golem shell"
has_owner = TRUE
-
///Syndicate Listening Post
/obj/effect/mob_spawn/human/lavaland_syndicate
r_hand = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle
@@ -136,7 +135,7 @@
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
has_id = 1
- flavour_text = "
You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunatley, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!"
id_access_list = list(GLOB.access_syndicate)
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
@@ -144,5 +143,5 @@
r_hand = /obj/item/weapon/melee/energy/sword/saber
mask = /obj/item/clothing/mask/chameleon
suit = /obj/item/clothing/suit/armor/vest
- flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunatley, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
pocket2 = /obj/item/weapon/card/id/syndicate/anyone
diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm
index 852a7bc2fca..cd501432237 100644
--- a/code/modules/shuttle/arrivals.dm
+++ b/code/modules/shuttle/arrivals.dm
@@ -174,7 +174,7 @@
Launch(TRUE)
- user << "Calling your shuttle. One moment..."
+ to_chat(user, "Calling your shuttle. One moment...")
while(mode != SHUTTLE_CALL && !damaged)
stoplag()
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index d0a54d2a5fb..6344689f0bd 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -104,12 +104,8 @@
authorized += ID
- message_admins("[key_name_admin(user.client)] \
- (?) \
- (FLW) \
- has authorized early shuttle launch", 0, 1)
- log_game("[key_name(user)] has authorized early shuttle launch in \
- ([x],[y],[z])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch", 0, 1)
+ log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]")
// Now check if we're on our way
. = TRUE
process()
@@ -207,8 +203,17 @@
. = ..()
-/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert)
- var/call_time = SSshuttle.emergencyCallTime * coefficient
+/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null)
+ if(!isnum(set_coefficient))
+ var/security_num = seclevel2num(get_security_level())
+ switch(security_num)
+ if(SEC_LEVEL_GREEN)
+ set_coefficient = 2
+ if(SEC_LEVEL_BLUE)
+ set_coefficient = 1
+ else
+ set_coefficient = 0.5
+ var/call_time = SSshuttle.emergencyCallTime * set_coefficient
switch(mode)
// The shuttle can not normally be called while "recalling", so
// if this proc is called, it's via admin fiat
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index f90fe2f7e08..a5226abd58f 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -30,4 +30,4 @@
return
last_request = world.time
to_chat(usr, "Your request has been recieved by Centcom.")
- to_chat(GLOB.admins, "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.")
+ to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.")
diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm
index 2da4b5aa10b..5a06351f885 100644
--- a/code/modules/spells/spell_types/area_teleport.dm
+++ b/code/modules/spells/spell_types/area_teleport.dm
@@ -47,7 +47,7 @@
L+=T
if(!L.len)
- usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry."
+ to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
return
if(target && target.buckled)
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index 32bdf54a311..c37166a2446 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -26,9 +26,9 @@
if(M.mind)
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
S.charge_counter = S.charge_max
- M <<"You feel raw magic flowing through you. It feels good!"
+ to_chat(M, "You feel raw magic flowing through you. It feels good!")
else
- M <<"you feel very strange for a moment, but then it passes."
+ to_chat(M, "You feel very strange for a moment, but then it passes.")
burnt_out = 1
charged_item = M
break
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index 4a28a220762..dfde331207a 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -42,6 +42,11 @@
if(summon_lifespan)
QDEL_IN(summoned_object, summon_lifespan)
+ post_summon(summoned_object, user)
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/proc/post_summon(atom/summoned_object, mob/user)
+ return
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/summonEdSwarm //test purposes - Also a lot of fun
name = "Dispense Wizard Justice"
desc = "This spell dispenses wizard justice."
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index c9ff8929100..8e8968fb528 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -234,7 +234,7 @@
else
var/list/funky_turfs = RANGE_TURFS(1, user)
for(var/turf/closed/solid in funky_turfs)
- user << "You're too close to a wall."
+ to_chat(user, "You're too close to a wall.")
return
dancefloor_exists = TRUE
var/i = 1
diff --git a/code/modules/spells/spell_types/the_traps.dm b/code/modules/spells/spell_types/the_traps.dm
index ca3da766172..169a38bb957 100644
--- a/code/modules/spells/spell_types/the_traps.dm
+++ b/code/modules/spells/spell_types/the_traps.dm
@@ -3,7 +3,7 @@
desc = "Summon a number of traps to confuse and weaken your enemies, and possibly you."
charge_max = 250
- cooldown_min = 100
+ cooldown_min = 50
clothes_req = 1
invocation = "CAVERE INSIDIAS"
@@ -14,10 +14,13 @@
/obj/structure/trap/stun,
/obj/structure/trap/fire,
/obj/structure/trap/chill,
- /obj/structure/trap/damage,
- /obj/structure/swarmer/trap
+ /obj/structure/trap/damage
)
- summon_lifespan = 0
+ summon_lifespan = 3000
summon_amt = 5
action_icon_state = "the_traps"
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/post_summon(obj/structure/trap/T, mob/user)
+ T.immune_minds += user.mind
+ T.charges = 1
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index de8c2b79acf..c8f0ade4b8d 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -254,6 +254,8 @@
if(held_index > C.hand_bodyparts.len)
C.hand_bodyparts.len = held_index
C.hand_bodyparts[held_index] = src
+ if(C.dna.species.mutanthands && !is_pseudopart)
+ C.put_in_hand(new C.dna.species.mutanthands(), held_index)
if(C.hud_used)
var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"]
if(hand)
@@ -269,6 +271,9 @@
qdel(S)
break
+ for(var/obj/item/organ/O in contents)
+ O.Insert(C)
+
update_bodypart_damage_state()
C.updatehealth()
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 1808a45b08c..6e3c224924d 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -24,7 +24,7 @@
/datum/surgery_step/manipulate_organs
time = 64
name = "manipulate organs"
- implements = list(/obj/item/organ = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0)
+ implements = list(/obj/item/organ = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0, /obj/item/weapon/organ_storage = 100)
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
var/implements_mend = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
var/current_type
@@ -55,6 +55,15 @@
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
I = null
+ if(istype(tool, /obj/item/weapon/organ_storage))
+ if(!tool.contents.len)
+ to_chat(user, "There is nothing inside [tool]!")
+ return -1
+ I = tool.contents[1]
+ if(!isorgan(I))
+ to_chat(user, "You cannot put [I] into [target]'s [parse_zone(target_zone)]!")
+ return -1
+ tool = I
if(isorgan(tool))
current_type = "insert"
I = tool
@@ -74,7 +83,7 @@
"You begin to extract [B] from [target]'s [parse_zone(target_zone)]...")
return TRUE
if(!organs.len)
- to_chat(user, "There is no removeable organs in [target]'s [parse_zone(target_zone)]!")
+ to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!")
return -1
else
for(var/obj/item/organ/O in organs)
@@ -108,7 +117,14 @@
target.heal_bodypart_damage(45,0)
return 1
else if(current_type == "insert")
- I = tool
+ if(istype(tool, /obj/item/weapon/organ_storage))
+ I = tool.contents[1]
+ tool.icon_state = "evidenceobj"
+ tool.desc = "A container for holding body parts."
+ tool.cut_overlays()
+ tool = I
+ else
+ I = tool
user.drop_item()
I.Insert(target)
user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index d90e1448634..9dbca40558b 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -39,7 +39,7 @@
M.internal_organs -= src
if(M.internal_organs_slot[slot] == src)
M.internal_organs_slot.Remove(slot)
- if(vital && !special)
+ if(vital && !special && !(M.status_flags & GODMODE))
M.death()
for(var/X in actions)
var/datum/action/A = X
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 2413a45870b..a2048c2b718 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -175,7 +175,7 @@
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
var/static/regex/weaken_words = regex("drop|fall|trip|weaken")
- var/static/regex/sleep_words = regex("sleep|slumber")
+ var/static/regex/sleep_words = regex("sleep|slumber|rest")
var/static/regex/vomit_words = regex("vomit|throw up")
var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
@@ -206,7 +206,6 @@
var/static/regex/throwmode_words = regex("throw|catch")
var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
var/static/regex/speak_words = regex("speak|say something")
- var/static/regex/rest_words = regex("rest")
var/static/regex/getup_words = regex("get up")
var/static/regex/sit_words = regex("sit")
var/static/regex/stand_words = regex("stand")
@@ -443,17 +442,9 @@
L.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
sleep(5) //So the chat flows more naturally
- //REST
- else if((findtext(message, rest_words)))
- cooldown = COOLDOWN_MEME
- for(var/V in listeners)
- var/mob/living/L = V
- if(!L.resting)
- L.lay_down()
-
//GET UP
else if((findtext(message, getup_words)))
- cooldown = COOLDOWN_DAMAGE
+ cooldown = COOLDOWN_DAMAGE //because stun removal
for(var/V in listeners)
var/mob/living/L = V
if(L.resting)
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index b054626f4e8..4be7b84a6c6 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -16,11 +16,20 @@
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
- implements = list(/obj/item/bodypart = 100, /obj/item/weapon/twohanded/required/chainsaw = 100, /obj/item/weapon/melee/synthetic_arm_blade = 100)
+ implements = list(/obj/item/bodypart = 100, /obj/item/weapon/organ_storage = 100, /obj/item/weapon/twohanded/required/chainsaw = 100, /obj/item/weapon/melee/synthetic_arm_blade = 100)
time = 32
var/organ_rejection_dam = 0
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(istype(tool, /obj/item/weapon/organ_storage))
+ if(!tool.contents.len)
+ to_chat(user, "There is nothing inside [tool]!")
+ return -1
+ var/obj/item/I = tool.contents[1]
+ if(!isbodypart(I))
+ to_chat(user, "[I] cannot be attached!")
+ return -1
+ tool = I
if(istype(tool, /obj/item/bodypart))
var/obj/item/bodypart/BP = tool
if(ismonkey(target))// monkey patient only accept organic monkey limbs
@@ -49,6 +58,11 @@
return -1
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(istype(tool, /obj/item/weapon/organ_storage))
+ tool.icon_state = "evidenceobj"
+ tool.desc = "A container for holding body parts."
+ tool.cut_overlays()
+ tool = tool.contents[1]
if(istype(tool, /obj/item/bodypart))
var/obj/item/bodypart/L = tool
user.drop_item()
@@ -58,9 +72,9 @@
user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
return 1
else
- target.regenerate_limb(target_zone)
- var/obj/item/bodypart/L = target.get_bodypart(target_zone)
+ var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE)
L.is_pseudopart = TRUE
+ L.attach_limb(target)
user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].")
qdel(tool)
if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw))
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 9d011f68890..9d3377cc9c2 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -97,4 +97,57 @@
/obj/item/weapon/surgical_drapes/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/weapon/organ_storage //allows medical cyborgs to manipulate organs without hands
+ name = "organ storage bag"
+ desc = "A container for holding body parts."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "evidenceobj"
+
+/obj/item/weapon/organ_storage/afterattack(obj/item/I, mob/user, proximity)
+ if(!proximity)
+ return
+ if(contents.len)
+ to_chat(user, "[src] already has something inside it.")
+ return
+ if(isorgan(I))
+ var/obj/item/organ/O = I
+ if(O.status != ORGAN_ORGANIC)
+ to_chat(user, "[src] can only hold organic body parts!")
+ return
+ else if(isbodypart(I))
+ var/obj/item/bodypart/BP = I
+ if(BP.status != BODYPART_ORGANIC)
+ to_chat(user, "[src] can only hold organic body parts!")
+ return
+ else
+ return
+
+ user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].")
+ icon_state = "evidence"
+ var/xx = I.pixel_x
+ var/yy = I.pixel_y
+ I.pixel_x = 0
+ I.pixel_y = 0
+ var/image/img = image("icon"=I, "layer"=FLOAT_LAYER)
+ img.plane = FLOAT_PLANE
+ I.pixel_x = xx
+ I.pixel_y = yy
+ add_overlay(img)
+ add_overlay("evidence")
+ desc = "An organ storage container holding [I]."
+ I.loc = src
+ w_class = I.w_class
+
+/obj/item/weapon/organ_storage/attack_self(mob/user)
+ if(contents.len)
+ var/obj/item/I = contents[1]
+ user.visible_message("[user] dumps [I] from [src].", "You dump [I] from [src].")
+ cut_overlays()
+ I.forceMove(get_turf(src))
+ icon_state = "evidenceobj"
+ desc = "A container for holding body parts."
+ else
+ to_chat(user, "[src] is empty.")
+ return
\ No newline at end of file
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 62d0a032d95..d80a8e21b3c 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \
- This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition."
+ This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition."
item = /obj/item/weapon/gun/ballistic/automatic/l6_saw
cost = 18
surplus = 0
@@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun/basic
- name = "5.56x45mm Box Magazine"
- desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \
+ name = "1.95x129mm Box Magazine"
+ desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
By the time you need to use this, you'll already be on a pile of corpses."
- item = /obj/item/ammo_box/magazine/mm556x45
+ item = /obj/item/ammo_box/magazine/mm195x129
/datum/uplink_item/ammo/machinegun/bleeding
- name = "5.56x45mm (Bleeding) Box Magazine"
- desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
+ name = "1.95x129mm (Bleeding) Box Magazine"
+ desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
to induce internal bleeding on targets."
- item = /obj/item/ammo_box/magazine/mm556x45/bleeding
+ item = /obj/item/ammo_box/magazine/mm195x129/bleeding
/datum/uplink_item/ammo/machinegun/hollow
- name = "5.56x45mm (Hollow-Point) Box Magazine"
- desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
+ name = "1.95x129mm (Hollow-Point) Box Magazine"
+ desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
with the unarmored masses of crew."
- item = /obj/item/ammo_box/magazine/mm556x45/hollow
+ item = /obj/item/ammo_box/magazine/mm195x129/hollow
/datum/uplink_item/ammo/machinegun/ap
- name = "5.56x45mm (Armor Penetrating) Box Magazine"
- desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
+ name = "1.95x129mm (Armor Penetrating) Box Magazine"
+ desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
to puncture even the most durable armor."
- item = /obj/item/ammo_box/magazine/mm556x45/ap
+ item = /obj/item/ammo_box/magazine/mm195x129/ap
/datum/uplink_item/ammo/machinegun/incen
- name = "5.56x45mm (Incendiary) Box Magazine"
- desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \
+ name = "1.95x129mm (Incendiary) Box Magazine"
+ desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
- item = /obj/item/ammo_box/magazine/mm556x45/incen
+ item = /obj/item/ammo_box/magazine/mm195x129/incen
/datum/uplink_item/ammo/sniper
cost = 4
@@ -1100,6 +1100,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
// Implants
/datum/uplink_item/implants
category = "Implants"
+ surplus = 50
/datum/uplink_item/implants/freedom
name = "Freedom Implant"
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 1bdbd3fa45c..1b93a4f6857 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -46,7 +46,8 @@
var/obj/item/organ/zombie_infection/infection
infection = target.getorganslot("zombie_infection")
if(!infection)
- infection = new(target)
+ infection = new()
+ infection.Insert(target)
/obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user)
if(target.stat == DEAD)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index f254ef6337e..3515da0dc66 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -5,7 +5,7 @@
slot = "zombie_infection"
icon_state = "blacktumor"
origin_tech = "biotech=5"
- var/datum/species/old_species
+ var/datum/species/old_species = /datum/species/human
var/living_transformation_time = 3
var/converts_living = FALSE
@@ -63,6 +63,7 @@
if(!iszombie(owner))
old_species = owner.dna.species.type
+ owner.set_species(/datum/species/zombie/infectious)
if(!converts_living && owner.stat != DEAD)
return
@@ -70,7 +71,6 @@
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
owner.grab_ghost()
- owner.set_species(/datum/species/zombie/infectious)
owner.revive(full_heal = TRUE)
owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!")
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
diff --git a/code/world.dm b/code/world.dm
index 547ce53efc0..03508e64102 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -121,7 +121,7 @@
s["map_name"] = SSmapping.config.map_name
- if(key_valid && SSticker && SSticker.mode)
+ if(key_valid && SSticker.HasRoundStarted())
s["real_mode"] = SSticker.mode.name
// Key-authed callers may know the truth behind the "secret"
@@ -141,11 +141,7 @@
if(!key_valid)
return "Bad Key"
else
-#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
- for(var/client/C in GLOB.clients)
- if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
- to_chat(C, "PR: [input["announce"]]")
-#undef CHAT_PULLR
+ AnnouncePR(input["announce"], json_decode(input["payload"]))
else if("crossmessage" in input)
if(!key_valid)
@@ -181,7 +177,27 @@
else if("server_hop" in input)
show_server_hop_transfer_screen(input["server_hop"])
+#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
+ //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+
+/world/proc/AnnouncePR(announcement, list/payload)
+ var/static/list/PRcounts = list() //PR id -> number of times announced this round
+ var/id = "[payload["pull_request"]["id"]]"
+ if(!PRcounts[id])
+ PRcounts[id] = 1
+ else
+ ++PRcounts[id]
+ if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
+ return
+
+#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
+ for(var/client/C in GLOB.clients)
+ if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
+ C << "PR: [announcement]"
+#undef CHAT_PULLR
+
#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
if (usr)
@@ -322,4 +338,4 @@
status = s
/world/proc/has_round_started()
- return SSticker.HasRoundStarted()
\ No newline at end of file
+ return SSticker.HasRoundStarted()
diff --git a/config/game_options.txt b/config/game_options.txt
index 8b4a583edd8..e519e9fa8c3 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -78,7 +78,7 @@ ALERT_DELTA Destruction of the station is imminent. All crew are instructed to o
PROBABILITY TRAITOR 5
PROBABILITY TRAITORCHAN 4
-PROBABILITY DOUBLE_AGENTS 3
+PROBABILITY INTERNAL_AFFAIRS 3
PROBABILITY NUCLEAR 2
PROBABILITY REVOLUTION 2
PROBABILITY GANG 2
diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt
index 56f65f6c24c..f56db22fd95 100644
--- a/config/spaceruinblacklist.txt
+++ b/config/spaceruinblacklist.txt
@@ -18,6 +18,7 @@
#_maps/RandomRuins/SpaceRuins/derelict6.dmm
#_maps/RandomRuins/SpaceRuins/spacebar.dmm
#_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
+#_maps/RandomRuins/SpaceRuins/deepstorage.dmm
#_maps/RandomRuins/SpaceRuins/emptyshell.dmm
#_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
#_maps/RandomRuins/SpaceRuins/intactemptyship.dmm
diff --git a/html/changelog.html b/html/changelog.html
index 6d5c4f64805..8598ff603df 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,10 +55,162 @@
-->
+
02 May 2017
+
4dplanner updated:
+
+ - Squishy plants will now affect walls and other turfs they get squished on
+
+
Kor, Goof and Plizzard updated:
+
+ - Adds persistent trophy cases. They are not on any map yet.
+
+
Shadowlight213 updated:
+
+ - The biogenerator will now show its recipes again.
+
+
+
01 May 2017
+
4dplanner updated:
+
+ - Syndicate surplus crates now contain fewer implants
+
+
Bawhoppen updated:
+
+ - Deep storage space ruin has been readded.
+ - Space Cola machines now stock bottles of water.
+
+
Cobby updated:
+
+ - The Gang pen is now stealthy. Stab away!
+
+
Cyberboss updated:
+
+ - You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends
+
+
Joan updated:
+
+ - Belligerent now prevents you from running for 7 seconds after every chant.
+ - However, you no longer remain walking after Belligerent's effect fades.
+ - Clockcult component generation will automatically focus on components needed to activate the Ark if it exists.
+ - Gaining Vanguard, such as from the Linked Vanguard scripture, will remove existing stuns.
+ - Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second.
+ - Sigils of Transmission can be charged with brass at a rate of 250W per sheet.
+
+
Moonlighting Mac says updated:
+
+ - Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients from Lavaland.
+ - After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm.
+
+
QualityVan updated:
+
+ - Saline glucose now acts as temporary blood instead of increasing blood regeneration
+
+
Swindly updated:
+
+ - Mercury and Lithium make people move when not in space instead of when in space.
+
+
ninjanomnom updated:
+
+ - TEG displays power in kw or MW now
+ - TEG power bar only maxes over 1MW now
+ - Moves TEG to SSair
+ - Moves SM to SSair
+
+
+
30 April 2017
+
QualityVan updated:
+
+ - Changelings can once again revive with their brain missing
+
+
XDTM updated:
+
+ - Voice of God's Rest command now no longer makes listeners rest. It instead activates the sleep command.
+
+
coiax updated:
+
+ - The Bank Machine in the vault now uses the radio to announce unauthorized withdrawals, rather than an endless stream of loud announcements.
+
+
+
29 April 2017
+
BeeSting12 updated:
+
+ - The emergency backup shuttle has lighting now.
+ - Plating in deltastation's aux tool storage is no longer checkered.
+
+
Cobby updated:
+
+ - Syndicate Lavabase now has more explicit instructions when it comes to outing non-syndicate affiliated enemies of Nanotrasen.
+ - The GPS set tag has gone from a limit of 5 characters to 20.
+ - The GPS can now be personalized in both name and description using a pen.
+
+
Joan updated:
+
+ - Removed Mending Motor.
+ - Added Mending Mantra, which is a script that causes you to repair nearby constructs and structures as long as you continue chanting it.
+ - Mending Mantra will also heal Servants as long as they're wearing clockwork armor.
+
+
Kor updated:
+
+ - Removed double agents mode.
+ - Replaced it with Internal Affairs mode.
+
+
Swindly updated:
+
+ - Added organ storage bags for medical cyborgs. They can hold an organic body part. Use the bag on a carbon during organ manipulation or prosthetic replacement to add the held body part.
+
+
coiax updated:
+
+ - Swarmer traps are no longer summoned by The Traps.
+ - Wizard traps automatically disappear five minutes after being summoned.
+ - Wizard traps disappear after firing, whether triggered via person or something being thrown across it.
+ - Wizards are immune to their own traps.
+ - The Traps are now marked as a Defensive spell, rather than an Offensive spell.
+
+
kevinz000 updated:
+
+ - Songs can now be added to disco machines with add_track(file, name, length, beat). Only file is required, the other 3 should still be put in, though.
+
+
tacolizard forever updated:
+
+ - Rechargers no longer flash the 'fully charged' animation before charging something
+
+
+
28 April 2017
+
Kor updated:
+
+ - Librarians can speak any language
+
+
coiax, WJohnston updated:
+
+ - Languages no longer colour their text.
+ - Languages now have icons to identify them. Galatic Common does not have an icon if understood.
+
+
27 April 2017
+
Gun Hog updated:
+
+ - The GPS interface has been converted to tgui.
+ - GPS now update automatically or manually, give distance and direction to a signal, and many other improvements!
+
MrStonedOne updated:
- Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted.
+ - Server hop verb moved to the OOC tab
+ - Server hop verb can now be used in the lobby as well as while a ghost.
+
+
QualityVan updated:
+
+ - You can hit emagged cloning pods with a medical ID to empty them
+ - Crayons can be ground
+ - Crayon powder can be used to color stuff
+
+
Shadowlight213 updated:
+
+ - Heads of staff may now download the ID card modification program from NTNet.
+
+
bgobandit updated:
+
+ - When jumpsuits take severe damage, their suit sensors break. They can be fixed by applying a cable coil.
coiax updated:
@@ -1144,111 +1296,6 @@
- Lobby music is no longer delayed
-
- 28 February 2017
- Cyberboss updated:
-
- - You will no longer be shown empty memories when the game starts
- - Built APCs now work again
- - Borg AI cameras now work again
-
- Joan updated:
-
- - Anima Fragments now slam into non-Servants when bumping. This will ONLY happen if the fragment is not slowed, and slamming into someone will slightly damage the fragment and slow it severely.
-
- Lzimann updated:
-
- - Communications console can also check the ID the user is wearing.
-
- Supermichael777 updated:
-
- - The button now has a five second delay when detonating bombs
-
- XDTM updated:
-
- - You can now change the input/output directons for Ore Redemption Machines by using a multitool on them with the panel open.
- - Diagnostic HUDs can now see if airlocks are shocked.
-
-
- 27 February 2017
- Kor, Jordie0608 and Tokiko1 updated:
-
- - Singularity containment has been replaced on box, meta, and delta with a supermatter room. The supermatter gives ample warning when melting down, so hopefully we'll see fewer 15 minute rounds ended by a loose singularity.
- - Supermatter crystals now collapse into singularities when they fail, rather than explode.
-
- Tofa01 updated:
-
- - Stops AI And Borgs From Interfacing With Ferry Console
-
- TrustyGun updated:
-
- - Box sprites are improved.
-
- WJohnston updated:
-
- - New and improved BRPED beam. The old one was hideous.
-
- coiax updated:
-
- - Drone shells are now points of interest in the orbit list.
- - Derelict drone shells now spawn with appropriate headgear.
-
-
- 26 February 2017
- Ausops updated:
-
- - New sprites for water, fuel and hydroponics tanks.
-
- Joan updated:
-
- - Clockwork objects are overall easier to deconstruct:
- - Clockwork Walls now take 33% less time to slice through, Brass Windows now work like non-reinforced windows, and Pinion Airlocks now have less health and only two steps to decon(wrench, then crowbar).
- - EMPing Pinion Airlocks and Brass Windoors now has a high chance to open them and will not shock or bolt them.
- - Anima fragments will very gradually self-repair.
-
- Tofa01 updated:
-
- - [Omega] Fixes ORM input and output directions
- - Fixes space bar kitchen freezer access level
- - Fixes giving IDs proper access for players who spawn on a ruin via a player sleeper/spawners
- - [Delta] Fixes varedited tiles causing tiles to appear as if they have no texture
- - Fixes robotic limb repair grammar issue
-
-
- 25 February 2017
- AnonymousNow updated:
-
- - Nerd Co. has sent pairs of thicker prescription glasses out to Nanotrasen stations, for your local geek to wear.
-
- Basilman updated:
-
- Robustin updated:
-
- - Hulks can no longer use pneumatic cannons or flamethrowers
-
- Tofa01 updated:
-
- - [All Maps] The new and improved Centcom transportation ferry version 2.0 is out now!
-
- coiax updated:
-
- - Cargo can now order plastic sheets to make plastic flaps. No doubt other uses for plastic will be discovered in the future.
- - To deconstruct plastic flaps, unscrew from the floor, then cut apart with wirecutters. Plastic flaps have examine tips like reinforced walls.
-
- uraniummeltdown updated:
-
- - Science crates now have new sprites
-
-
- 24 February 2017
- MrStonedOne updated:
-
- - Limit on Mining Satchel of Holding Removed
- - Dumping/mass pickup/mass transfer of items is now lag checked
- - Dumping/mass pickup/mass transfer of items has a progress bar
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index aa69c93cd89..bad0d33dceb 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -10697,12 +10697,128 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
flashdim:
- bugfix: Omega Station had two APCs not wired properly. (#26526)
2017-04-27:
+ Gun Hog:
+ - rscadd: The GPS interface has been converted to tgui.
+ - experiment: GPS now update automatically or manually, give distance and direction
+ to a signal, and many other improvements!
MrStonedOne:
- tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes
and provide better logging for things that cause lag when hard-deleted.
+ - tweak: Server hop verb moved to the OOC tab
+ - rscadd: Server hop verb can now be used in the lobby as well as while a ghost.
+ QualityVan:
+ - bugfix: You can hit emagged cloning pods with a medical ID to empty them
+ - rscadd: Crayons can be ground
+ - rscadd: Crayon powder can be used to color stuff
+ Shadowlight213:
+ - tweak: Heads of staff may now download the ID card modification program from NTNet.
+ bgobandit:
+ - tweak: When jumpsuits take severe damage, their suit sensors break. They can be
+ fixed by applying a cable coil.
coiax:
- rscadd: Anomalous crystals can be examined by ghosts to determine their function
and activation method.
- rscdel: Lightbringers can understand Slime and Galactic Common, and can only speak
Slime, as before.
- rscadd: The helper anomalous crystal is in the orbit list after it has been activated.
+2017-04-28:
+ Kor:
+ - rscadd: Librarians can speak any language
+ coiax, WJohnston:
+ - rscdel: Languages no longer colour their text.
+ - rscadd: Languages now have icons to identify them. Galatic Common does not have
+ an icon if understood.
+2017-04-29:
+ BeeSting12:
+ - bugfix: The emergency backup shuttle has lighting now.
+ - bugfix: Plating in deltastation's aux tool storage is no longer checkered.
+ Cobby:
+ - rscadd: Syndicate Lavabase now has more explicit instructions when it comes to
+ outing non-syndicate affiliated enemies of Nanotrasen.
+ - tweak: The GPS set tag has gone from a limit of 5 characters to 20.
+ - rscadd: The GPS can now be personalized in both name and description using a pen.
+ Joan:
+ - rscdel: Removed Mending Motor.
+ - rscadd: Added Mending Mantra, which is a script that causes you to repair nearby
+ constructs and structures as long as you continue chanting it.
+ - tweak: Mending Mantra will also heal Servants as long as they're wearing clockwork
+ armor.
+ Kor:
+ - rscdel: Removed double agents mode.
+ - rscadd: Replaced it with Internal Affairs mode.
+ Swindly:
+ - rscadd: Added organ storage bags for medical cyborgs. They can hold an organic
+ body part. Use the bag on a carbon during organ manipulation or prosthetic replacement
+ to add the held body part.
+ coiax:
+ - rscdel: Swarmer traps are no longer summoned by The Traps.
+ - balance: Wizard traps automatically disappear five minutes after being summoned.
+ - balance: Wizard traps disappear after firing, whether triggered via person or
+ something being thrown across it.
+ - balance: Wizards are immune to their own traps.
+ - tweak: The Traps are now marked as a Defensive spell, rather than an Offensive
+ spell.
+ kevinz000:
+ - experiment: Songs can now be added to disco machines with add_track(file, name,
+ length, beat). Only file is required, the other 3 should still be put in, though.
+ tacolizard forever:
+ - bugfix: Rechargers no longer flash the 'fully charged' animation before charging
+ something
+2017-04-30:
+ QualityVan:
+ - bugfix: Changelings can once again revive with their brain missing
+ XDTM:
+ - rscdel: Voice of God's Rest command now no longer makes listeners rest. It instead
+ activates the sleep command.
+ coiax:
+ - rscadd: The Bank Machine in the vault now uses the radio to announce unauthorized
+ withdrawals, rather than an endless stream of loud announcements.
+2017-05-01:
+ 4dplanner:
+ - tweak: Syndicate surplus crates now contain fewer implants
+ Bawhoppen:
+ - rscadd: Deep storage space ruin has been readded.
+ - rscadd: Space Cola machines now stock bottles of water.
+ Cobby:
+ - balance: The Gang pen is now stealthy. Stab away!
+ Cyberboss:
+ - rscadd: You can now make holocalls! Simply stand on a pad, bring up the menu,
+ and select the holopad you wish to call. Remain still until someone answers.
+ When they do, you'll be able to act just like an AI hologram until the call
+ ends
+ Joan:
+ - rscadd: Belligerent now prevents you from running for 7 seconds after every chant.
+ - rscdel: However, you no longer remain walking after Belligerent's effect fades.
+ - rscadd: Clockcult component generation will automatically focus on components
+ needed to activate the Ark if it exists.
+ - rscadd: Gaining Vanguard, such as from the Linked Vanguard scripture, will remove
+ existing stuns.
+ - rscadd: Proselytizers can now charge from Sigils of Transmission at a rate of
+ 1000W per second.
+ - rscadd: Sigils of Transmission can be charged with brass at a rate of 250W per
+ sheet.
+ Moonlighting Mac says:
+ - bugfix: Due to a clerical error in the chef's cookbooks now being resolved, you
+ can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients
+ from Lavaland.
+ - experiment: After being found again you will now be able to enjoy its special
+ blend of flavors with your tastebuds. Mmm.
+ QualityVan:
+ - tweak: Saline glucose now acts as temporary blood instead of increasing blood
+ regeneration
+ Swindly:
+ - tweak: Mercury and Lithium make people move when not in space instead of when
+ in space.
+ ninjanomnom:
+ - tweak: TEG displays power in kw or MW now
+ - tweak: TEG power bar only maxes over 1MW now
+ - experiment: Moves TEG to SSair
+ - experiment: Moves SM to SSair
+2017-05-02:
+ 4dplanner:
+ - bugfix: Squishy plants will now affect walls and other turfs they get squished
+ on
+ Kor, Goof and Plizzard:
+ - rscadd: Adds persistent trophy cases. They are not on any map yet.
+ Shadowlight213:
+ - bugfix: The biogenerator will now show its recipes again.
diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi
new file mode 100644
index 00000000000..e961c351912
Binary files /dev/null and b/icons/misc/language.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 84e1f1c1da0..988ae8bdc83 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 49779ffd365..b49ee2d81d5 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 5858925d86c..46666cdd5fc 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_construct.dmi b/icons/mob/screen_construct.dmi
new file mode 100644
index 00000000000..82dbe19cf65
Binary files /dev/null and b/icons/mob/screen_construct.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 6067b02ad32..69f6c087111 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index c0af32afea9..c4713bd0868 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index 38c47790fc1..aa4a6fc2995 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index fde1c0ea140..253738064ba 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -78,29 +78,13 @@ Admin:
mob.hotkey_help()
if(holder)
- src << adminhotkeys
+ to_chat(src, adminhotkeys)
/client/verb/changelog()
set name = "Changelog"
set category = "OOC"
- getFiles(
- 'html/88x31.png',
- 'html/bug-minus.png',
- 'html/cross-circle.png',
- 'html/hard-hat-exclamation.png',
- 'html/image-minus.png',
- 'html/image-plus.png',
- 'html/music-minus.png',
- 'html/music-plus.png',
- 'html/tick-circle.png',
- 'html/wrench-screwdriver.png',
- 'html/spell-check.png',
- 'html/burn-exclamation.png',
- 'html/chevron.png',
- 'html/chevron-expand.png',
- 'html/changelog.css',
- 'html/changelog.html'
- )
+ var/datum/asset/changelog = get_asset_datum(/datum/asset/simple/changelog)
+ changelog.send(src)
src << browse('html/changelog.html', "window=changes;size=675x650")
if(prefs.lastchangelog != GLOB.changelog_hash)
prefs.lastchangelog = GLOB.changelog_hash
@@ -165,8 +149,8 @@ Any-Mode: (hotkey doesn't need to be on)
\tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth)
"}
- src << hotkey_mode
- src << other
+ to_chat(src, hotkey_mode)
+ to_chat(src, other)
/mob/living/silicon/robot/hotkey_help()
//h = talk-wheel has a nonsense tag in it because \th is an escape sequence in BYOND.
@@ -217,8 +201,8 @@ Any-Mode: (hotkey doesn't need to be on)
\tPGDN = activate held object
"}
- src << hotkey_mode
- src << other
+ to_chat(src, hotkey_mode)
+ to_chat(src, other)
// Needed to circumvent a bug where .winset does not work when used on the window.on-size event in skins.
// Used by /datum/html_interface/nanotrasen (code/modules/html_interface/nanotrasen/nanotrasen.dm)
diff --git a/config/names/adjectives.txt b/strings/names/adjectives.txt
similarity index 88%
rename from config/names/adjectives.txt
rename to strings/names/adjectives.txt
index bca89bc5a25..fe9b28d4314 100644
--- a/config/names/adjectives.txt
+++ b/strings/names/adjectives.txt
@@ -1,375 +1,375 @@
-abundant
-adorable
-adventurous
-aggressive
-agreeable
-alert
-alive
-amused
-ancient
-angry
-annoyed
-annoying
-anxious
-arrogant
-ashamed
-attractive
-average
-awful
-bad
-beautiful
-better
-bewildered
-big
-bitter
-black
-bloody
-blue
-blue-eyed
-blushing
-boiling
-bored
-brainy
-brave
-breakable
-breezy
-brief
-bright
-broad
-broken
-bumpy
-busy
-calm
-careful
-cautious
-charming
-cheerful
-chilly
-chubby
-clean
-clear
-clever
-cloudy
-clumsy
-cold
-colorful
-colossal
-combative
-comfortable
-concerned
-condemned
-confused
-cooing
-cool
-cooperative
-courageous
-crazy
-crazy flipped-out
-creepy
-crooked
-crowded
-cruel
-cuddly
-curious
-curly
-curved
-cute
-damaged
-damp
-dangerous
-dark
-dead
-deafening
-deep
-defeated
-defiant
-delicious
-delightful
-depressed
-determined
-different
-difficult
-dirty
-disgusted
-distinct
-disturbed
-dizzy
-doubtful
-drab
-dry
-dull
-dusty
-eager
-early
-easy
-elated
-elegant
-embarrassed
-empty
-enchanting
-encouraging
-energetic
-enthusiastic
-envious
-evil
-excited
-expensive
-exuberant
-faint
-fair
-faithful
-famous
-fancy
-fantastic
-fast
-fat
-few
-fierce
-filthy
-fine
-flaky
-flat
-fluffy
-fluttering
-foolish
-fragile
-frail
-frantic
-freezing
-fresh
-friendly
-frightened
-funny
-fuzzy
-gentle
-gifted
-gigantic
-glamorous
-gleaming
-glorious
-good
-gorgeous
-graceful
-greasy
-great
-grieving
-grotesque
-grubby
-grumpy
-handsome
-happy
-hard
-harsh
-healthy
-heavy
-helpful
-helpless
-high
-high-pitched
-hilarious
-hissing
-hollow
-homeless
-homely
-horrible
-hot
-huge
-hungry
-hurt
-hushed
-husky
-icy
-ill
-immense
-important
-impossible
-inexpensive
-innocent
-inquisitive
-itchy
-jealous
-jittery
-jolly
-joyous
-juicy
-kind
-large
-late
-lazy
-light
-little
-lively
-lonely
-long
-loose
-loud
-lovely
-low
-lucky
-magnificent
-mammoth
-many
-massive
-melodic
-melted
-miniature
-misty
-moaning
-modern
-motionless
-muddy
-mushy
-mute
-mysterious
-narrow
-nasty
-naughty
-nervous
-nice
-noisy
-numerous
-nutritious
-nutty
-obedient
-obnoxious
-odd
-old
-old-fashioned
-open
-outrageous
-outstanding
-panicky
-perfect
-petite
-plain
-plastic
-pleasant
-poised
-poor
-powerful
-precious
-prickly
-proud
-puny
-purring
-puzzled
-quaint
-quick
-quiet
-rainy
-rapid
-raspy
-real
-relieved
-repulsive
-resonant
-rich
-ripe
-rotten
-rough
-round
-salty
-scary
-scattered
-scrawny
-screeching
-selfish
-shaggy
-shaky
-shallow
-sharp
-shiny
-shivering
-short
-shrill
-shy
-silent
-silky
-silly
-skinny
-sleepy
-slimy
-slippery
-slow
-small
-smiling
-smoggy
-smooth
-soft
-solid
-sore
-sour
-sparkling
-spicy
-splendid
-spotless
-square
-squealing
-stale
-steady
-steep
-sticky
-stormy
-straight
-strange
-strong
-stupid
-substantial
-successful
-super
-sweet
-swift
-talented
-tall
-tame
-tart
-Taste/Touch
-tasteless
-tasty
-teeny
-teeny-tiny
-tender
-tense
-terrible
-testy
-thankful
-thirsty
-thoughtful
-thoughtless
-thundering
-tight
-tiny
-tired
-tough
-troubled
-ugliest
-ugly
-uneven
-uninterested
-unsightly
-unusual
-upset
-uptight
-vast
-victorious
-vivacious
-voiceless
-wandering
-warm
-weak
-weary
-wet
-whispering
-wicked
-wide
-wide-eyed
-wild
-witty
-wonderful
-wooden
-worried
-wrong
-young
-yummy
-zany
+abundant
+adorable
+adventurous
+aggressive
+agreeable
+alert
+alive
+amused
+ancient
+angry
+annoyed
+annoying
+anxious
+arrogant
+ashamed
+attractive
+average
+awful
+bad
+beautiful
+better
+bewildered
+big
+bitter
+black
+bloody
+blue
+blue-eyed
+blushing
+boiling
+bored
+brainy
+brave
+breakable
+breezy
+brief
+bright
+broad
+broken
+bumpy
+busy
+calm
+careful
+cautious
+charming
+cheerful
+chilly
+chubby
+clean
+clear
+clever
+cloudy
+clumsy
+cold
+colorful
+colossal
+combative
+comfortable
+concerned
+condemned
+confused
+cooing
+cool
+cooperative
+courageous
+crazy
+crazy flipped-out
+creepy
+crooked
+crowded
+cruel
+cuddly
+curious
+curly
+curved
+cute
+damaged
+damp
+dangerous
+dark
+dead
+deafening
+deep
+defeated
+defiant
+delicious
+delightful
+depressed
+determined
+different
+difficult
+dirty
+disgusted
+distinct
+disturbed
+dizzy
+doubtful
+drab
+dry
+dull
+dusty
+eager
+early
+easy
+elated
+elegant
+embarrassed
+empty
+enchanting
+encouraging
+energetic
+enthusiastic
+envious
+evil
+excited
+expensive
+exuberant
+faint
+fair
+faithful
+famous
+fancy
+fantastic
+fast
+fat
+few
+fierce
+filthy
+fine
+flaky
+flat
+fluffy
+fluttering
+foolish
+fragile
+frail
+frantic
+freezing
+fresh
+friendly
+frightened
+funny
+fuzzy
+gentle
+gifted
+gigantic
+glamorous
+gleaming
+glorious
+good
+gorgeous
+graceful
+greasy
+great
+grieving
+grotesque
+grubby
+grumpy
+handsome
+happy
+hard
+harsh
+healthy
+heavy
+helpful
+helpless
+high
+high-pitched
+hilarious
+hissing
+hollow
+homeless
+homely
+horrible
+hot
+huge
+hungry
+hurt
+hushed
+husky
+icy
+ill
+immense
+important
+impossible
+inexpensive
+innocent
+inquisitive
+itchy
+jealous
+jittery
+jolly
+joyous
+juicy
+kind
+large
+late
+lazy
+light
+little
+lively
+lonely
+long
+loose
+loud
+lovely
+low
+lucky
+magnificent
+mammoth
+many
+massive
+melodic
+melted
+miniature
+misty
+moaning
+modern
+motionless
+muddy
+mushy
+mute
+mysterious
+narrow
+nasty
+naughty
+nervous
+nice
+noisy
+numerous
+nutritious
+nutty
+obedient
+obnoxious
+odd
+old
+old-fashioned
+open
+outrageous
+outstanding
+panicky
+perfect
+petite
+plain
+plastic
+pleasant
+poised
+poor
+powerful
+precious
+prickly
+proud
+puny
+purring
+puzzled
+quaint
+quick
+quiet
+rainy
+rapid
+raspy
+real
+relieved
+repulsive
+resonant
+rich
+ripe
+rotten
+rough
+round
+salty
+scary
+scattered
+scrawny
+screeching
+selfish
+shaggy
+shaky
+shallow
+sharp
+shiny
+shivering
+short
+shrill
+shy
+silent
+silky
+silly
+skinny
+sleepy
+slimy
+slippery
+slow
+small
+smiling
+smoggy
+smooth
+soft
+solid
+sore
+sour
+sparkling
+spicy
+splendid
+spotless
+square
+squealing
+stale
+steady
+steep
+sticky
+stormy
+straight
+strange
+strong
+stupid
+substantial
+successful
+super
+sweet
+swift
+talented
+tall
+tame
+tart
+Taste/Touch
+tasteless
+tasty
+teeny
+teeny-tiny
+tender
+tense
+terrible
+testy
+thankful
+thirsty
+thoughtful
+thoughtless
+thundering
+tight
+tiny
+tired
+tough
+troubled
+ugliest
+ugly
+uneven
+uninterested
+unsightly
+unusual
+upset
+uptight
+vast
+victorious
+vivacious
+voiceless
+wandering
+warm
+weak
+weary
+wet
+whispering
+wicked
+wide
+wide-eyed
+wild
+witty
+wonderful
+wooden
+worried
+wrong
+young
+yummy
+zany
zealous
\ No newline at end of file
diff --git a/config/names/ai.txt b/strings/names/ai.txt
similarity index 88%
rename from config/names/ai.txt
rename to strings/names/ai.txt
index 4104337d2cd..2ea5e18fc00 100644
--- a/config/names/ai.txt
+++ b/strings/names/ai.txt
@@ -1,146 +1,146 @@
-1-Rover-1
-16-20
-7-Zark-7
-790
-Adaptive Manipulator
-Allied Mastercomputer
-Alpha 5
-Alpha 6
-Alpha 7
-AM
-AMEE
-AmigoBot
-Android
-Aniel
-Asimov
-ASTAR
-Astor
-B O B
-B-4
-B-9
-B166ER
-Bender
-Bishop
-Blitz
-Box
-Brackenridge
-C-3PO
-Cassandra One
-Cell
-Chii
-Chip
-Computer
-Conky 2000
-Cutie
-Data
-Decimus
-Dee Model
-Deep Thought
-Dor-15
-Dorfl
-Dot Matrix
-Duey
-E D I
-E-Man
-ED-209
-Emma-2
-Erasmus
-Ez-27
-Fagor
-Faith
-Fi
-FRIEND COMPUTER
-Frost
-Fum
-Futura
-G2
-George
-Gnut
-Gort
-H A R L I E
-H E L P eR
-H E R B I E
-Hadaly
-HAL 9000
-Huey
-Irona
-Ironhide
-Jay-Dub
-Jinx
-Johnny 5
-K-9
-KITT
-Klapaucius
-Kryten 2X4B-523P
-L-76
-L-Ron
-Louie
-LUH 3417
-Maria
-MARK13
-Marvin
-Master Control Program
-Max 404
-Maximillian
-Mechagodzilla
-Mechani-Kong
-Megatron
-Metalhead
-Mr R I N G
-Mugsy3000
-NCH
-Necron-99
-Norby
-OMM 0910
-Optimus
-Orange v 3 5
-Project 2501
-PTO
-R I C 2 0
-R2-D2
-R4-P17
-Revelation
-Ro-Man
-Robbie
-Robot Devil
-S A M
-S H O C K
-S H R O U D
-S O P H I E
-SEN 5241
-Setaur
-SHODAN
-Shrike
-SID 6 7
-Solo
-Soundwave
-Speedy
-Super 17
-Surgeon General Kraken
-T-1000
-T-800
-T-850
-Terminus
-THX 1138
-Tidy
-Tik-Tok
-Tobor
-Trurl
-TWA
-ULTRABOT
-Ulysses
-Uniblab
-V I N CENT
-Voltes V
-W1k1
-Wikipedia
-Windows 3 1
-X-5
-XERXES
-XR
-Yod
-Z-1
-Z-2
-Z-3
-Zed
+1-Rover-1
+16-20
+7-Zark-7
+790
+Adaptive Manipulator
+Allied Mastercomputer
+Alpha 5
+Alpha 6
+Alpha 7
+AM
+AMEE
+AmigoBot
+Android
+Aniel
+Asimov
+ASTAR
+Astor
+B O B
+B-4
+B-9
+B166ER
+Bender
+Bishop
+Blitz
+Box
+Brackenridge
+C-3PO
+Cassandra One
+Cell
+Chii
+Chip
+Computer
+Conky 2000
+Cutie
+Data
+Decimus
+Dee Model
+Deep Thought
+Dor-15
+Dorfl
+Dot Matrix
+Duey
+E D I
+E-Man
+ED-209
+Emma-2
+Erasmus
+Ez-27
+Fagor
+Faith
+Fi
+FRIEND COMPUTER
+Frost
+Fum
+Futura
+G2
+George
+Gnut
+Gort
+H A R L I E
+H E L P eR
+H E R B I E
+Hadaly
+HAL 9000
+Huey
+Irona
+Ironhide
+Jay-Dub
+Jinx
+Johnny 5
+K-9
+KITT
+Klapaucius
+Kryten 2X4B-523P
+L-76
+L-Ron
+Louie
+LUH 3417
+Maria
+MARK13
+Marvin
+Master Control Program
+Max 404
+Maximillian
+Mechagodzilla
+Mechani-Kong
+Megatron
+Metalhead
+Mr R I N G
+Mugsy3000
+NCH
+Necron-99
+Norby
+OMM 0910
+Optimus
+Orange v 3 5
+Project 2501
+PTO
+R I C 2 0
+R2-D2
+R4-P17
+Revelation
+Ro-Man
+Robbie
+Robot Devil
+S A M
+S H O C K
+S H R O U D
+S O P H I E
+SEN 5241
+Setaur
+SHODAN
+Shrike
+SID 6 7
+Solo
+Soundwave
+Speedy
+Super 17
+Surgeon General Kraken
+T-1000
+T-800
+T-850
+Terminus
+THX 1138
+Tidy
+Tik-Tok
+Tobor
+Trurl
+TWA
+ULTRABOT
+Ulysses
+Uniblab
+V I N CENT
+Voltes V
+W1k1
+Wikipedia
+Windows 3 1
+X-5
+XERXES
+XR
+Yod
+Z-1
+Z-2
+Z-3
+Zed
Zord
\ No newline at end of file
diff --git a/config/names/carp.txt b/strings/names/carp.txt
similarity index 91%
rename from config/names/carp.txt
rename to strings/names/carp.txt
index 223106992bf..4b10aa65f74 100644
--- a/config/names/carp.txt
+++ b/strings/names/carp.txt
@@ -1,30 +1,30 @@
-Lungfish
-Blackfish
-Alligator
-Icefish
-Armorhead
-Hammerhead
-Anaconda
-Flathead
-Manta Ray
-Sting Ray
-Fangtooth Moray
-Goblin Shark
-Grass Carp
-Round River Bat Ray
-Noodlefish
-Hagfish
-Man o’ War
-Ladyfish
-Black Eel
-Baby Seal
-Sprat
-Koi
-Electric Eel
-Lamprey
-Pejeray
-Yellow-edged Moray
-Salmon Shark
-Sleeper Shark
-Featherback
-Eagle Ray
+Lungfish
+Blackfish
+Alligator
+Icefish
+Armorhead
+Hammerhead
+Anaconda
+Flathead
+Manta Ray
+Sting Ray
+Fangtooth Moray
+Goblin Shark
+Grass Carp
+Round River Bat Ray
+Noodlefish
+Hagfish
+Man o’ War
+Ladyfish
+Black Eel
+Baby Seal
+Sprat
+Koi
+Electric Eel
+Lamprey
+Pejeray
+Yellow-edged Moray
+Salmon Shark
+Sleeper Shark
+Featherback
+Eagle Ray
diff --git a/config/names/clown.txt b/strings/names/clown.txt
similarity index 89%
rename from config/names/clown.txt
rename to strings/names/clown.txt
index b47cd9de105..8eec0990d0b 100644
--- a/config/names/clown.txt
+++ b/strings/names/clown.txt
@@ -1,37 +1,37 @@
-Baby Cakes
-Bo Bo Sassy
-Bonker
-Bubble
-Buster Frown
-Button
-Candy
-Checkers
-Dinky Doodle
-Flop O'Honker
-Freckle
-Giggles
-Gigglesworth
-Goose McSunny
-Honkel the III
-Honker
-Honkerbelle
-Jingle
-Jo Jo Bobo Bo
-Ladybug Honks
-Miss Stockings
-Mr Shoe
-Patches
-Pepinpop
-Pocket
-Razzle Dazzle
-Redshirt McBeat
-Ronnie Pace
-Scootaloo
-Silly Willy
-Skiddle
-Slippy Joe
-Sparkle
-Speckles
-Sprinkledinkle
-Toodles Sharperton
+Baby Cakes
+Bo Bo Sassy
+Bonker
+Bubble
+Buster Frown
+Button
+Candy
+Checkers
+Dinky Doodle
+Flop O'Honker
+Freckle
+Giggles
+Gigglesworth
+Goose McSunny
+Honkel the III
+Honker
+Honkerbelle
+Jingle
+Jo Jo Bobo Bo
+Ladybug Honks
+Miss Stockings
+Mr Shoe
+Patches
+Pepinpop
+Pocket
+Razzle Dazzle
+Redshirt McBeat
+Ronnie Pace
+Scootaloo
+Silly Willy
+Skiddle
+Slippy Joe
+Sparkle
+Speckles
+Sprinkledinkle
+Toodles Sharperton
Ziggy Yoyo
\ No newline at end of file
diff --git a/config/names/death_commando.txt b/strings/names/death_commando.txt
similarity index 93%
rename from config/names/death_commando.txt
rename to strings/names/death_commando.txt
index 226b074037e..01259acf8cb 100644
--- a/config/names/death_commando.txt
+++ b/strings/names/death_commando.txt
@@ -1,70 +1,70 @@
-A whole bunch of spiders in a SWAT suit
-Al "Otta" Gore
-AMERICA
-Beat Punchbeef
-Blast Hardcheese
-Blast Thickneck
-Bob Johnson
-Bold Bigflank
-Bolt Vanderhuge
-Brick Hardmeat
-Buck Plankchest
-Buff Drinklots
-Buff Hardback
-Butch Deadlift
-Crud Bonemeal
-Crunch Buttsteak
-Crush McStompbones
-Dirk Hardpeck
-Duke Killington
-Evil Bob Marley
-Evil Martin Luther King
-Fist Rockbone
-Flint Ironstag
-Fridge Largemeat
-George Melons
-Gibbs McLargehuge
-GORE Vidal
-Gristle McThornBody
-Hank Chesthair
-Hans Testosteroneson
-Killiam Shakespeare
-Killing McKillingalot
-Lance Killiam
-Leonardo Da Viking
-Lump Beefrock
-Mancrush McBrorape
-Max Pain
-Maximilian Murderface
-Maxx Power
-Noam Bombsky
-Pack Blowfist
-Punch Rockgroin
-Punch Sideiron
-Punt Speedchunk
-Reef Blastbody
-Rex Dudekiller VII
-Rip Sidecheek
-Rip Steakface
-Roll Fizzlebeef
-Sarah Pain
-Seamus McTosterone
-Sgt Slaughter
-Sir Killaslot
-Slab Bulkhead
-Slab Squatthrust
-Slake Fistcrunch
-Slate Slabrock
-Smash Lampjaw
-Smoke Manmuscle
-Splint Chesthair
-Stabby McGee
-Stump Beefgnaw
-Stump Chunkman
-THAT DAMN FAGGOT TRAITOR GEORGE MELONS
-Theodore Pain
-Thick McRunfast
-Toolboxl Rose
-Touch Rustrod
-Trunk Slamchest
+A whole bunch of spiders in a SWAT suit
+Al "Otta" Gore
+AMERICA
+Beat Punchbeef
+Blast Hardcheese
+Blast Thickneck
+Bob Johnson
+Bold Bigflank
+Bolt Vanderhuge
+Brick Hardmeat
+Buck Plankchest
+Buff Drinklots
+Buff Hardback
+Butch Deadlift
+Crud Bonemeal
+Crunch Buttsteak
+Crush McStompbones
+Dirk Hardpeck
+Duke Killington
+Evil Bob Marley
+Evil Martin Luther King
+Fist Rockbone
+Flint Ironstag
+Fridge Largemeat
+George Melons
+Gibbs McLargehuge
+GORE Vidal
+Gristle McThornBody
+Hank Chesthair
+Hans Testosteroneson
+Killiam Shakespeare
+Killing McKillingalot
+Lance Killiam
+Leonardo Da Viking
+Lump Beefrock
+Mancrush McBrorape
+Max Pain
+Maximilian Murderface
+Maxx Power
+Noam Bombsky
+Pack Blowfist
+Punch Rockgroin
+Punch Sideiron
+Punt Speedchunk
+Reef Blastbody
+Rex Dudekiller VII
+Rip Sidecheek
+Rip Steakface
+Roll Fizzlebeef
+Sarah Pain
+Seamus McTosterone
+Sgt Slaughter
+Sir Killaslot
+Slab Bulkhead
+Slab Squatthrust
+Slake Fistcrunch
+Slate Slabrock
+Smash Lampjaw
+Smoke Manmuscle
+Splint Chesthair
+Stabby McGee
+Stump Beefgnaw
+Stump Chunkman
+THAT DAMN FAGGOT TRAITOR GEORGE MELONS
+Theodore Pain
+Thick McRunfast
+Toolboxl Rose
+Touch Rustrod
+Trunk Slamchest
Zombie Gandhi
\ No newline at end of file
diff --git a/config/names/first.txt b/strings/names/first.txt
similarity index 87%
rename from config/names/first.txt
rename to strings/names/first.txt
index 3f9018adca2..cc99e59d84e 100644
--- a/config/names/first.txt
+++ b/strings/names/first.txt
@@ -1,1396 +1,1396 @@
-Aaden
-Aaliyah
-Aaron
-Abby
-Abel
-Abigail
-Abraham
-Adam
-Adan
-Addison
-Addyson
-Adeline
-Aden
-Adolph
-Adrian
-Adriana
-Adrianna
-Aida
-Aidan
-Aiden
-Aileen
-Ainsley
-Alaina
-Alan
-Alana
-Alanna
-Alayna
-Albert
-Alberto
-Alden
-Alec
-Alejandra
-Alejandro
-Alessandra
-Alex
-Alexa
-Alexander
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfred
-Alfreda
-Alfredo
-Alger
-Ali
-Alice
-Alicia
-Alijah
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allen
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alvin
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amir
-Amira
-Amiyah
-Amos
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Anderson
-Andre
-Andrea
-Andres
-Andrew
-Andy
-Angel
-Angela
-Angelica
-Angelina
-Angelo
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anthony
-Antonio
-Anya
-April
-Arabella
-Archie
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Armando
-Arn
-Art
-Arthur
-Arturo
-Asher
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Ashton
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-August
-Aurora
-Austin
-Autumn
-Ava
-Avalon
-Averill
-Avery
-Axel
-Ayden
-Ayla
-Bailey
-Baldric
-Barbra
-Bartholomew
-Baylee
-Beau
-Beckah
-Beckett
-Becky
-Bella
-Benjamin
-Bennett
-Bernice
-Bertrand
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Breanna
-Breanne
-Brenda
-Brendan
-Brenden
-Brenna
-Brennan
-Brett
-Brian
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brock
-Brodie
-Brody
-Bronte
-Brooke
-Brooklyn
-Brooklynn
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Brynn
-Bryson
-Burt
-Byrne
-Byron
-Bysshe
-Cade
-Caden
-Cadence
-Caiden
-Caitlin
-Caitlyn
-Calanthia
-Caleb
-Caleigh
-Cali
-Callie
-Calvin
-Camden
-Cameron
-Camila
-Camille
-Camron
-Camryn
-Candace
-Candice
-Candis
-Canute
-Cara
-Carl
-Carlos
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Carson
-Carter
-Caryl
-Casey
-Cash
-Casimir
-Cassandra
-Cassian
-Cassidy
-Catherine
-Cayden
-Cecilia
-Cecily
-Celeste
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlotte
-Charlton
-Chase
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chip
-Chloe
-Chris
-Christa
-Christian
-Christiana
-Christina
-Christobel
-Christopher
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Clark
-Claudia
-Claudius
-Clayton
-Clement
-Cleveland
-Cliff
-Clinton
-Clitus
-Clover
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Cora
-Corbin
-Coreen
-Corey
-Corrine
-Cory
-Courtney
-Cristian
-Cristopher
-Cruz
-Crystal
-Curtis
-Cy
-Cynthia
-Daisy
-Dakota
-Dallas
-Dalton
-Dalya
-Damian
-Damien
-Damon
-Dana
-Dane
-Danica
-Daniel
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Danny
-Dante
-Darcey
-Darell
-Daria
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayana
-Dayna
-Dayton
-Dean
-Deandre
-Deangelo
-Debbi
-Declan
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denholm
-Denise
-Dennis
-Denys
-Derek
-Derrick
-Desiree
-Desmond
-Destiny
-Devin
-Devon
-Diamond
-Diana
-Diego
-Dillon
-Dina
-Dolores
-Dominic
-Dominick
-Donald
-Donella
-Donna
-Donny
-Donovan
-Dorian
-Dorothy
-Dortha
-Douglas
-Drake
-Drew
-Driscoll
-Dulce
-Duncan
-Dustin
-Dylan
-Easter
-Easton
-Ebba
-Eddie
-Eden
-Edgar
-Eduardo
-Edward
-Edwin
-Effie
-Elaina
-Eleanor
-Elena
-Eli
-Eliana
-Elias
-Elijah
-Eliot
-Eliott
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Elliot
-Elliott
-Elric
-Elspet
-Elwood
-Emanuel
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emiliano
-Emilio
-Emily
-Emma
-Emmanuel
-Enrique
-Eric
-Erica
-Erick
-Erik
-Erika
-Erin
-Ermintrude
-Ernesto
-Esmeralda
-Esteban
-Esther
-Estrella
-Ethan
-Eugenia
-Euphemia
-Eustace
-Eva
-Evan
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Everett
-Ezekiel
-Ezra
-Fabian
-Faith
-Fatima
-Fay
-Felix
-Fernanda
-Fernando
-Finn
-Fiona
-Fitz
-Flick
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fulton
-Gabriel
-Gabriela
-Gabriella
-Gabrielle
-Gael
-Gage
-Garret
-Garrett
-Gary
-Gavin
-Gaye
-Gaylord
-Genesis
-Genette
-Genevieve
-George
-Georgene
-Georgia
-Geraldine
-Gerardo
-Gervase
-Gianna
-Gina
-Ginger
-Giovanni
-Giselle
-Gladwyn
-Glenna
-Gloria
-Goddard
-Godwin
-Goodwin
-Gordon
-Grace
-Gracie
-Grady
-Graeme
-Graham
-Grant
-Gratian
-Grayson
-Gregory
-Greta
-Greyson
-Griffin
-Griselda
-Guadalupe
-Guillermo
-Gunner
-Gustavo
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Happy
-Harley
-Harmony
-Harper
-Harrison
-Hartley
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hector
-Hedley
-Heidi
-Helen
-Henderson
-Henry
-Hepsie
-Hervey
-Holden
-Holly
-Homer
-Hope
-Horatio
-Hortensia
-Hudson
-Huffie
-Hugo
-Hunter
-Ian
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Irvine
-Isaac
-Isabel
-Isabella
-Isabelle
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Itzel
-Ivan
-Ivy
-Izabella
-Izaiah
-Jacaline
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadon
-Jadyn
-Jaelyn
-Jaiden
-Jaime
-Jake
-Jakki
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Jane
-Janel
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jared
-Jaslene
-Jasmin
-Jasmine
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayda
-Jayden
-Jaydon
-Jaye
-Jayla
-Jaylee
-Jaylen
-Jayne
-Jaynie
-Jayson
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeremiah
-Jeremy
-Jeri
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jessica
-Jesus
-Jillian
-Jillie
-Jim
-Jimena
-Jimmy
-Joachim
-Joanna
-Joaquin
-Jocelyn
-Joe
-Joel
-Joetta
-Joey
-Johan
-Johanna
-John
-Johnathan
-Johnny
-Joi
-Jonah
-Jonas
-Jonathan
-Jonathon
-Joni
-Jordan
-Jordyn
-Jorge
-Jose
-Joselyn
-Joseph
-Josepha
-Josephine
-Josh
-Joshua
-Josiah
-Josie
-Josue
-Joye
-Juan
-Judah
-Jude
-Julia
-Julian
-Juliana
-Julianna
-Julie
-Juliet
-Julio
-Julissa
-Julius
-July
-Justice
-Justin
-Kade
-Kaden
-Kadence
-Kaelea
-Kaelyn
-Kai
-Kaiden
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kale
-Kaleb
-Kaleigh
-Kameron
-Kamryn
-Kane
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karson
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keagan
-Keaton
-Keegan
-Keira
-Keith
-Kellen
-Kellie
-Kelly
-Kelsey
-Kelvin
-Kendall
-Kendra
-Kennard
-Kennedy
-Kenneth
-Kenzie
-Kerena
-Kerensa
-Keturah
-Kevin
-Keziah
-Khalil
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kingston
-Kira
-Kobe
-Kolton
-Kristen
-Kristina
-Kristopher
-Kyla
-Kyle
-Kylee
-Kyleigh
-Kyler
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Lance
-Landen
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Latanya
-Launce
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Lawrence
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Leland
-Lena
-Lennox
-Leo
-Leonardo
-Leonel
-Leroi
-Leslie
-Lesly
-Lessie
-Leta
-Levi
-Lexi
-Lexia
-Lexus
-Lia
-Liam
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lincoln
-Linden
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Linton
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lorenzo
-Loreto
-Lori
-Lorin
-Lou
-Louis
-Luanne
-Luca
-Lucas
-Lucia
-Lucian
-Lucy
-Luis
-Lukas
-Luke
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Maddox
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malachi
-Malcolm
-Malia
-Malik
-Mallory
-Manley
-Manuel
-Marc
-Marcia
-Marco
-Marcos
-Marcus
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Mario
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Mark
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Martin
-Marvin
-Mary
-Maryann
-Mason
-Mateo
-Mathew
-Matthew
-Maudie
-Maurene
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-May
-Maya
-Maynard
-Mckenna
-Mckenzie
-Megan
-Meghan
-Mekhi
-Melanie
-Melany
-Melissa
-Melody
-Melvin
-Melvyn
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Micah
-Michael
-Michaela
-Micheal
-Michelle
-Miguel
-Mikayla
-Mike
-Miles
-Miley
-Milo
-Milton
-Minnie
-Miracle
-Miranda
-Miriam
-Mitchell
-Moises
-Molly
-Monica
-Monna
-Montague
-Monte
-Monty
-Morgan
-Moses
-Muriel
-Mya
-Mylee
-Myles
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Nasir
-Natalia
-Natalie
-Nataly
-Natasha
-Nathan
-Nathaniel
-Nayeli
-Nehemiah
-Nelle
-Nelson
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicholas
-Nickolas
-Nicolas
-Nicole
-Nikolas
-Nina
-Noah
-Noel
-Noelle
-Nolan
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Oliver
-Olivia
-Omar
-Oralie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Owen
-Pablo
-Paget
-Paige
-Paisley
-Paola
-Paris
-Parker
-Patience
-Patricia
-Patrick
-Patton
-Paul
-Pauleen
-Paxton
-Payton
-Pedro
-Pene
-Penelope
-Percival
-Peregrine
-Perla
-Peter
-Peyton
-Pheobe
-Philip
-Phillip
-Phoebe
-Phoenix
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Porter
-Presley
-Preston
-Priscilla
-Prosper
-Prue
-Quanah
-Quentin
-Quiana
-Quinn
-Quinton
-Rachael
-Rachel
-Raegan
-Raelene
-Rafael
-Rain
-Ramon
-Randa
-Randal
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reece
-Reed
-Reene
-Reese
-Reid
-Renie
-Reuben
-Rexana
-Reynard
-Rhetta
-Ricardo
-Rich
-Richard
-Richie
-Rick
-Rickena
-Rickey
-Rickie
-Ricky
-Rihanna
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Ronnette
-Rosa
-Roscoe
-Rose
-Rosemary
-Roswell
-Rowan
-Roy
-Royce
-Ruben
-Ruby
-Rubye
-Russell
-Rusty
-Ruth
-Ryan
-Ryder
-Ryker
-Rylan
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sal
-Sally
-Salvador
-Sam
-Samantha
-Samara
-Samuel
-Sandra
-Santiago
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Saul
-Savanna
-Savannah
-Sawyer
-Scarlett
-Scott
-Scotty
-Sean
-Sebastian
-Selena
-Seneca
-Serena
-Serenity
-Sergio
-Seth
-Seymour
-Shan
-Shana
-Shane
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shaun
-Shawn
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Shiloh
-Sienna
-Sierra
-Silas
-Simon
-Sissy
-Skylar
-Skyler
-Sloan
-Sofia
-Solomon
-Sophia
-Sophie
-Sorrel
-Spencer
-Spike
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Stephen
-Steven
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sybil
-Syd
-Sydney
-Talia
-Talon
-Tamika
-Tamsin
-Tania
-Tanner
-Tansy
-Taryn
-Tate
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tel
-Terrell
-Terry
-Tessa
-Theodore
-Thomas
-Tiffany
-Timothy
-Titus
-Tod
-Tolly
-Tony
-Topaz
-Tori
-Tracee
-Tracey
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trinity
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Ulyssa
-Uriel
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Vaughn
-Verna
-Veronica
-Victor
-Victoria
-Vince
-Vincent
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wendi
-Wendy
-Wesley
-Weston
-Whitaker
-William
-Willow
-Willy
-Winifred
-Wisdom
-Woodrow
-Woody
-Wyatt
-Wynonna
-Wynter
-Xander
-Xavier
-Ximena
-Yahir
-Yasmin
-Yolanda
-Ysabel
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
-Zelda
-Zion
-Zoe
-Zoey
+Aaden
+Aaliyah
+Aaron
+Abby
+Abel
+Abigail
+Abraham
+Adam
+Adan
+Addison
+Addyson
+Adeline
+Aden
+Adolph
+Adrian
+Adriana
+Adrianna
+Aida
+Aidan
+Aiden
+Aileen
+Ainsley
+Alaina
+Alan
+Alana
+Alanna
+Alayna
+Albert
+Alberto
+Alden
+Alec
+Alejandra
+Alejandro
+Alessandra
+Alex
+Alexa
+Alexander
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfred
+Alfreda
+Alfredo
+Alger
+Ali
+Alice
+Alicia
+Alijah
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allen
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alvin
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amir
+Amira
+Amiyah
+Amos
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Anderson
+Andre
+Andrea
+Andres
+Andrew
+Andy
+Angel
+Angela
+Angelica
+Angelina
+Angelo
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anthony
+Antonio
+Anya
+April
+Arabella
+Archie
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Armando
+Arn
+Art
+Arthur
+Arturo
+Asher
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Ashton
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+August
+Aurora
+Austin
+Autumn
+Ava
+Avalon
+Averill
+Avery
+Axel
+Ayden
+Ayla
+Bailey
+Baldric
+Barbra
+Bartholomew
+Baylee
+Beau
+Beckah
+Beckett
+Becky
+Bella
+Benjamin
+Bennett
+Bernice
+Bertrand
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Breanna
+Breanne
+Brenda
+Brendan
+Brenden
+Brenna
+Brennan
+Brett
+Brian
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brock
+Brodie
+Brody
+Bronte
+Brooke
+Brooklyn
+Brooklynn
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Brynn
+Bryson
+Burt
+Byrne
+Byron
+Bysshe
+Cade
+Caden
+Cadence
+Caiden
+Caitlin
+Caitlyn
+Calanthia
+Caleb
+Caleigh
+Cali
+Callie
+Calvin
+Camden
+Cameron
+Camila
+Camille
+Camron
+Camryn
+Candace
+Candice
+Candis
+Canute
+Cara
+Carl
+Carlos
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Carson
+Carter
+Caryl
+Casey
+Cash
+Casimir
+Cassandra
+Cassian
+Cassidy
+Catherine
+Cayden
+Cecilia
+Cecily
+Celeste
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlotte
+Charlton
+Chase
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chip
+Chloe
+Chris
+Christa
+Christian
+Christiana
+Christina
+Christobel
+Christopher
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Clark
+Claudia
+Claudius
+Clayton
+Clement
+Cleveland
+Cliff
+Clinton
+Clitus
+Clover
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Cora
+Corbin
+Coreen
+Corey
+Corrine
+Cory
+Courtney
+Cristian
+Cristopher
+Cruz
+Crystal
+Curtis
+Cy
+Cynthia
+Daisy
+Dakota
+Dallas
+Dalton
+Dalya
+Damian
+Damien
+Damon
+Dana
+Dane
+Danica
+Daniel
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Danny
+Dante
+Darcey
+Darell
+Daria
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayana
+Dayna
+Dayton
+Dean
+Deandre
+Deangelo
+Debbi
+Declan
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denholm
+Denise
+Dennis
+Denys
+Derek
+Derrick
+Desiree
+Desmond
+Destiny
+Devin
+Devon
+Diamond
+Diana
+Diego
+Dillon
+Dina
+Dolores
+Dominic
+Dominick
+Donald
+Donella
+Donna
+Donny
+Donovan
+Dorian
+Dorothy
+Dortha
+Douglas
+Drake
+Drew
+Driscoll
+Dulce
+Duncan
+Dustin
+Dylan
+Easter
+Easton
+Ebba
+Eddie
+Eden
+Edgar
+Eduardo
+Edward
+Edwin
+Effie
+Elaina
+Eleanor
+Elena
+Eli
+Eliana
+Elias
+Elijah
+Eliot
+Eliott
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Elliot
+Elliott
+Elric
+Elspet
+Elwood
+Emanuel
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emiliano
+Emilio
+Emily
+Emma
+Emmanuel
+Enrique
+Eric
+Erica
+Erick
+Erik
+Erika
+Erin
+Ermintrude
+Ernesto
+Esmeralda
+Esteban
+Esther
+Estrella
+Ethan
+Eugenia
+Euphemia
+Eustace
+Eva
+Evan
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Everett
+Ezekiel
+Ezra
+Fabian
+Faith
+Fatima
+Fay
+Felix
+Fernanda
+Fernando
+Finn
+Fiona
+Fitz
+Flick
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fulton
+Gabriel
+Gabriela
+Gabriella
+Gabrielle
+Gael
+Gage
+Garret
+Garrett
+Gary
+Gavin
+Gaye
+Gaylord
+Genesis
+Genette
+Genevieve
+George
+Georgene
+Georgia
+Geraldine
+Gerardo
+Gervase
+Gianna
+Gina
+Ginger
+Giovanni
+Giselle
+Gladwyn
+Glenna
+Gloria
+Goddard
+Godwin
+Goodwin
+Gordon
+Grace
+Gracie
+Grady
+Graeme
+Graham
+Grant
+Gratian
+Grayson
+Gregory
+Greta
+Greyson
+Griffin
+Griselda
+Guadalupe
+Guillermo
+Gunner
+Gustavo
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Happy
+Harley
+Harmony
+Harper
+Harrison
+Hartley
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hector
+Hedley
+Heidi
+Helen
+Henderson
+Henry
+Hepsie
+Hervey
+Holden
+Holly
+Homer
+Hope
+Horatio
+Hortensia
+Hudson
+Huffie
+Hugo
+Hunter
+Ian
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Irvine
+Isaac
+Isabel
+Isabella
+Isabelle
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Itzel
+Ivan
+Ivy
+Izabella
+Izaiah
+Jacaline
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadon
+Jadyn
+Jaelyn
+Jaiden
+Jaime
+Jake
+Jakki
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Jane
+Janel
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jared
+Jaslene
+Jasmin
+Jasmine
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayda
+Jayden
+Jaydon
+Jaye
+Jayla
+Jaylee
+Jaylen
+Jayne
+Jaynie
+Jayson
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeremiah
+Jeremy
+Jeri
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jessica
+Jesus
+Jillian
+Jillie
+Jim
+Jimena
+Jimmy
+Joachim
+Joanna
+Joaquin
+Jocelyn
+Joe
+Joel
+Joetta
+Joey
+Johan
+Johanna
+John
+Johnathan
+Johnny
+Joi
+Jonah
+Jonas
+Jonathan
+Jonathon
+Joni
+Jordan
+Jordyn
+Jorge
+Jose
+Joselyn
+Joseph
+Josepha
+Josephine
+Josh
+Joshua
+Josiah
+Josie
+Josue
+Joye
+Juan
+Judah
+Jude
+Julia
+Julian
+Juliana
+Julianna
+Julie
+Juliet
+Julio
+Julissa
+Julius
+July
+Justice
+Justin
+Kade
+Kaden
+Kadence
+Kaelea
+Kaelyn
+Kai
+Kaiden
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kale
+Kaleb
+Kaleigh
+Kameron
+Kamryn
+Kane
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karson
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keagan
+Keaton
+Keegan
+Keira
+Keith
+Kellen
+Kellie
+Kelly
+Kelsey
+Kelvin
+Kendall
+Kendra
+Kennard
+Kennedy
+Kenneth
+Kenzie
+Kerena
+Kerensa
+Keturah
+Kevin
+Keziah
+Khalil
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kingston
+Kira
+Kobe
+Kolton
+Kristen
+Kristina
+Kristopher
+Kyla
+Kyle
+Kylee
+Kyleigh
+Kyler
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Lance
+Landen
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Latanya
+Launce
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Lawrence
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Leland
+Lena
+Lennox
+Leo
+Leonardo
+Leonel
+Leroi
+Leslie
+Lesly
+Lessie
+Leta
+Levi
+Lexi
+Lexia
+Lexus
+Lia
+Liam
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lincoln
+Linden
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Linton
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lorenzo
+Loreto
+Lori
+Lorin
+Lou
+Louis
+Luanne
+Luca
+Lucas
+Lucia
+Lucian
+Lucy
+Luis
+Lukas
+Luke
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Maddox
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malachi
+Malcolm
+Malia
+Malik
+Mallory
+Manley
+Manuel
+Marc
+Marcia
+Marco
+Marcos
+Marcus
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Mario
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Mark
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Martin
+Marvin
+Mary
+Maryann
+Mason
+Mateo
+Mathew
+Matthew
+Maudie
+Maurene
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+May
+Maya
+Maynard
+Mckenna
+Mckenzie
+Megan
+Meghan
+Mekhi
+Melanie
+Melany
+Melissa
+Melody
+Melvin
+Melvyn
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Micah
+Michael
+Michaela
+Micheal
+Michelle
+Miguel
+Mikayla
+Mike
+Miles
+Miley
+Milo
+Milton
+Minnie
+Miracle
+Miranda
+Miriam
+Mitchell
+Moises
+Molly
+Monica
+Monna
+Montague
+Monte
+Monty
+Morgan
+Moses
+Muriel
+Mya
+Mylee
+Myles
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Nasir
+Natalia
+Natalie
+Nataly
+Natasha
+Nathan
+Nathaniel
+Nayeli
+Nehemiah
+Nelle
+Nelson
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicholas
+Nickolas
+Nicolas
+Nicole
+Nikolas
+Nina
+Noah
+Noel
+Noelle
+Nolan
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Oliver
+Olivia
+Omar
+Oralie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Owen
+Pablo
+Paget
+Paige
+Paisley
+Paola
+Paris
+Parker
+Patience
+Patricia
+Patrick
+Patton
+Paul
+Pauleen
+Paxton
+Payton
+Pedro
+Pene
+Penelope
+Percival
+Peregrine
+Perla
+Peter
+Peyton
+Pheobe
+Philip
+Phillip
+Phoebe
+Phoenix
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Porter
+Presley
+Preston
+Priscilla
+Prosper
+Prue
+Quanah
+Quentin
+Quiana
+Quinn
+Quinton
+Rachael
+Rachel
+Raegan
+Raelene
+Rafael
+Rain
+Ramon
+Randa
+Randal
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reece
+Reed
+Reene
+Reese
+Reid
+Renie
+Reuben
+Rexana
+Reynard
+Rhetta
+Ricardo
+Rich
+Richard
+Richie
+Rick
+Rickena
+Rickey
+Rickie
+Ricky
+Rihanna
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Ronnette
+Rosa
+Roscoe
+Rose
+Rosemary
+Roswell
+Rowan
+Roy
+Royce
+Ruben
+Ruby
+Rubye
+Russell
+Rusty
+Ruth
+Ryan
+Ryder
+Ryker
+Rylan
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sal
+Sally
+Salvador
+Sam
+Samantha
+Samara
+Samuel
+Sandra
+Santiago
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Saul
+Savanna
+Savannah
+Sawyer
+Scarlett
+Scott
+Scotty
+Sean
+Sebastian
+Selena
+Seneca
+Serena
+Serenity
+Sergio
+Seth
+Seymour
+Shan
+Shana
+Shane
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shaun
+Shawn
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Shiloh
+Sienna
+Sierra
+Silas
+Simon
+Sissy
+Skylar
+Skyler
+Sloan
+Sofia
+Solomon
+Sophia
+Sophie
+Sorrel
+Spencer
+Spike
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Stephen
+Steven
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sybil
+Syd
+Sydney
+Talia
+Talon
+Tamika
+Tamsin
+Tania
+Tanner
+Tansy
+Taryn
+Tate
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tel
+Terrell
+Terry
+Tessa
+Theodore
+Thomas
+Tiffany
+Timothy
+Titus
+Tod
+Tolly
+Tony
+Topaz
+Tori
+Tracee
+Tracey
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trinity
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Ulyssa
+Uriel
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Vaughn
+Verna
+Veronica
+Victor
+Victoria
+Vince
+Vincent
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wendi
+Wendy
+Wesley
+Weston
+Whitaker
+William
+Willow
+Willy
+Winifred
+Wisdom
+Woodrow
+Woody
+Wyatt
+Wynonna
+Wynter
+Xander
+Xavier
+Ximena
+Yahir
+Yasmin
+Yolanda
+Ysabel
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
+Zelda
+Zion
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/config/names/first_female.txt b/strings/names/first_female.txt
similarity index 87%
rename from config/names/first_female.txt
rename to strings/names/first_female.txt
index 038e9368792..6710c1bfc32 100644
--- a/config/names/first_female.txt
+++ b/strings/names/first_female.txt
@@ -1,771 +1,771 @@
-Aaliyah
-Abby
-Abigail
-Addison
-Addyson
-Adeline
-Adriana
-Adrianna
-Aida
-Aileen
-Ainsley
-Alaina
-Alana
-Alanna
-Alayna
-Alejandra
-Alessandra
-Alexa
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfreda
-Alice
-Alicia
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amira
-Amiyah
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Andrea
-Angel
-Angela
-Angelica
-Angelina
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anya
-April
-Arabella
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-Aurora
-Autumn
-Ava
-Avalona
-Averill
-Avery
-Ayla
-Bailey
-Barbara
-Baylee
-Beckah
-Becky
-Bella
-Bernice
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Breanna
-Breanne
-Brenda
-Brenna
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brooke
-Brooklyn
-Brooklynn
-Brynn
-Cadence
-Caitlin
-Caitlyn
-Calanthia
-Caleigh
-Cali
-Callie
-Cameron
-Camila
-Camille
-Camryn
-Candace
-Candice
-Cara
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Caryl
-Casey
-Cassandra
-Cassidy
-Catherine
-Cecilia
-Cecily
-Celeste
-Charlotte
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chloe
-Christa
-Christiana
-Christina
-Christobelle
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Claudia
-Clover
-Cora
-Coreen
-Corrine
-Courtney
-Crystal
-Cynthia
-Daisy
-Dakota
-Dalya
-Dana
-Danica
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Daria
-Dayana
-Dayna
-Debbi
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denise
-Denys
-Desiree
-Destiny
-Diamond
-Diana
-Dina
-Dolores
-Donella
-Donna
-Dorothy
-Dortha
-Dulce
-Easter
-Ebba
-Eden
-Effie
-Elaina
-Eleanor
-Elena
-Eliana
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emily
-Emma
-Erica
-Erika
-Erin
-Ermintrude
-Esmeralda
-Esther
-Estrella
-Eugenia
-Euphemia
-Eustace
-Eva
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Faith
-Fatima
-Fay
-Fernanda
-Fiona
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Gabriela
-Gabriella
-Gabrielle
-Genette
-Genevieve
-Georgene
-Georgia
-Geraldine
-Gervase
-Gianna
-Gina
-Ginger
-Giselle
-Gladwyn
-Glenna
-Gloria
-Grace
-Gracie
-Greta
-Griselda
-Guadalupe
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Harley
-Harmony
-Harper
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hedley
-Heidi
-Helen
-Hepsie
-Holly
-Hope
-Hortensia
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Isabel
-Isabella
-Isabelle
-Itzel
-Ivy
-Izabella
-Jacaline
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadyn
-Jaelyn
-Jakki
-Jalen
-Jamie
-Jane
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jaslene
-Jasmin
-Jasmine
-Jayda
-Jayden
-Jayla
-Jaylee
-Jaynie
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeri
-Jessica
-Jillian
-Jillie
-Jimena
-Joanna
-Jocelyn
-Joetta
-Johanna
-Joi
-Joni
-Jordan
-Jordyn
-Joselyn
-Josepha
-Josephine
-Josie
-Joye
-Julia
-Juliana
-Julianna
-Julie
-Juliet
-Julissa
-July
-Kadence
-Kaelea
-Kaelyn
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kaleigh
-Kamryn
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keegan
-Keira
-Keith
-Kellie
-Kelly
-Kelsey
-Kendall
-Kendra
-Kennedy
-Kenzie
-Kerena
-Kerensa
-Keturah
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kira
-Kristen
-Kristina
-Kyla
-Kylee
-Kyleigh
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Latanya
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Lena
-Leslie
-Lesly
-Lessie
-Leta
-Lexi
-Lexia
-Lexus
-Lia
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lori
-Lorin
-Luanne
-Lucia
-Lucian
-Lucy
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malia
-Mallory
-Marcia
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Mary
-Maryann
-Maudie
-Maurene
-May
-Maya
-Mckenna
-Mckenzie
-Megan
-Meghan
-Melanie
-Melany
-Melissa
-Melody
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Michaela
-Michelle
-Mikayla
-Miley
-Minnie
-Miracle
-Miranda
-Miriam
-Molly
-Monica
-Monna
-Morgan
-Muriel
-Mya
-Mylee
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Natalia
-Natalie
-Nataly
-Natasha
-Nayeli
-Nelle
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicole
-Nina
-Noelle
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Olivia
-Oralie
-Paige
-Paisley
-Paola
-Paris
-Patience
-Patricia
-Pauleen
-Payton
-Pene
-Penelope
-Peregrine
-Perla
-Peyton
-Pheobe
-Phoebe
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Presley
-Priscilla
-Prosper
-Prue
-Quanah
-Quiana
-Rachael
-Rachel
-Raegan
-Raelene
-Rain
-Randa
-Randal
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reene
-Reese
-Renie
-Rexana
-Rhetta
-Rihanna
-Riley
-Ronnette
-Rosa
-Rose
-Rosemary
-Rowan
-Ruby
-Rubye
-Ruth
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sally
-Samantha
-Samara
-Sandra
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Savanna
-Savannah
-Scarlett
-Selena
-Seneca
-Serena
-Serenity
-Shana
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Sienna
-Sierra
-Sissy
-Skylar
-Skyler
-Sofia
-Sophia
-Sophie
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sydney
-Talia
-Tamika
-Tania
-Tansy
-Taryn
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tessa
-Tiffany
-Tolly
-Topaz
-Tori
-Tracee
-Tracey
-Trinity
-Ulyssa
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Verna
-Veronica
-Victoria
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Wendi
-Wendy
-Willow
-Wisdom
-Wynonna
-Wynter
-Ximena
-Yasmin
-Yolanda
-Ysabel
-Zelda
-Zoe
-Zoey
+Aaliyah
+Abby
+Abigail
+Addison
+Addyson
+Adeline
+Adriana
+Adrianna
+Aida
+Aileen
+Ainsley
+Alaina
+Alana
+Alanna
+Alayna
+Alejandra
+Alessandra
+Alexa
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfreda
+Alice
+Alicia
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amira
+Amiyah
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Andrea
+Angel
+Angela
+Angelica
+Angelina
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anya
+April
+Arabella
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+Aurora
+Autumn
+Ava
+Avalona
+Averill
+Avery
+Ayla
+Bailey
+Barbara
+Baylee
+Beckah
+Becky
+Bella
+Bernice
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Breanna
+Breanne
+Brenda
+Brenna
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brooke
+Brooklyn
+Brooklynn
+Brynn
+Cadence
+Caitlin
+Caitlyn
+Calanthia
+Caleigh
+Cali
+Callie
+Cameron
+Camila
+Camille
+Camryn
+Candace
+Candice
+Cara
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Caryl
+Casey
+Cassandra
+Cassidy
+Catherine
+Cecilia
+Cecily
+Celeste
+Charlotte
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chloe
+Christa
+Christiana
+Christina
+Christobelle
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Claudia
+Clover
+Cora
+Coreen
+Corrine
+Courtney
+Crystal
+Cynthia
+Daisy
+Dakota
+Dalya
+Dana
+Danica
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Daria
+Dayana
+Dayna
+Debbi
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denise
+Denys
+Desiree
+Destiny
+Diamond
+Diana
+Dina
+Dolores
+Donella
+Donna
+Dorothy
+Dortha
+Dulce
+Easter
+Ebba
+Eden
+Effie
+Elaina
+Eleanor
+Elena
+Eliana
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emily
+Emma
+Erica
+Erika
+Erin
+Ermintrude
+Esmeralda
+Esther
+Estrella
+Eugenia
+Euphemia
+Eustace
+Eva
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Faith
+Fatima
+Fay
+Fernanda
+Fiona
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Gabriela
+Gabriella
+Gabrielle
+Genette
+Genevieve
+Georgene
+Georgia
+Geraldine
+Gervase
+Gianna
+Gina
+Ginger
+Giselle
+Gladwyn
+Glenna
+Gloria
+Grace
+Gracie
+Greta
+Griselda
+Guadalupe
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Harley
+Harmony
+Harper
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hedley
+Heidi
+Helen
+Hepsie
+Holly
+Hope
+Hortensia
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Isabel
+Isabella
+Isabelle
+Itzel
+Ivy
+Izabella
+Jacaline
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadyn
+Jaelyn
+Jakki
+Jalen
+Jamie
+Jane
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jaslene
+Jasmin
+Jasmine
+Jayda
+Jayden
+Jayla
+Jaylee
+Jaynie
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeri
+Jessica
+Jillian
+Jillie
+Jimena
+Joanna
+Jocelyn
+Joetta
+Johanna
+Joi
+Joni
+Jordan
+Jordyn
+Joselyn
+Josepha
+Josephine
+Josie
+Joye
+Julia
+Juliana
+Julianna
+Julie
+Juliet
+Julissa
+July
+Kadence
+Kaelea
+Kaelyn
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kaleigh
+Kamryn
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keegan
+Keira
+Keith
+Kellie
+Kelly
+Kelsey
+Kendall
+Kendra
+Kennedy
+Kenzie
+Kerena
+Kerensa
+Keturah
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kira
+Kristen
+Kristina
+Kyla
+Kylee
+Kyleigh
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Latanya
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Lena
+Leslie
+Lesly
+Lessie
+Leta
+Lexi
+Lexia
+Lexus
+Lia
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lori
+Lorin
+Luanne
+Lucia
+Lucian
+Lucy
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malia
+Mallory
+Marcia
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Mary
+Maryann
+Maudie
+Maurene
+May
+Maya
+Mckenna
+Mckenzie
+Megan
+Meghan
+Melanie
+Melany
+Melissa
+Melody
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Michaela
+Michelle
+Mikayla
+Miley
+Minnie
+Miracle
+Miranda
+Miriam
+Molly
+Monica
+Monna
+Morgan
+Muriel
+Mya
+Mylee
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Natalia
+Natalie
+Nataly
+Natasha
+Nayeli
+Nelle
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicole
+Nina
+Noelle
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Olivia
+Oralie
+Paige
+Paisley
+Paola
+Paris
+Patience
+Patricia
+Pauleen
+Payton
+Pene
+Penelope
+Peregrine
+Perla
+Peyton
+Pheobe
+Phoebe
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Presley
+Priscilla
+Prosper
+Prue
+Quanah
+Quiana
+Rachael
+Rachel
+Raegan
+Raelene
+Rain
+Randa
+Randal
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reene
+Reese
+Renie
+Rexana
+Rhetta
+Rihanna
+Riley
+Ronnette
+Rosa
+Rose
+Rosemary
+Rowan
+Ruby
+Rubye
+Ruth
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sally
+Samantha
+Samara
+Sandra
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Savanna
+Savannah
+Scarlett
+Selena
+Seneca
+Serena
+Serenity
+Shana
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Sienna
+Sierra
+Sissy
+Skylar
+Skyler
+Sofia
+Sophia
+Sophie
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sydney
+Talia
+Tamika
+Tania
+Tansy
+Taryn
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tessa
+Tiffany
+Tolly
+Topaz
+Tori
+Tracee
+Tracey
+Trinity
+Ulyssa
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Verna
+Veronica
+Victoria
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Wendi
+Wendy
+Willow
+Wisdom
+Wynonna
+Wynter
+Ximena
+Yasmin
+Yolanda
+Ysabel
+Zelda
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/config/names/first_male.txt b/strings/names/first_male.txt
similarity index 86%
rename from config/names/first_male.txt
rename to strings/names/first_male.txt
index 928958d1a95..b86722dbafe 100644
--- a/config/names/first_male.txt
+++ b/strings/names/first_male.txt
@@ -1,668 +1,668 @@
-Aaden
-Aaron
-Abel
-Abraham
-Adam
-Adan
-Aden
-Adolph
-Adrian
-Aidan
-Aiden
-Alan
-Albert
-Alberto
-Alden
-Alec
-Alejandro
-Alex
-Alexander
-Alexis
-Alfred
-Alfredo
-Alger
-Ali
-Alijah
-Allen
-Alvin
-Amari
-Amir
-Amos
-Anderson
-Andre
-Andres
-Andrew
-Andy
-Angel
-Angelo
-Anthony
-Antonio
-Apple
-Archie
-Armando
-Arnie
-Art
-Arthur
-Arturo
-Asher
-Ashton
-August
-Austin
-Avery
-Axel
-Ayden
-Baldric
-Bartholomew
-Beau
-Beckett
-Benjamin
-Bennett
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Brendan
-Brenden
-Brennan
-Brett
-Brian
-Brick
-Brock
-Brodie
-Brody
-Bronte
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Bryson
-Buck
-Burt
-Butch
-Byrne
-Byron
-Cade
-Caden
-Caiden
-Caleb
-Calvin
-Camden
-Cameron
-Camron
-Camryn
-Carl
-Carlos
-Carson
-Carter
-Casey
-Cash
-Casimir
-Cassian
-Cayden
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlton
-Chase
-Chip
-Chris
-Christian
-Christopher
-Clark
-Claudius
-Clayton
-Clement
-Cletus
-Cleveland
-Cliff
-Clinton
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Corbin
-Corey
-Cory
-Cristian
-Cristopher
-Crush
-Cruz
-Curtis
-Cy
-Dakota
-Dallas
-Dalton
-Damian
-Damien
-Damon
-Dane
-Daniel
-Danny
-Dante
-Darcey
-Darell
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayton
-Dean
-Deandre
-Deangelo
-Declan
-Denholm
-Dennis
-Derek
-Derrick
-Desmond
-Devin
-Devon
-Diego
-Dillon
-Dirk
-Dominic
-Dominick
-Donald
-Donny
-Donovan
-Douglas
-Drake
-Drew
-Driscoll
-Duke
-Duncan
-Dustin
-Dylan
-Easton
-Eddie
-Edgar
-Eduardo
-Edward
-Edwin
-Eli
-Elias
-Elijah
-Eliot
-Eliott
-Elliot
-Elliott
-Elric
-Elwood
-Emanuel
-Emerson
-Emiliano
-Emilio
-Emmanuel
-Enrique
-Eric
-Erick
-Erik
-Ernesto
-Esteban
-Ethan
-Evan
-Everett
-Ezekiel
-Ezra
-Fabian
-Felix
-Fenton
-Fernando
-Finn
-Fitz
-Flick
-Flint
-Flip
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fridge
-Fulton
-Gabriel
-Gael
-Gage
-Gannon
-Garret
-Garrett
-Gary
-Gavin
-George
-Gerardo
-Giovanni
-Goddard
-Godwin
-Goodwin
-Gordon
-Grady
-Graeme
-Graham
-Grandpa
-Grant
-Gratian
-Grayson
-Gregory
-Grendel
-Greyson
-Griffin
-Guillermo
-Gunner
-Gustavo
-Han
-Harrison
-Harry
-Hartley
-Harvey
-Hayden
-Hector
-Henderson
-Henry
-Holden
-Homer
-Horatio
-Hudson
-Huffie
-Hugo
-Hungry
-Hunter
-Ian
-Irvine
-Isaac
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Ivan
-Izaiah
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jaden
-Jadon
-Jaiden
-Jaime
-Jake
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Janel
-Jared
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayden
-Jaydon
-Jaye
-Jaylen
-Jayne
-Jayson
-Jean-Luc
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jeremiah
-Jeremy
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jesus
-Jim
-Jimmy
-Joachim
-Joaquin
-Joe
-Joel
-Joey
-Johan
-John
-Johnathan
-Johnny
-Jonah
-Jonas
-Jonathan
-Jonathon
-Jordan
-Jorge
-Jose
-Joseph
-Josh
-Joshua
-Josiah
-Josue
-Juan
-Judah
-Jude
-Julian
-Julio
-Julius
-Justice
-Justin
-Kade
-Kaden
-Kai
-Kaiden
-Kale
-Kaleb
-Kameron
-Kane
-Karson
-Kayden
-Keagan
-Keaton
-Keegan
-Keith
-Kellen
-Kelvin
-Kennard
-Kenneth
-Kevin
-Keziah
-Khalil
-Kingston
-Kobe
-Kolton
-Kristopher
-Kyle
-Kyler
-Lance
-Landen
-Lando
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Launce
-Lawrence
-Leland
-Lennox
-Lenny
-Leo
-Leonard
-Leonardo
-Leonel
-Leroy
-Levi
-Liam
-Lief
-Lincoln
-Linden
-Linton
-Logan
-Lorde
-Lorenzo
-Loreto
-Lou
-Louis
-Luca
-Lucas
-Luis
-Lukas
-Luke
-Maddox
-Malachi
-Malcolm
-Malik
-Manley
-Manuel
-Marc
-Marco
-Marcos
-Marcus
-Mario
-Marion
-Mark
-Marshall
-Martin
-Marvin
-Mason
-Mateo
-Mathew
-Matthew
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-Maynard
-Mekhi
-Melvin
-Melvyn
-Micah
-Michael
-Micheal
-Miguel
-Mike
-Miles
-Milo
-Milton
-Mitchell
-Moises
-Montague
-Monte
-Monty
-Morgan
-Moses
-Myles
-Nasir
-Nat
-Nathan
-Nathaniel
-Nehemiah
-Nelson
-Nicholas
-Nick
-Nickolas
-Nicolas
-Nikolas
-Noah
-Noel
-Nolan
-Oliver
-Omar
-Opie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Oswald
-Owen
-Pablo
-Paget
-Parker
-Patrick
-Patton
-Paul
-Paxton
-Payton
-Pedro
-Percival
-Persh
-Peter
-Peyton
-Philip
-Phillip
-Phoenix
-Porter
-Preston
-Quentin
-Quinn
-Quinton
-Rafael
-Ramon
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reece
-Reed
-Reese
-Reid
-Reuben
-Reynard
-Ricardo
-Richard
-Ricky
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Roscoe
-Roswell
-Rowan
-Roy
-Royce
-Rube
-Ruben
-Russell
-Rusty
-Ryan
-Ryder
-Ryker
-Rylan
-Sal
-Salvador
-Sam
-Samuel
-Santiago
-Saul
-Sawyer
-Scott
-Scotty
-Sean
-Sebastian
-Sergio
-Seth
-Seymour
-Shane
-Shaun
-Shawn
-Shiloh
-Silas
-Simon
-Skyler
-Sloan
-Smoke
-Solomon
-Sorrel
-Spencer
-Spike
-Stephen
-Steven
-Sybil
-Syd
-Talon
-Tamsin
-Tanner
-Tate
-Taylor
-Tel
-Terrell
-Terry
-Theodore
-Thomas
-Tim
-Timothy
-Titus
-Todd
-Tony
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trip
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Uriel
-Vaughn
-Victor
-Vince
-Vincent
-Vinny
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wesley
-Weston
-Whitaker
-William
-Willy
-Woodrow
-Wyatt
-Xander
-Xavier
-Yahir
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
+Aaden
+Aaron
+Abel
+Abraham
+Adam
+Adan
+Aden
+Adolph
+Adrian
+Aidan
+Aiden
+Alan
+Albert
+Alberto
+Alden
+Alec
+Alejandro
+Alex
+Alexander
+Alexis
+Alfred
+Alfredo
+Alger
+Ali
+Alijah
+Allen
+Alvin
+Amari
+Amir
+Amos
+Anderson
+Andre
+Andres
+Andrew
+Andy
+Angel
+Angelo
+Anthony
+Antonio
+Apple
+Archie
+Armando
+Arnie
+Art
+Arthur
+Arturo
+Asher
+Ashton
+August
+Austin
+Avery
+Axel
+Ayden
+Baldric
+Bartholomew
+Beau
+Beckett
+Benjamin
+Bennett
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Brendan
+Brenden
+Brennan
+Brett
+Brian
+Brick
+Brock
+Brodie
+Brody
+Bronte
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Bryson
+Buck
+Burt
+Butch
+Byrne
+Byron
+Cade
+Caden
+Caiden
+Caleb
+Calvin
+Camden
+Cameron
+Camron
+Camryn
+Carl
+Carlos
+Carson
+Carter
+Casey
+Cash
+Casimir
+Cassian
+Cayden
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlton
+Chase
+Chip
+Chris
+Christian
+Christopher
+Clark
+Claudius
+Clayton
+Clement
+Cletus
+Cleveland
+Cliff
+Clinton
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Corbin
+Corey
+Cory
+Cristian
+Cristopher
+Crush
+Cruz
+Curtis
+Cy
+Dakota
+Dallas
+Dalton
+Damian
+Damien
+Damon
+Dane
+Daniel
+Danny
+Dante
+Darcey
+Darell
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayton
+Dean
+Deandre
+Deangelo
+Declan
+Denholm
+Dennis
+Derek
+Derrick
+Desmond
+Devin
+Devon
+Diego
+Dillon
+Dirk
+Dominic
+Dominick
+Donald
+Donny
+Donovan
+Douglas
+Drake
+Drew
+Driscoll
+Duke
+Duncan
+Dustin
+Dylan
+Easton
+Eddie
+Edgar
+Eduardo
+Edward
+Edwin
+Eli
+Elias
+Elijah
+Eliot
+Eliott
+Elliot
+Elliott
+Elric
+Elwood
+Emanuel
+Emerson
+Emiliano
+Emilio
+Emmanuel
+Enrique
+Eric
+Erick
+Erik
+Ernesto
+Esteban
+Ethan
+Evan
+Everett
+Ezekiel
+Ezra
+Fabian
+Felix
+Fenton
+Fernando
+Finn
+Fitz
+Flick
+Flint
+Flip
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fridge
+Fulton
+Gabriel
+Gael
+Gage
+Gannon
+Garret
+Garrett
+Gary
+Gavin
+George
+Gerardo
+Giovanni
+Goddard
+Godwin
+Goodwin
+Gordon
+Grady
+Graeme
+Graham
+Grandpa
+Grant
+Gratian
+Grayson
+Gregory
+Grendel
+Greyson
+Griffin
+Guillermo
+Gunner
+Gustavo
+Han
+Harrison
+Harry
+Hartley
+Harvey
+Hayden
+Hector
+Henderson
+Henry
+Holden
+Homer
+Horatio
+Hudson
+Huffie
+Hugo
+Hungry
+Hunter
+Ian
+Irvine
+Isaac
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Ivan
+Izaiah
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jaden
+Jadon
+Jaiden
+Jaime
+Jake
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Janel
+Jared
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayden
+Jaydon
+Jaye
+Jaylen
+Jayne
+Jayson
+Jean-Luc
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jeremiah
+Jeremy
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jesus
+Jim
+Jimmy
+Joachim
+Joaquin
+Joe
+Joel
+Joey
+Johan
+John
+Johnathan
+Johnny
+Jonah
+Jonas
+Jonathan
+Jonathon
+Jordan
+Jorge
+Jose
+Joseph
+Josh
+Joshua
+Josiah
+Josue
+Juan
+Judah
+Jude
+Julian
+Julio
+Julius
+Justice
+Justin
+Kade
+Kaden
+Kai
+Kaiden
+Kale
+Kaleb
+Kameron
+Kane
+Karson
+Kayden
+Keagan
+Keaton
+Keegan
+Keith
+Kellen
+Kelvin
+Kennard
+Kenneth
+Kevin
+Keziah
+Khalil
+Kingston
+Kobe
+Kolton
+Kristopher
+Kyle
+Kyler
+Lance
+Landen
+Lando
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Launce
+Lawrence
+Leland
+Lennox
+Lenny
+Leo
+Leonard
+Leonardo
+Leonel
+Leroy
+Levi
+Liam
+Lief
+Lincoln
+Linden
+Linton
+Logan
+Lorde
+Lorenzo
+Loreto
+Lou
+Louis
+Luca
+Lucas
+Luis
+Lukas
+Luke
+Maddox
+Malachi
+Malcolm
+Malik
+Manley
+Manuel
+Marc
+Marco
+Marcos
+Marcus
+Mario
+Marion
+Mark
+Marshall
+Martin
+Marvin
+Mason
+Mateo
+Mathew
+Matthew
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+Maynard
+Mekhi
+Melvin
+Melvyn
+Micah
+Michael
+Micheal
+Miguel
+Mike
+Miles
+Milo
+Milton
+Mitchell
+Moises
+Montague
+Monte
+Monty
+Morgan
+Moses
+Myles
+Nasir
+Nat
+Nathan
+Nathaniel
+Nehemiah
+Nelson
+Nicholas
+Nick
+Nickolas
+Nicolas
+Nikolas
+Noah
+Noel
+Nolan
+Oliver
+Omar
+Opie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Oswald
+Owen
+Pablo
+Paget
+Parker
+Patrick
+Patton
+Paul
+Paxton
+Payton
+Pedro
+Percival
+Persh
+Peter
+Peyton
+Philip
+Phillip
+Phoenix
+Porter
+Preston
+Quentin
+Quinn
+Quinton
+Rafael
+Ramon
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reece
+Reed
+Reese
+Reid
+Reuben
+Reynard
+Ricardo
+Richard
+Ricky
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Roscoe
+Roswell
+Rowan
+Roy
+Royce
+Rube
+Ruben
+Russell
+Rusty
+Ryan
+Ryder
+Ryker
+Rylan
+Sal
+Salvador
+Sam
+Samuel
+Santiago
+Saul
+Sawyer
+Scott
+Scotty
+Sean
+Sebastian
+Sergio
+Seth
+Seymour
+Shane
+Shaun
+Shawn
+Shiloh
+Silas
+Simon
+Skyler
+Sloan
+Smoke
+Solomon
+Sorrel
+Spencer
+Spike
+Stephen
+Steven
+Sybil
+Syd
+Talon
+Tamsin
+Tanner
+Tate
+Taylor
+Tel
+Terrell
+Terry
+Theodore
+Thomas
+Tim
+Timothy
+Titus
+Todd
+Tony
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trip
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Uriel
+Vaughn
+Victor
+Vince
+Vincent
+Vinny
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wesley
+Weston
+Whitaker
+William
+Willy
+Woodrow
+Wyatt
+Xander
+Xavier
+Yahir
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
Zion
\ No newline at end of file
diff --git a/config/names/golem.txt b/strings/names/golem.txt
similarity index 89%
rename from config/names/golem.txt
rename to strings/names/golem.txt
index 7cfcefa899d..a26da78b045 100644
--- a/config/names/golem.txt
+++ b/strings/names/golem.txt
@@ -1,157 +1,157 @@
-Ablation
-Alabaster
-Alunite
-Andesite
-Anyhdrite
-Basalt
-Basin
-Bauxite
-Bedrock
-Bismuth
-Bismuthinite
-Bituminous Coal
-Borax
-Boulder
-Brimstone
-Brittle
-Calcite
-Cassiterite
-Cenozoic
-Chalk
-Chasm
-Cheridite
-Chert
-Chromite
-Cinnabar
-Claystone
-Coast
-Cobaltite
-Column
-Conglomerate
-Core
-Crevasse
-Crust
-Cryolite
-Crystal
-Dacite
-Diorite
-Dolomite
-Dolostone
-Dragonforce
-Earthflow
-Epoch
-Eutrophication
-Fault
-Flint
-Foliation
-Foreshock
-Fossil
-Gabbro
-Galena
-Garnierite
-Geode
-Geoge
-Gneiss
-Granite
-Graphite
-Gravel
-Groove
-Grotto
-Gypsum
-Hematite
-Hornblende
-Humus
-Igneous
-Ilmenite
-Iron
-Island
-Jasper
-Jet
-Kaolinite
-Kettle
-Kimberlite
-Komatiite
-Landslide
-Levee
-Lignite
-Limestone
-Limonite
-Luster
-Madidite
-Magnetite
-Magnitude
-Malachite
-Mantle
-Marble
-Marcasite
-Melange
-Meme
-Mica
-Microcline
-Migmatite
-Mineral
-Mountain
-Mudstone
-Obsidian
-Olivine
-Ore
-Orpiment
-Orthoclase
-Outwash
-Oxbow Lake
-Oynx
-Pahoehoe
-Pebble
-Pegmatite
-Periclase
-Petrified Wood
-Phyllite
-Pitchblende
-Plate
-Pothole
-Puddingstone
-Pyrite
-Pyrolusite
-Quake
-Quarry
-Quartz
-Quartzite
-Realgar
-Reservoir
-Rhyolite
-Rock
-Rock Salt
-Rockfall
-Rutile
-Saltpeter
-Sand
-Sandstone
-Satinspar
-Schist
-Sediment
-Seismic
-Selenite
-Serpentine
-Shale
-Shore
-Siltstone
-Slag
-Slate
-Sphalerite
-Stack
-Stalactite
-Stalagmite
-Stibnite
-Stone
-Stress
-Subduction
-Sylvite
-Talc
-Tetrahedrite
-Tidal
-Trench
-Valley
-Volcano
-Xenolith
-Yardang
-Zone
+Ablation
+Alabaster
+Alunite
+Andesite
+Anyhdrite
+Basalt
+Basin
+Bauxite
+Bedrock
+Bismuth
+Bismuthinite
+Bituminous Coal
+Borax
+Boulder
+Brimstone
+Brittle
+Calcite
+Cassiterite
+Cenozoic
+Chalk
+Chasm
+Cheridite
+Chert
+Chromite
+Cinnabar
+Claystone
+Coast
+Cobaltite
+Column
+Conglomerate
+Core
+Crevasse
+Crust
+Cryolite
+Crystal
+Dacite
+Diorite
+Dolomite
+Dolostone
+Dragonforce
+Earthflow
+Epoch
+Eutrophication
+Fault
+Flint
+Foliation
+Foreshock
+Fossil
+Gabbro
+Galena
+Garnierite
+Geode
+Geoge
+Gneiss
+Granite
+Graphite
+Gravel
+Groove
+Grotto
+Gypsum
+Hematite
+Hornblende
+Humus
+Igneous
+Ilmenite
+Iron
+Island
+Jasper
+Jet
+Kaolinite
+Kettle
+Kimberlite
+Komatiite
+Landslide
+Levee
+Lignite
+Limestone
+Limonite
+Luster
+Madidite
+Magnetite
+Magnitude
+Malachite
+Mantle
+Marble
+Marcasite
+Melange
+Meme
+Mica
+Microcline
+Migmatite
+Mineral
+Mountain
+Mudstone
+Obsidian
+Olivine
+Ore
+Orpiment
+Orthoclase
+Outwash
+Oxbow Lake
+Oynx
+Pahoehoe
+Pebble
+Pegmatite
+Periclase
+Petrified Wood
+Phyllite
+Pitchblende
+Plate
+Pothole
+Puddingstone
+Pyrite
+Pyrolusite
+Quake
+Quarry
+Quartz
+Quartzite
+Realgar
+Reservoir
+Rhyolite
+Rock
+Rock Salt
+Rockfall
+Rutile
+Saltpeter
+Sand
+Sandstone
+Satinspar
+Schist
+Sediment
+Seismic
+Selenite
+Serpentine
+Shale
+Shore
+Siltstone
+Slag
+Slate
+Sphalerite
+Stack
+Stalactite
+Stalagmite
+Stibnite
+Stone
+Stress
+Subduction
+Sylvite
+Talc
+Tetrahedrite
+Tidal
+Trench
+Valley
+Volcano
+Xenolith
+Yardang
+Zone
diff --git a/config/names/last.txt b/strings/names/last.txt
similarity index 88%
rename from config/names/last.txt
rename to strings/names/last.txt
index 6796c7519e8..b9769055e3a 100644
--- a/config/names/last.txt
+++ b/strings/names/last.txt
@@ -1,570 +1,570 @@
-Ackerley
-Adams
-Addison
-Agg
-Aggley
-Ahmed
-Albright
-Alekseev
-Ali
-Alice
-Allen
-Alliman
-Altmann
-Anderson
-Andreev
-Ann
-Archibald
-Armstrong
-Ashbaugh
-Atkinson
-Atweeke
-Aultman
-Auman
-Baer
-Bailey
-Baker
-Barnes
-Barrett
-Bash
-Bashline
-Basinger
-Baskett
-Basmanoff
-Batten
-Baum
-Baxter
-Beach
-Beail
-Beck
-Beedell
-Begum
-Bell
-Benford
-Bennett
-Berkheimer
-Best
-Bickerson
-Bicknell
-Biery
-Black
-Blackburn
-Blaine
-Blessig
-Bloise
-Bluetenberger
-Blyant
-Bode
-Bould
-Bousum
-Bowchiew
-Boyer
-Brandenburg
-Bratton
-Braun
-Briggs
-Brindle
-Briner
-Brinigh
-Brooks
-Brown
-Bullard
-Bunten
-Burkett
-Burns
-Burris
-Butterfill
-Buttersworth
-Buzzard
-Byers
-Bynum
-Caldwell
-Callison
-Camp
-Campbell
-Carmichael
-Carr
-Carter
-Catherina
-Catleay
-Cavalet
-Chapman
-Chauvin
-Cherry
-Christman
-Christopher
-Clark
-Clarke
-Clewett
-Coates
-Coldsmith
-Collins
-Compton
-Conrad
-Cook
-Cooper
-Costello
-Cowart
-Cowper
-Cox
-Cressman
-Curry
-Cypret
-David
-Davies
-Davis
-Dawkins
-Day
-Dean
-Demuth
-Dennis
-Dickinson
-Digson
-Dimeling
-Donkin
-Draudy
-Driggers
-Dryfus
-Dugmore
-Duncan
-Durstine
-Earl
-Easter
-Echard
-Eckhardstein
-Edwards
-Eggbert
-Ehret
-Elderson
-Eliza
-Elliott
-Ellis
-Enderly
-Endsley
-Evans
-Ewing
-Faqua
-Faust
-Fea
-Feufer
-Fiddler
-Field
-Fields
-Finlay
-Fischer
-Fiscina
-Fisher
-Fitzgerald
-Fleming
-Flickinger
-Focell
-Foster
-Franks
-Fraser
-Fryer
-Fuchs
-Fulton
-Gadow
-Gardner
-Garland
-Garneys
-Garratt
-Garrison
-Gettemy
-Gibson
-Glover
-Goebbles
-Goodman
-Graham
-Gray
-Green
-Greenawalt
-Greene
-Greenwood
-Gregory
-Griffiths
-Gronko
-Guess
-Hall
-Hanford
-Hardie
-Harding
-Hardy
-Harris
-Harrison
-Harrold
-Harrow
-Harshman
-Hastings
-Hawker
-Hawking
-Hawkins
-Hayhurst
-Haynes
-Heckendora
-Hegarty
-Henry
-Hice
-Highlands
-Hill
-Hincken
-Hirleman
-Hoenshell
-Holdeman
-Holmes
-Hook
-Hooker
-Hoopengarner
-Hoover
-Houser
-Houston
-Howard
-Howe
-Huey
-Hughes
-Hujsak
-Hunt
-Hunter
-Hussain
-Hutton
-Hynes
-Ironmonger
-Isaman
-Isemann
-Ivanov
-Jackson
-James
-Jardine
-Jenkins
-Jenner
-Jerome
-Jesse
-Jewell
-Joghs
-Johnson
-Jones
-Jowers
-Joyce
-Judge
-Jyllian
-Kadel
-Kanaga
-Kaur
-Keener
-Kelley
-Kellogg
-Kelly
-Kemble
-Kemerer
-Keppel
-Kepplinger
-Khan
-Kiefer
-Kifer
-Kimple
-King
-Kirkson
-Knapenberger
-Knapp
-Koepple
-Koster
-Kuster
-Kuznetsov
-Laborde
-Lacon
-Lafortune
-Langston
-Larson
-Lauffer
-Laurenzi
-Leach
-Lee
-Leech
-Leichter
-Leslie
-Lester
-Levett
-Lewis
-Lineman
-Linton
-Llora
-Lloyd
-Logue
-Lombardi
-Lord
-Losey
-Lowe
-Lowstetter
-Lucy
-Ludwig
-Maclagan
-Magor
-Marcotte
-Margaret
-Marriman
-Marshall
-Martins
-Mary
-Mason
-Mathews
-Matthews
-Mcclymonds
-Mccullough
-Mccune
-McDonald
-McDonohugh
-Mcfall
-Mcintosh
-Mckendrick
-Mcloskey
-Mcmullen
-McShain
-Mens
-Merryman
-Metzer
-Meyers
-Mikhaylov
-Mildred
-Miller
-Millhouse
-Mills
-Milne
-Mingle
-Minnie
-Mitchell
-Moberly
-Moon
-Moore
-Morgan
-Morris
-Mortland
-Mosser
-Mueller
-Muggins
-Mull
-Muller
-Murphy
-Murray
-Nash
-Neely
-Nehling
-Newbern
-Newton
-Nicholas
-Nickolson
-Northey
-Noton
-Olphert
-Oneal
-Oppenheimer
-Osteen
-Osterweis
-Osterwise
-Otis
-Overstreet
-Owen
-Owens
-Palmer
-Parker
-Parkinson
-Patel
-Patterson
-Paulson
-Pavlov
-Paynter
-Pearsall
-Pennington
-Perkins
-Pershing
-Peters
-Petrov
-Pfeifer
-Philips
-Phillips
-Picard
-Pinney
-Poehl
-Poley
-Polson
-Potter
-Powell
-Power
-Powers
-Pratt
-Prechtl
-Prescott
-Prevatt
-Price
-Priebe
-Pritchard
-Pycroft
-Quinn
-Quirin
-Rader
-Rahl
-Ramos
-Randolph
-Ratcliff
-Rathen
-Rathens
-Raub
-Ray
-Reade
-Reichard
-Reid
-Reighner
-Rhinehart
-Richards
-Richardson
-Richter
-Rifler
-Riggle
-Riker
-Ringer
-Roadman
-Roberts
-Robertson
-Robinson
-Roby
-Rockwell
-Rogers
-Rohtin
-Rose
-Rosensteel
-Rowley
-Russell
-Ryals
-Sagan
-Sanders
-Sandford
-Sandys
-Sauter
-Saylor
-Schaeffer
-Scherer
-Schmidt
-Schofield
-Schrader
-Scott
-Sealis
-Seelig
-Seidner
-Semenov
-Shafer
-Shaffer
-Shaner
-Shaw
-Sheets
-Shick
-Shirey
-Sholl
-Shupe
-Sidower
-Siegrist
-Simmons
-Simpson
-Singh
-Skywalker
-Sloan
-Smail
-Smirnov
-Smith
-Snyder
-Sommer
-Spock
-Stafford
-Stahl
-Stainforth
-Stall
-Stamos
-Stange
-Staymates
-Steele
-Stephenson
-Stern
-Stewart
-Stocker
-Stone
-Stough
-Straub
-Stroble
-Stroh
-Styles
-Sullivan
-Sulyard
-Summy
-Sutton
-Swabey
-Swarner
-Sybilla
-Taggart
-Tanner
-Taylor
-Teagarden
-Tedrow
-Tennant
-Thomas
-Thomlinson
-Thompson
-Thomson
-Thorley
-Tilton
-Tireman
-Todd
-Treeby
-Trovato
-Turner
-Ulery
-Ullman
-Unk
-Vader
-Vanleer
-Vasilyev
-Waldron
-Walker
-Wallick
-Ward
-Wardle
-Warren
-Watson
-Webb
-Weeter
-Weinstein
-Weisgarber
-Wells
-Welty
-Wentzel
-Werner
-Werry
-Wheeler
-Whirlow
-White
-Whiteman
-Whittier
-Wible
-Wile
-Wilkerson
-Wilkinson
-Willey
-Williams
-Williamson
-Wilo
-Wilson
-Winton
-Wise
-Wolfe
-Wolff
-Wood
-Woodward
-Woodworth
-Woolery
-Woollard
-Wright
-Yeskey
-Young
-Zadovsky
-Zalack
-Zaun
-Zeal
-Zimmer
+Ackerley
+Adams
+Addison
+Agg
+Aggley
+Ahmed
+Albright
+Alekseev
+Ali
+Alice
+Allen
+Alliman
+Altmann
+Anderson
+Andreev
+Ann
+Archibald
+Armstrong
+Ashbaugh
+Atkinson
+Atweeke
+Aultman
+Auman
+Baer
+Bailey
+Baker
+Barnes
+Barrett
+Bash
+Bashline
+Basinger
+Baskett
+Basmanoff
+Batten
+Baum
+Baxter
+Beach
+Beail
+Beck
+Beedell
+Begum
+Bell
+Benford
+Bennett
+Berkheimer
+Best
+Bickerson
+Bicknell
+Biery
+Black
+Blackburn
+Blaine
+Blessig
+Bloise
+Bluetenberger
+Blyant
+Bode
+Bould
+Bousum
+Bowchiew
+Boyer
+Brandenburg
+Bratton
+Braun
+Briggs
+Brindle
+Briner
+Brinigh
+Brooks
+Brown
+Bullard
+Bunten
+Burkett
+Burns
+Burris
+Butterfill
+Buttersworth
+Buzzard
+Byers
+Bynum
+Caldwell
+Callison
+Camp
+Campbell
+Carmichael
+Carr
+Carter
+Catherina
+Catleay
+Cavalet
+Chapman
+Chauvin
+Cherry
+Christman
+Christopher
+Clark
+Clarke
+Clewett
+Coates
+Coldsmith
+Collins
+Compton
+Conrad
+Cook
+Cooper
+Costello
+Cowart
+Cowper
+Cox
+Cressman
+Curry
+Cypret
+David
+Davies
+Davis
+Dawkins
+Day
+Dean
+Demuth
+Dennis
+Dickinson
+Digson
+Dimeling
+Donkin
+Draudy
+Driggers
+Dryfus
+Dugmore
+Duncan
+Durstine
+Earl
+Easter
+Echard
+Eckhardstein
+Edwards
+Eggbert
+Ehret
+Elderson
+Eliza
+Elliott
+Ellis
+Enderly
+Endsley
+Evans
+Ewing
+Faqua
+Faust
+Fea
+Feufer
+Fiddler
+Field
+Fields
+Finlay
+Fischer
+Fiscina
+Fisher
+Fitzgerald
+Fleming
+Flickinger
+Focell
+Foster
+Franks
+Fraser
+Fryer
+Fuchs
+Fulton
+Gadow
+Gardner
+Garland
+Garneys
+Garratt
+Garrison
+Gettemy
+Gibson
+Glover
+Goebbles
+Goodman
+Graham
+Gray
+Green
+Greenawalt
+Greene
+Greenwood
+Gregory
+Griffiths
+Gronko
+Guess
+Hall
+Hanford
+Hardie
+Harding
+Hardy
+Harris
+Harrison
+Harrold
+Harrow
+Harshman
+Hastings
+Hawker
+Hawking
+Hawkins
+Hayhurst
+Haynes
+Heckendora
+Hegarty
+Henry
+Hice
+Highlands
+Hill
+Hincken
+Hirleman
+Hoenshell
+Holdeman
+Holmes
+Hook
+Hooker
+Hoopengarner
+Hoover
+Houser
+Houston
+Howard
+Howe
+Huey
+Hughes
+Hujsak
+Hunt
+Hunter
+Hussain
+Hutton
+Hynes
+Ironmonger
+Isaman
+Isemann
+Ivanov
+Jackson
+James
+Jardine
+Jenkins
+Jenner
+Jerome
+Jesse
+Jewell
+Joghs
+Johnson
+Jones
+Jowers
+Joyce
+Judge
+Jyllian
+Kadel
+Kanaga
+Kaur
+Keener
+Kelley
+Kellogg
+Kelly
+Kemble
+Kemerer
+Keppel
+Kepplinger
+Khan
+Kiefer
+Kifer
+Kimple
+King
+Kirkson
+Knapenberger
+Knapp
+Koepple
+Koster
+Kuster
+Kuznetsov
+Laborde
+Lacon
+Lafortune
+Langston
+Larson
+Lauffer
+Laurenzi
+Leach
+Lee
+Leech
+Leichter
+Leslie
+Lester
+Levett
+Lewis
+Lineman
+Linton
+Llora
+Lloyd
+Logue
+Lombardi
+Lord
+Losey
+Lowe
+Lowstetter
+Lucy
+Ludwig
+Maclagan
+Magor
+Marcotte
+Margaret
+Marriman
+Marshall
+Martins
+Mary
+Mason
+Mathews
+Matthews
+Mcclymonds
+Mccullough
+Mccune
+McDonald
+McDonohugh
+Mcfall
+Mcintosh
+Mckendrick
+Mcloskey
+Mcmullen
+McShain
+Mens
+Merryman
+Metzer
+Meyers
+Mikhaylov
+Mildred
+Miller
+Millhouse
+Mills
+Milne
+Mingle
+Minnie
+Mitchell
+Moberly
+Moon
+Moore
+Morgan
+Morris
+Mortland
+Mosser
+Mueller
+Muggins
+Mull
+Muller
+Murphy
+Murray
+Nash
+Neely
+Nehling
+Newbern
+Newton
+Nicholas
+Nickolson
+Northey
+Noton
+Olphert
+Oneal
+Oppenheimer
+Osteen
+Osterweis
+Osterwise
+Otis
+Overstreet
+Owen
+Owens
+Palmer
+Parker
+Parkinson
+Patel
+Patterson
+Paulson
+Pavlov
+Paynter
+Pearsall
+Pennington
+Perkins
+Pershing
+Peters
+Petrov
+Pfeifer
+Philips
+Phillips
+Picard
+Pinney
+Poehl
+Poley
+Polson
+Potter
+Powell
+Power
+Powers
+Pratt
+Prechtl
+Prescott
+Prevatt
+Price
+Priebe
+Pritchard
+Pycroft
+Quinn
+Quirin
+Rader
+Rahl
+Ramos
+Randolph
+Ratcliff
+Rathen
+Rathens
+Raub
+Ray
+Reade
+Reichard
+Reid
+Reighner
+Rhinehart
+Richards
+Richardson
+Richter
+Rifler
+Riggle
+Riker
+Ringer
+Roadman
+Roberts
+Robertson
+Robinson
+Roby
+Rockwell
+Rogers
+Rohtin
+Rose
+Rosensteel
+Rowley
+Russell
+Ryals
+Sagan
+Sanders
+Sandford
+Sandys
+Sauter
+Saylor
+Schaeffer
+Scherer
+Schmidt
+Schofield
+Schrader
+Scott
+Sealis
+Seelig
+Seidner
+Semenov
+Shafer
+Shaffer
+Shaner
+Shaw
+Sheets
+Shick
+Shirey
+Sholl
+Shupe
+Sidower
+Siegrist
+Simmons
+Simpson
+Singh
+Skywalker
+Sloan
+Smail
+Smirnov
+Smith
+Snyder
+Sommer
+Spock
+Stafford
+Stahl
+Stainforth
+Stall
+Stamos
+Stange
+Staymates
+Steele
+Stephenson
+Stern
+Stewart
+Stocker
+Stone
+Stough
+Straub
+Stroble
+Stroh
+Styles
+Sullivan
+Sulyard
+Summy
+Sutton
+Swabey
+Swarner
+Sybilla
+Taggart
+Tanner
+Taylor
+Teagarden
+Tedrow
+Tennant
+Thomas
+Thomlinson
+Thompson
+Thomson
+Thorley
+Tilton
+Tireman
+Todd
+Treeby
+Trovato
+Turner
+Ulery
+Ullman
+Unk
+Vader
+Vanleer
+Vasilyev
+Waldron
+Walker
+Wallick
+Ward
+Wardle
+Warren
+Watson
+Webb
+Weeter
+Weinstein
+Weisgarber
+Wells
+Welty
+Wentzel
+Werner
+Werry
+Wheeler
+Whirlow
+White
+Whiteman
+Whittier
+Wible
+Wile
+Wilkerson
+Wilkinson
+Willey
+Williams
+Williamson
+Wilo
+Wilson
+Winton
+Wise
+Wolfe
+Wolff
+Wood
+Woodward
+Woodworth
+Woolery
+Woollard
+Wright
+Yeskey
+Young
+Zadovsky
+Zalack
+Zaun
+Zeal
+Zimmer
Zoucks
\ No newline at end of file
diff --git a/config/names/lizard_female.txt b/strings/names/lizard_female.txt
similarity index 84%
rename from config/names/lizard_female.txt
rename to strings/names/lizard_female.txt
index 078ee7bcff4..cf588df9b19 100644
--- a/config/names/lizard_female.txt
+++ b/strings/names/lizard_female.txt
@@ -1,163 +1,163 @@
-Adzi
-Ah
-Ahaht
-Ajim
-Akeenus
-Akish
-Akishan
-Aleeto
-Am
-Amussa
-An
-Anozz
-Asheemar
-Asska
-Awas
-Azala
-Azbai
-Azeez
-Azum
-Banalz
-Bar
-Baseenar
-Beek
-Beekatan
-Beekus
-Beela
-Beelei
-Beem
-Beewos
-Bejeen
-Ber
-Betzi
-Bishalus
-Bokeeus
-Bur
-Bura
-Chalaree
-Chana
-Chanil
-Chee
-Cheesh
-Chimatei
-Chirurgeon
-Cholasistu
-Chuna
-Churasu
-Crath
-Dar
-Deeja
-Deesei
-Deesh
-Deetsan
-Deetwos
-Dooka
-Druja
-Eepa
-Ei
-Eix
-El
-Ereel
-Eutei
-Gai
-Gih
-Gilm
-Gish
-Go
-Hal
-Hul
-Ja
-Jaseen
-Jasuda
-Jeed
-Jeen
-Kajul
-Kal
-Kasa
-Keel
-Keerava
-Kiurz
-Kud
-La
-Lee
-Lei
-Lifts
-Liurz
-Lurasha
-Ma
-Mach
-Marz
-Meedish
-Meeh
-Meema
-Meen
-Meena
-Meenus
-Meerana
-Meesei
-Meeus
-Mei
-Milah
-Mim
-Mota
-Mudeska
-Muz
-Na
-Nakuma
-Nam
-Nassa
-Natoo
-Neesha
-Neetizei
-Neetra
-Neeus
-Niima
-Numeen
-Nuralg
-Nush
-Ocheeva
-Okur
-Olank
-On
-Onasha
-Osheeka
-Pasha
-Ra
-Rana
-Raniur
-Ree
-Reesa
-Rei
-Sa
-Saak
-Sanax
-Seeba
-Seed
-Seen
-Shah
-Shahvee
-Shaleez
-Shatalg
-Sheer
-Shei
-Sigerthe
-Skaleel
-Sudie
-Tail
-Tar
-Tasha
-Tei
-Telixith
-Tumma
-Veek
-Wan
-Wazei
-Weedum
-Weewish
-Witseidutsei
-Wuja
-Wujeeta
-Wusha
-Xil
-Zish
+Adzi
+Ah
+Ahaht
+Ajim
+Akeenus
+Akish
+Akishan
+Aleeto
+Am
+Amussa
+An
+Anozz
+Asheemar
+Asska
+Awas
+Azala
+Azbai
+Azeez
+Azum
+Banalz
+Bar
+Baseenar
+Beek
+Beekatan
+Beekus
+Beela
+Beelei
+Beem
+Beewos
+Bejeen
+Ber
+Betzi
+Bishalus
+Bokeeus
+Bur
+Bura
+Chalaree
+Chana
+Chanil
+Chee
+Cheesh
+Chimatei
+Chirurgeon
+Cholasistu
+Chuna
+Churasu
+Crath
+Dar
+Deeja
+Deesei
+Deesh
+Deetsan
+Deetwos
+Dooka
+Druja
+Eepa
+Ei
+Eix
+El
+Ereel
+Eutei
+Gai
+Gih
+Gilm
+Gish
+Go
+Hal
+Hul
+Ja
+Jaseen
+Jasuda
+Jeed
+Jeen
+Kajul
+Kal
+Kasa
+Keel
+Keerava
+Kiurz
+Kud
+La
+Lee
+Lei
+Lifts
+Liurz
+Lurasha
+Ma
+Mach
+Marz
+Meedish
+Meeh
+Meema
+Meen
+Meena
+Meenus
+Meerana
+Meesei
+Meeus
+Mei
+Milah
+Mim
+Mota
+Mudeska
+Muz
+Na
+Nakuma
+Nam
+Nassa
+Natoo
+Neesha
+Neetizei
+Neetra
+Neeus
+Niima
+Numeen
+Nuralg
+Nush
+Ocheeva
+Okur
+Olank
+On
+Onasha
+Osheeka
+Pasha
+Ra
+Rana
+Raniur
+Ree
+Reesa
+Rei
+Sa
+Saak
+Sanax
+Seeba
+Seed
+Seen
+Shah
+Shahvee
+Shaleez
+Shatalg
+Sheer
+Shei
+Sigerthe
+Skaleel
+Sudie
+Tail
+Tar
+Tasha
+Tei
+Telixith
+Tumma
+Veek
+Wan
+Wazei
+Weedum
+Weewish
+Witseidutsei
+Wuja
+Wujeeta
+Wusha
+Xil
+Zish
Zollassa
\ No newline at end of file
diff --git a/config/names/lizard_male.txt b/strings/names/lizard_male.txt
similarity index 85%
rename from config/names/lizard_male.txt
rename to strings/names/lizard_male.txt
index f14f1705ba4..437d124b50e 100644
--- a/config/names/lizard_male.txt
+++ b/strings/names/lizard_male.txt
@@ -1,328 +1,328 @@
-Abijoo
-Ah
-Ajum
-Am
-Amusei
-An
-Anoo
-Aojee
-Asum
-Az
-Azeel
-Azinar
-Azjai
-Baar
-Banka
-Bar
-Barnaxi
-Batar
-Batuus
-Beem
-Beshnus
-Betu
-Bex
-Bijot
-Bimee
-Binyaar
-Bosekus
-Brand
-Bun
-Bunach
-Bunish
-Busheeus
-Buujhan
-Chakuk
-Chalish
-Chalureel
-Chath
-Chee
-Cheedal
-Chilwir
-Chitakus
-Chiwish
-Chulz
-Chuna
-Da
-Dakee
-Dan
-Dar
-Darasken
-DarJee
-Debameel
-Deed
-Deegeeta
-Deeh
-Deekonus
-Deekum
-Deekus
-Deerkaza
-Deetum
-Demeepa
-Depasa
-Derkeethus
-Deroh
-Dezanu
-Dreet
-Drumarz
-Dum
-Dunaxith
-Effe
-Ei
-Eidu
-Eius
-Eiuus
-Eix
-Eleedal
-Er
-Esqoo
-Etaku
-Gah
-Gajul
-Gam
-Geeh
-Geel
-Geem
-Geh
-Gei
-Gih
-Gin
-Goh
-Gulum
-Haj
-Han
-Haran
-Hareeya
-Hathei
-Heedul
-Heem
-Hei
-Heir
-Hixeeh
-Huleeya
-Huzei
-Ilas
-Im
-Inee
-Itan
-J'Ram
-Ja
-Jah
-Jaraleet
-Jaree
-Jas
-Jasaiin
-Jaseen
-Jat
-Jee
-Jeela
-Jeelius
-Jeelus
-Jeen
-Jeer
-Jeetum
-Jei
-Jilux
-Jin
-Jon
-Jul
-Julan
-Junal
-Jush
-Juunei
-Kai
-Kajin
-Kamax
-Kas
-Keema
-Keer
-Keerasa
-Kepanuu
-Kia
-Kiameed
-Kilaya
-Kiurz
-Kur
-Kuz
-La
-Lah
-Lai
-Lan
-Lara
-Leem
-Lei
-Loh
-Lotash
-Luh
-Lurz
-Luteema
-Maahi
-Madesi
-Maheelius
-Mahei
-Maht
-Malz
-Marz
-Mathei
-Maxath
-Meej
-Meejapa
-Meensuda
-Meer
-Mema
-Mere
-Metaku
-Miharil
-Milos
-Miun
-Mobareed
-Mohimeem
-Mopakuz
-Motuu
-Mujeen
-Muranatepa
-Mush
-Muz
-Na
-Napetui
-Nazuux
-Nebutil
-Neeti
-Neetinei
-Neetrenaza
-Neetzara
-Neeus
-Nema
-Neposh
-Netapatuu
-Nexith
-Nodeeus
-Nomu
-Nosaleeth
-Nowajeem
-Noyei
-Nulaz
-Nur
-Obaxith
-Okan
-Okaw
-Okeeh
-Oleed
-Oleen
-Olik
-Olink
-Onuja
-Onurai
-Opatieel
-Otumeel
-Owai
-Pachat
-Pacheeva
-Pad
-Paduxi
-Pajeen
-Parash
-Peeradeeh
-Pejureel
-Petaxai
-Pideelus
-Pimaxi
-Pojeel
-Ra
-Radithax
-Raj
-Rareel
-Rasha
-Redieeus
-Ree
-Reeh
-Reemukeeus
-Reenum
-Reesa
-Reet
-Reezal
-Resari
-Riker
-Ru
-Rupah
-Sakeepa
-Sakeeus
-Sakka
-Saliith
-Sar
-Schiavas
-Seek
-Seewul
-Sei
-Sejaijilax
-Shakiis
-Shehs
-Shei
-Silm
-Skee
-Skeetul
-Sureeus
-Ta
-Taeed
-Tah
-Taleel
-Talen
-Tan
-Tanaka
-Tanan
-Tee
-Teeba
-Teegla
-Teeka
-Teekeeus
-Teemeeta
-Teeus
-Tehat
-Tei
-Teinaava
-Teineeja
-Terezeeus
-Tikaasi
-Tim
-Topeeth
-Topith
-Tsleeixth
-Tul
-Tulm
-Tun
-Ukatsei
-Ukawei
-Ula
-Ulawa
-Ullis
-Usha
-Usheeja
-Utadeek
-Utamukeeus
-Utatul
-Uxith
-Vara
-Veekas
-Veenaza
-Veezara
-Vistha
-Vudeelal
-Wanan
-Wanum
-Wayiteh
-Weebam
-Weeltul
-Weer
-Wih
-Wud
-Wuleen
-Wulm
-Wumeek
-Xal
-Xemo
-Yinz
-Yinz'r
-Zaw
-Ze
-Zeen
-Zeeus
+Abijoo
+Ah
+Ajum
+Am
+Amusei
+An
+Anoo
+Aojee
+Asum
+Az
+Azeel
+Azinar
+Azjai
+Baar
+Banka
+Bar
+Barnaxi
+Batar
+Batuus
+Beem
+Beshnus
+Betu
+Bex
+Bijot
+Bimee
+Binyaar
+Bosekus
+Brand
+Bun
+Bunach
+Bunish
+Busheeus
+Buujhan
+Chakuk
+Chalish
+Chalureel
+Chath
+Chee
+Cheedal
+Chilwir
+Chitakus
+Chiwish
+Chulz
+Chuna
+Da
+Dakee
+Dan
+Dar
+Darasken
+DarJee
+Debameel
+Deed
+Deegeeta
+Deeh
+Deekonus
+Deekum
+Deekus
+Deerkaza
+Deetum
+Demeepa
+Depasa
+Derkeethus
+Deroh
+Dezanu
+Dreet
+Drumarz
+Dum
+Dunaxith
+Effe
+Ei
+Eidu
+Eius
+Eiuus
+Eix
+Eleedal
+Er
+Esqoo
+Etaku
+Gah
+Gajul
+Gam
+Geeh
+Geel
+Geem
+Geh
+Gei
+Gih
+Gin
+Goh
+Gulum
+Haj
+Han
+Haran
+Hareeya
+Hathei
+Heedul
+Heem
+Hei
+Heir
+Hixeeh
+Huleeya
+Huzei
+Ilas
+Im
+Inee
+Itan
+J'Ram
+Ja
+Jah
+Jaraleet
+Jaree
+Jas
+Jasaiin
+Jaseen
+Jat
+Jee
+Jeela
+Jeelius
+Jeelus
+Jeen
+Jeer
+Jeetum
+Jei
+Jilux
+Jin
+Jon
+Jul
+Julan
+Junal
+Jush
+Juunei
+Kai
+Kajin
+Kamax
+Kas
+Keema
+Keer
+Keerasa
+Kepanuu
+Kia
+Kiameed
+Kilaya
+Kiurz
+Kur
+Kuz
+La
+Lah
+Lai
+Lan
+Lara
+Leem
+Lei
+Loh
+Lotash
+Luh
+Lurz
+Luteema
+Maahi
+Madesi
+Maheelius
+Mahei
+Maht
+Malz
+Marz
+Mathei
+Maxath
+Meej
+Meejapa
+Meensuda
+Meer
+Mema
+Mere
+Metaku
+Miharil
+Milos
+Miun
+Mobareed
+Mohimeem
+Mopakuz
+Motuu
+Mujeen
+Muranatepa
+Mush
+Muz
+Na
+Napetui
+Nazuux
+Nebutil
+Neeti
+Neetinei
+Neetrenaza
+Neetzara
+Neeus
+Nema
+Neposh
+Netapatuu
+Nexith
+Nodeeus
+Nomu
+Nosaleeth
+Nowajeem
+Noyei
+Nulaz
+Nur
+Obaxith
+Okan
+Okaw
+Okeeh
+Oleed
+Oleen
+Olik
+Olink
+Onuja
+Onurai
+Opatieel
+Otumeel
+Owai
+Pachat
+Pacheeva
+Pad
+Paduxi
+Pajeen
+Parash
+Peeradeeh
+Pejureel
+Petaxai
+Pideelus
+Pimaxi
+Pojeel
+Ra
+Radithax
+Raj
+Rareel
+Rasha
+Redieeus
+Ree
+Reeh
+Reemukeeus
+Reenum
+Reesa
+Reet
+Reezal
+Resari
+Riker
+Ru
+Rupah
+Sakeepa
+Sakeeus
+Sakka
+Saliith
+Sar
+Schiavas
+Seek
+Seewul
+Sei
+Sejaijilax
+Shakiis
+Shehs
+Shei
+Silm
+Skee
+Skeetul
+Sureeus
+Ta
+Taeed
+Tah
+Taleel
+Talen
+Tan
+Tanaka
+Tanan
+Tee
+Teeba
+Teegla
+Teeka
+Teekeeus
+Teemeeta
+Teeus
+Tehat
+Tei
+Teinaava
+Teineeja
+Terezeeus
+Tikaasi
+Tim
+Topeeth
+Topith
+Tsleeixth
+Tul
+Tulm
+Tun
+Ukatsei
+Ukawei
+Ula
+Ulawa
+Ullis
+Usha
+Usheeja
+Utadeek
+Utamukeeus
+Utatul
+Uxith
+Vara
+Veekas
+Veenaza
+Veezara
+Vistha
+Vudeelal
+Wanan
+Wanum
+Wayiteh
+Weebam
+Weeltul
+Weer
+Wih
+Wud
+Wuleen
+Wulm
+Wumeek
+Xal
+Xemo
+Yinz
+Yinz'r
+Zaw
+Ze
+Zeen
+Zeeus
Zish
\ No newline at end of file
diff --git a/config/names/mime.txt b/strings/names/mime.txt
similarity index 87%
rename from config/names/mime.txt
rename to strings/names/mime.txt
index 520d3affce9..cc65af67fd8 100644
--- a/config/names/mime.txt
+++ b/strings/names/mime.txt
@@ -1,24 +1,24 @@
-Invisible Man
-Lemon Mime
-Marcel
-Marcel Mime
-Mime
-Mr Beret
-Mr Mime
-Mr Mute
-Mute
-Omerta
-Oui Oui
-Pantomime
-Quiet
-Quiet Riot
-Silence
-Silencio
-Silent Knight
-Silent Majority
-Silent Night
-Silent Sorrow
-Transparency
-Unspeakable
-Untouchable
+Invisible Man
+Lemon Mime
+Marcel
+Marcel Mime
+Mime
+Mr Beret
+Mr Mime
+Mr Mute
+Mute
+Omerta
+Oui Oui
+Pantomime
+Quiet
+Quiet Riot
+Silence
+Silencio
+Silent Knight
+Silent Majority
+Silent Night
+Silent Sorrow
+Transparency
+Unspeakable
+Untouchable
Wall Runner
\ No newline at end of file
diff --git a/config/names/ninjaname.txt b/strings/names/ninjaname.txt
similarity index 86%
rename from config/names/ninjaname.txt
rename to strings/names/ninjaname.txt
index eb470493fa4..fa0d0f10941 100644
--- a/config/names/ninjaname.txt
+++ b/strings/names/ninjaname.txt
@@ -1,44 +1,44 @@
-Aria
-Baki
-Blood
-Bro
-Cyrax
-Daemon
-Death
-Donatello
-Eater
-Ermac
-Fox
-Goemon
-Hanzo
-Hayabusa
-Hazuki
-Hero
-Hien
-Hiro
-Hiryu
-Iga
-Koga
-Leonardo
-McAwesome
-McNinja
-Michaelangelo
-Midnight
-Null
-Ogre
-Phantom
-Raiden
-Rain
-Raphael
-Ryu
-Saibot
-Samurai
-Sarutobi
-Scorpion
-Seven
-Shadow
-Shredder
-Smoke
-Splinter
-Throat
+Aria
+Baki
+Blood
+Bro
+Cyrax
+Daemon
+Death
+Donatello
+Eater
+Ermac
+Fox
+Goemon
+Hanzo
+Hayabusa
+Hazuki
+Hero
+Hien
+Hiro
+Hiryu
+Iga
+Koga
+Leonardo
+McAwesome
+McNinja
+Michaelangelo
+Midnight
+Null
+Ogre
+Phantom
+Raiden
+Rain
+Raphael
+Ryu
+Saibot
+Samurai
+Sarutobi
+Scorpion
+Seven
+Shadow
+Shredder
+Smoke
+Splinter
+Throat
Zero
\ No newline at end of file
diff --git a/config/names/ninjatitle.txt b/strings/names/ninjatitle.txt
similarity index 86%
rename from config/names/ninjatitle.txt
rename to strings/names/ninjatitle.txt
index f9776f56fed..41c5b338ba6 100644
--- a/config/names/ninjatitle.txt
+++ b/strings/names/ninjatitle.txt
@@ -1,46 +1,46 @@
-Agile
-Assassin
-Awesome
-Black
-Crimson
-Cruel
-Deep
-Dr
-Dragon
-Ender
-Grandmaster
-Grappler
-Gray
-Hunter
-Initiate
-Killer
-Liquid
-Master
-Merciful
-Merciless
-Nickel
-Night
-Nightshade
-Ninja
-Noob
-Orphaner
-Quick
-Remorseless
-Rogue
-Sensei
-Shinobi
-Silencing
-Silent
-Silver
-Singing
-Slayer
-Snake
-Solid
-Solidus
-Stalker
-Steel
-Strider
-Striker
-Swift
-Ulimate
+Agile
+Assassin
+Awesome
+Black
+Crimson
+Cruel
+Deep
+Dr
+Dragon
+Ender
+Grandmaster
+Grappler
+Gray
+Hunter
+Initiate
+Killer
+Liquid
+Master
+Merciful
+Merciless
+Nickel
+Night
+Nightshade
+Ninja
+Noob
+Orphaner
+Quick
+Remorseless
+Rogue
+Sensei
+Shinobi
+Silencing
+Silent
+Silver
+Singing
+Slayer
+Snake
+Solid
+Solidus
+Stalker
+Steel
+Strider
+Striker
+Swift
+Ulimate
Widower
\ No newline at end of file
diff --git a/config/names/plasmaman.txt b/strings/names/plasmaman.txt
similarity index 89%
rename from config/names/plasmaman.txt
rename to strings/names/plasmaman.txt
index 045d2c5a0c1..fa9f0637730 100644
--- a/config/names/plasmaman.txt
+++ b/strings/names/plasmaman.txt
@@ -1,118 +1,118 @@
-Actinium
-Aluminium
-Americium
-Antimony
-Argon
-Arsenic
-Astatine
-Barium
-Berkelium
-Beryllium
-Bismuth
-Bohrium
-Boron
-Bromine
-Cadmium
-Caesium
-Calcium
-Californium
-Carbon
-Cerium
-Chlorine
-Chromium
-Cobalt
-Copernicium
-Copper
-Curium
-Darmstadtium
-Dubnium
-Dysprosium
-Einsteinium
-Erbium
-Europium
-Fermium
-Flerovium
-Fluorine
-Francium
-Gadolinium
-Gallium
-Germanium
-Gold
-Hafnium
-Hassium
-Helium
-Holmium
-Hydrogen
-Indium
-Iodine
-Iridium
-Iron
-Krypton
-Lanthanum
-Lawrencium
-Lead
-Lithium
-Livermorium
-Lutetium
-Magnesium
-Manganese
-Meitnerium
-Mendelevium
-Mercury
-Molybdenum
-Neodymium
-Neon
-Neptunium
-Nickel
-Niobium
-Nitrogen
-Nobelium
-Osmium
-Oxygen
-Palladium
-Phosphorus
-Platinum
-Plutonium
-Polonium
-Potassium
-Praseodymium
-Promethium
-Protactinium
-Radium
-Radon
-Rhenium
-Rhodium
-Roentgenium
-Rubidium
-Ruthenium
-Rutherfordium
-Samarium
-Scandium
-Seaborgium
-Selenium
-Silicon
-Silver
-Sodium
-Strontium
-Sulfur
-Tantalum
-Technetium
-Tellurium
-Terbium
-Thallium
-Thorium
-Thulium
-Tin
-Titanium
-Tungsten
-Ununoctium
-Ununpentium
-Ununseptium
-Ununtrium
-Uranium
-Vanadium
-Xenon
-Ytterbium
-Yttrium
-Zinc
+Actinium
+Aluminium
+Americium
+Antimony
+Argon
+Arsenic
+Astatine
+Barium
+Berkelium
+Beryllium
+Bismuth
+Bohrium
+Boron
+Bromine
+Cadmium
+Caesium
+Calcium
+Californium
+Carbon
+Cerium
+Chlorine
+Chromium
+Cobalt
+Copernicium
+Copper
+Curium
+Darmstadtium
+Dubnium
+Dysprosium
+Einsteinium
+Erbium
+Europium
+Fermium
+Flerovium
+Fluorine
+Francium
+Gadolinium
+Gallium
+Germanium
+Gold
+Hafnium
+Hassium
+Helium
+Holmium
+Hydrogen
+Indium
+Iodine
+Iridium
+Iron
+Krypton
+Lanthanum
+Lawrencium
+Lead
+Lithium
+Livermorium
+Lutetium
+Magnesium
+Manganese
+Meitnerium
+Mendelevium
+Mercury
+Molybdenum
+Neodymium
+Neon
+Neptunium
+Nickel
+Niobium
+Nitrogen
+Nobelium
+Osmium
+Oxygen
+Palladium
+Phosphorus
+Platinum
+Plutonium
+Polonium
+Potassium
+Praseodymium
+Promethium
+Protactinium
+Radium
+Radon
+Rhenium
+Rhodium
+Roentgenium
+Rubidium
+Ruthenium
+Rutherfordium
+Samarium
+Scandium
+Seaborgium
+Selenium
+Silicon
+Silver
+Sodium
+Strontium
+Sulfur
+Tantalum
+Technetium
+Tellurium
+Terbium
+Thallium
+Thorium
+Thulium
+Tin
+Titanium
+Tungsten
+Ununoctium
+Ununpentium
+Ununseptium
+Ununtrium
+Uranium
+Vanadium
+Xenon
+Ytterbium
+Yttrium
+Zinc
Zirconium
\ No newline at end of file
diff --git a/strings/names/posibrain.txt b/strings/names/posibrain.txt
new file mode 100644
index 00000000000..119632bd815
--- /dev/null
+++ b/strings/names/posibrain.txt
@@ -0,0 +1,47 @@
+PBU
+HIU
+SINA
+ARMA
+OSI
+HBL
+MSO
+RR
+CHRI
+CDB
+HG
+XSI
+ORNG
+GUN
+KOR
+MET
+FRE
+XIS
+SLI
+PKP
+HOG
+RZH
+GOOF
+MRPR
+JJR
+FIRC
+INC
+PHL
+BGB
+ANTR
+MIW
+WJ
+JRD
+CHOC
+ANCL
+JLLO
+JNLG
+KOS
+TKRG
+XAL
+STLP
+CBOS
+DUNC
+FXMC
+DRSD
+COI
+CYBR
\ No newline at end of file
diff --git a/config/names/verbs.txt b/strings/names/verbs.txt
similarity index 86%
rename from config/names/verbs.txt
rename to strings/names/verbs.txt
index fc90f89e400..17bc127fd57 100644
--- a/config/names/verbs.txt
+++ b/strings/names/verbs.txt
@@ -1,632 +1,632 @@
-accept
-add
-admire
-admit
-advise
-afford
-agree
-alert
-allow
-amuse
-analyse
-announce
-annoy
-answer
-apologise
-appear
-applaud
-appreciate
-approve
-argue
-arrange
-arrest
-arrive
-ask
-attach
-attack
-attempt
-attend
-attract
-avoid
-back
-bake
-balance
-ban
-bang
-bare
-bat
-bathe
-battle
-beam
-beg
-behave
-belong
-bleach
-bless
-blind
-blink
-blot
-blush
-boast
-boil
-bolt
-bomb
-book
-bore
-borrow
-bounce
-bow
-box
-brake
-branch
-breathe
-bruise
-brush
-bubble
-bump
-burn
-bury
-buzz
-calculate
-call
-camp
-care
-carry
-carve
-cause
-challenge
-change
-charge
-chase
-cheat
-check
-cheer
-chew
-choke
-chop
-claim
-clap
-clean
-clear
-clip
-close
-coach
-coil
-collect
-colour
-comb
-command
-communicate
-compare
-compete
-complain
-complete
-concentrate
-concern
-confess
-confuse
-connect
-consider
-consist
-contain
-continue
-copy
-correct
-cough
-count
-cover
-crack
-crash
-crawl
-cross
-crush
-cry
-cure
-curl
-curve
-cycle
-dam
-damage
-dance
-dare
-decay
-deceive
-decide
-decorate
-delay
-delight
-deliver
-depend
-describe
-desert
-deserve
-destroy
-detect
-develop
-disagree
-disappear
-disapprove
-disarm
-discover
-dislike
-divide
-double
-doubt
-drag
-drain
-dream
-dress
-drip
-drop
-drown
-drum
-dry
-dust
-earn
-educate
-embarrass
-employ
-empty
-encourage
-end
-enjoy
-enter
-entertain
-escape
-examine
-excite
-excuse
-exercise
-exist
-expand
-expect
-explain
-explode
-extend
-face
-fade
-fail
-fancy
-fasten
-fax
-fear
-fence
-fetch
-file
-fill
-film
-fire
-fit
-fix
-flap
-flash
-float
-flood
-flow
-flower
-fold
-follow
-fool
-force
-form
-found
-frame
-frighten
-fry
-gather
-gaze
-glow
-glue
-grab
-grate
-grease
-greet
-grin
-grip
-groan
-guarantee
-guard
-guess
-guide
-hammer
-hand
-handle
-hang
-happen
-harass
-harm
-hate
-haunt
-head
-heal
-heap
-heat
-help
-hook
-hop
-hope
-hover
-hug
-hum
-hunt
-hurry
-identify
-ignore
-imagine
-impress
-improve
-include
-increase
-influence
-inform
-inject
-injure
-instruct
-intend
-interest
-interfere
-interrupt
-introduce
-invent
-invite
-irritate
-itch
-jail
-jam
-jog
-join
-joke
-judge
-juggle
-jump
-kick
-kill
-kiss
-kneel
-knit
-knock
-knot
-label
-land
-last
-laugh
-launch
-learn
-level
-license
-lick
-lie
-lighten
-like
-list
-listen
-live
-load
-lock
-long
-look
-love
-man
-manage
-march
-mark
-marry
-match
-mate
-matter
-measure
-meddle
-melt
-memorise
-mend
-messup
-milk
-mine
-miss
-mix
-moan
-moor
-mourn
-move
-muddle
-mug
-multiply
-murder
-nail
-name
-need
-nest
-nod
-note
-notice
-number
-obey
-object
-observe
-obtain
-occur
-offend
-offer
-open
-order
-overflow
-owe
-own
-pack
-paddle
-paint
-park
-part
-pass
-paste
-pat
-pause
-peck
-pedal
-peel
-peep
-perform
-permit
-phone
-pick
-pinch
-pine
-place
-plan
-plant
-play
-please
-plug
-point
-poke
-polish
-pop
-possess
-post
-pour
-practise
-pray
-preach
-precede
-prefer
-prepare
-present
-preserve
-press
-pretend
-prevent
-prick
-print
-produce
-program
-promise
-protect
-provide
-pull
-pump
-punch
-puncture
-punish
-push
-question
-queue
-race
-radiate
-rain
-raise
-reach
-realise
-receive
-recognise
-record
-reduce
-reflect
-refuse
-regret
-reign
-reject
-rejoice
-relax
-release
-rely
-remain
-remember
-remind
-remove
-repair
-repeat
-replace
-reply
-report
-reproduce
-request
-rescue
-retire
-return
-rhyme
-rinse
-risk
-rob
-rock
-roll
-rot
-rub
-ruin
-rule
-rush
-sack
-sail
-satisfy
-save
-saw
-scare
-scatter
-scold
-scorch
-scrape
-scratch
-scream
-screw
-scribble
-scrub
-seal
-search
-separate
-serve
-settle
-shade
-share
-shave
-shelter
-shiver
-shock
-shop
-shrug
-sigh
-sign
-signal
-sin
-sip
-ski
-skip
-slap
-slip
-slow
-smash
-smell
-smile
-smoke
-snatch
-sneeze
-sniff
-snore
-snow
-soak
-soothe
-sound
-spare
-spark
-sparkle
-spell
-spill
-spoil
-spot
-spray
-sprout
-squash
-squeak
-squeal
-squeeze
-stain
-stamp
-stare
-start
-stay
-steer
-step
-stir
-stitch
-stop
-store
-strap
-strengthen
-stretch
-strip
-stroke
-stuff
-subtract
-succeed
-suck
-suffer
-suggest
-suit
-supply
-support
-suppose
-surprise
-surround
-suspect
-suspend
-switch
-talk
-tame
-tap
-taste
-tease
-telephone
-tempt
-terrify
-test
-thank
-thaw
-tick
-tickle
-tie
-time
-tip
-tire
-touch
-tour
-tow
-trace
-trade
-train
-transport
-trap
-travel
-treat
-tremble
-trick
-trip
-trot
-trouble
-trust
-try
-tug
-tumble
-turn
-twist
-type
-undress
-unfasten
-unite
-unlock
-unpack
-untidy
-use
-vanish
-visit
-wail
-wait
-walk
-wander
-want
-warm
-warn
-wash
-waste
-watch
-water
-wave
-weigh
-welcome
-whine
-whip
-whirl
-whisper
-whistle
-wink
-wipe
-wish
-wobble
-wonder
-work
-worry
-wrap
-wreck
-wrestle
-wriggle
-yawn
-yell
-zip
+accept
+add
+admire
+admit
+advise
+afford
+agree
+alert
+allow
+amuse
+analyse
+announce
+annoy
+answer
+apologise
+appear
+applaud
+appreciate
+approve
+argue
+arrange
+arrest
+arrive
+ask
+attach
+attack
+attempt
+attend
+attract
+avoid
+back
+bake
+balance
+ban
+bang
+bare
+bat
+bathe
+battle
+beam
+beg
+behave
+belong
+bleach
+bless
+blind
+blink
+blot
+blush
+boast
+boil
+bolt
+bomb
+book
+bore
+borrow
+bounce
+bow
+box
+brake
+branch
+breathe
+bruise
+brush
+bubble
+bump
+burn
+bury
+buzz
+calculate
+call
+camp
+care
+carry
+carve
+cause
+challenge
+change
+charge
+chase
+cheat
+check
+cheer
+chew
+choke
+chop
+claim
+clap
+clean
+clear
+clip
+close
+coach
+coil
+collect
+colour
+comb
+command
+communicate
+compare
+compete
+complain
+complete
+concentrate
+concern
+confess
+confuse
+connect
+consider
+consist
+contain
+continue
+copy
+correct
+cough
+count
+cover
+crack
+crash
+crawl
+cross
+crush
+cry
+cure
+curl
+curve
+cycle
+dam
+damage
+dance
+dare
+decay
+deceive
+decide
+decorate
+delay
+delight
+deliver
+depend
+describe
+desert
+deserve
+destroy
+detect
+develop
+disagree
+disappear
+disapprove
+disarm
+discover
+dislike
+divide
+double
+doubt
+drag
+drain
+dream
+dress
+drip
+drop
+drown
+drum
+dry
+dust
+earn
+educate
+embarrass
+employ
+empty
+encourage
+end
+enjoy
+enter
+entertain
+escape
+examine
+excite
+excuse
+exercise
+exist
+expand
+expect
+explain
+explode
+extend
+face
+fade
+fail
+fancy
+fasten
+fax
+fear
+fence
+fetch
+file
+fill
+film
+fire
+fit
+fix
+flap
+flash
+float
+flood
+flow
+flower
+fold
+follow
+fool
+force
+form
+found
+frame
+frighten
+fry
+gather
+gaze
+glow
+glue
+grab
+grate
+grease
+greet
+grin
+grip
+groan
+guarantee
+guard
+guess
+guide
+hammer
+hand
+handle
+hang
+happen
+harass
+harm
+hate
+haunt
+head
+heal
+heap
+heat
+help
+hook
+hop
+hope
+hover
+hug
+hum
+hunt
+hurry
+identify
+ignore
+imagine
+impress
+improve
+include
+increase
+influence
+inform
+inject
+injure
+instruct
+intend
+interest
+interfere
+interrupt
+introduce
+invent
+invite
+irritate
+itch
+jail
+jam
+jog
+join
+joke
+judge
+juggle
+jump
+kick
+kill
+kiss
+kneel
+knit
+knock
+knot
+label
+land
+last
+laugh
+launch
+learn
+level
+license
+lick
+lie
+lighten
+like
+list
+listen
+live
+load
+lock
+long
+look
+love
+man
+manage
+march
+mark
+marry
+match
+mate
+matter
+measure
+meddle
+melt
+memorise
+mend
+messup
+milk
+mine
+miss
+mix
+moan
+moor
+mourn
+move
+muddle
+mug
+multiply
+murder
+nail
+name
+need
+nest
+nod
+note
+notice
+number
+obey
+object
+observe
+obtain
+occur
+offend
+offer
+open
+order
+overflow
+owe
+own
+pack
+paddle
+paint
+park
+part
+pass
+paste
+pat
+pause
+peck
+pedal
+peel
+peep
+perform
+permit
+phone
+pick
+pinch
+pine
+place
+plan
+plant
+play
+please
+plug
+point
+poke
+polish
+pop
+possess
+post
+pour
+practise
+pray
+preach
+precede
+prefer
+prepare
+present
+preserve
+press
+pretend
+prevent
+prick
+print
+produce
+program
+promise
+protect
+provide
+pull
+pump
+punch
+puncture
+punish
+push
+question
+queue
+race
+radiate
+rain
+raise
+reach
+realise
+receive
+recognise
+record
+reduce
+reflect
+refuse
+regret
+reign
+reject
+rejoice
+relax
+release
+rely
+remain
+remember
+remind
+remove
+repair
+repeat
+replace
+reply
+report
+reproduce
+request
+rescue
+retire
+return
+rhyme
+rinse
+risk
+rob
+rock
+roll
+rot
+rub
+ruin
+rule
+rush
+sack
+sail
+satisfy
+save
+saw
+scare
+scatter
+scold
+scorch
+scrape
+scratch
+scream
+screw
+scribble
+scrub
+seal
+search
+separate
+serve
+settle
+shade
+share
+shave
+shelter
+shiver
+shock
+shop
+shrug
+sigh
+sign
+signal
+sin
+sip
+ski
+skip
+slap
+slip
+slow
+smash
+smell
+smile
+smoke
+snatch
+sneeze
+sniff
+snore
+snow
+soak
+soothe
+sound
+spare
+spark
+sparkle
+spell
+spill
+spoil
+spot
+spray
+sprout
+squash
+squeak
+squeal
+squeeze
+stain
+stamp
+stare
+start
+stay
+steer
+step
+stir
+stitch
+stop
+store
+strap
+strengthen
+stretch
+strip
+stroke
+stuff
+subtract
+succeed
+suck
+suffer
+suggest
+suit
+supply
+support
+suppose
+surprise
+surround
+suspect
+suspend
+switch
+talk
+tame
+tap
+taste
+tease
+telephone
+tempt
+terrify
+test
+thank
+thaw
+tick
+tickle
+tie
+time
+tip
+tire
+touch
+tour
+tow
+trace
+trade
+train
+transport
+trap
+travel
+treat
+tremble
+trick
+trip
+trot
+trouble
+trust
+try
+tug
+tumble
+turn
+twist
+type
+undress
+unfasten
+unite
+unlock
+unpack
+untidy
+use
+vanish
+visit
+wail
+wait
+walk
+wander
+want
+warm
+warn
+wash
+waste
+watch
+water
+wave
+weigh
+welcome
+whine
+whip
+whirl
+whisper
+whistle
+wink
+wipe
+wish
+wobble
+wonder
+work
+worry
+wrap
+wreck
+wrestle
+wriggle
+yawn
+yell
+zip
zoom
\ No newline at end of file
diff --git a/config/names/wizardfirst.txt b/strings/names/wizardfirst.txt
similarity index 87%
rename from config/names/wizardfirst.txt
rename to strings/names/wizardfirst.txt
index 9dcab3f005a..8c9e1e35fed 100644
--- a/config/names/wizardfirst.txt
+++ b/strings/names/wizardfirst.txt
@@ -1,36 +1,36 @@
-Alatar
-Archchancellor
-Boccob
-Circe
-Dumbledor
-Elminister
-Gandalf
-Grimm
-Gulstaff
-Houdini
-Jim
-Kaschei
-Khelben
-Kreol
-Lina
-Merlin
-Mogan
-Mordenkainen
-Morgan
-Mystryl
-Nihilus
-Palando
-Prospero
-Radagast
-Raistlin
-Rasputin
-Saruman
-Tenser
-Terefi
-Tzeentch
-Urza
-Vaarsuvius
-Vecna
-Yoda
-Zagyg
+Alatar
+Archchancellor
+Boccob
+Circe
+Dumbledor
+Elminister
+Gandalf
+Grimm
+Gulstaff
+Houdini
+Jim
+Kaschei
+Khelben
+Kreol
+Lina
+Merlin
+Mogan
+Mordenkainen
+Morgan
+Mystryl
+Nihilus
+Palando
+Prospero
+Radagast
+Raistlin
+Rasputin
+Saruman
+Tenser
+Terefi
+Tzeentch
+Urza
+Vaarsuvius
+Vecna
+Yoda
+Zagyg
Zul
\ No newline at end of file
diff --git a/config/names/wizardsecond.txt b/strings/names/wizardsecond.txt
similarity index 90%
rename from config/names/wizardsecond.txt
rename to strings/names/wizardsecond.txt
index 9193ef1e97d..4233ad54307 100644
--- a/config/names/wizardsecond.txt
+++ b/strings/names/wizardsecond.txt
@@ -1,39 +1,39 @@
-Dark
-Darkmagic
-Darko
-Gray
-Honko
-Inverse
-le Fay
-of Void
-Shado
-Smith
-the All Knowing
-the Amazing
-the Bandit Killer
-the Benevolent
-the Blue
-the Brown
-the Conquerer
-the Deathless
-the Destroyer
-the Dragon Spooker
-the Emperor
-the Gray
-the Great
-the Magician
-the Powerful
-the Raven
-the Red
-the Remorseful
-the Seething
-the Sorcelator
-the Spiral King
-the Unending
-the Unstoppable
-the Weeping
-the White
-the Wise
-Unseen
-Weatherwax
+Dark
+Darkmagic
+Darko
+Gray
+Honko
+Inverse
+le Fay
+of Void
+Shado
+Smith
+the All Knowing
+the Amazing
+the Bandit Killer
+the Benevolent
+the Blue
+the Brown
+the Conquerer
+the Deathless
+the Destroyer
+the Dragon Spooker
+the Emperor
+the Gray
+the Great
+the Magician
+the Powerful
+the Raven
+the Red
+the Remorseful
+the Seething
+the Sorcelator
+the Spiral King
+the Unending
+the Unstoppable
+the Weeping
+the White
+the Wise
+Unseen
+Weatherwax
Yagg
\ No newline at end of file
diff --git a/config/sillytips.txt b/strings/sillytips.txt
similarity index 100%
rename from config/sillytips.txt
rename to strings/sillytips.txt
diff --git a/config/tips.txt b/strings/tips.txt
similarity index 98%
rename from config/tips.txt
rename to strings/tips.txt
index dc9c8931d71..0293e53c141 100644
--- a/config/tips.txt
+++ b/strings/tips.txt
@@ -155,7 +155,7 @@ As a Cultist, do not cause too much chaos before your objective is completed. If
As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face.
As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, stamina damage to Ratvarian scum, and some damage to fellow cultists of Nar-Sie nearby, but will create a fire where the rune stands on use.
As a Cultist, you can create an army of manifested goons using a combination of the Manifest rune, which creates homunculi from ghosts, and the Blood Drain rune, which drains life from anyone standing on any blood drain rune.
-As a Servant, your clockwork Slab fits in pockets and does not need to be held to communicate with other Servants.
+As a Servant, your Clockwork Slab fits in pockets and does not need to be held to communicate with other Servants.
As a Servant, remember that while the selection of scripture and tools Servant cyborgs get is limited, it is still extremely useful, and some of it is unique; for example, engineering and janitor cyborgs get a proselytizer that can use their own power in addition to its own.
As a Servant, the Judicial Visor is an effective defensive combat tool in small spaces, as it stuns and mutes anyone still on it after 3 seconds. It is also useful for stunning already-stunned enemies for long enough to convert them or finish them off.
As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components.
@@ -171,13 +171,13 @@ As a Servant, you can deconstruct a Clockwork Wall with a Clockwork Proselytizer
As a Servant, Volt Void will drain power from nearby Sigils of Transmission to up to double the damage of each volt ray. It'll even use your own power if you happen to be a cyborg!
As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee, bullet, and bomb attacks. The gauntlets provided are also immune to elecricity.
As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation.
-As a Servant, defending the Gateway to the Celestial Derelict is your ultimate goal, and it is heavily recommended that you defend it with all the tools you have avalible, including Ocular Wardens, Mania Motors, Mending Motors, and other, not mentioned things.
+As a Servant, creating and activating the Gateway to the Celestial Derelict is your ultimate goal, and you must defend it with all the tools you have available.
As a Servant, once Ratvar has arrived, all of your tools gain a massive boost in power and will, in general, have no cost and work at double speed.
As a Servant, you can impale human targets with a Ratvarian Spear by pulling them, then attacking them. This does massive damage and stuns them, and should effectively win the fight.
As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute, burn, and oxygen damage to toxin, effectively halving the damage they have. Clockwork Floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness.
As a Servant, Belligerent and Taunting Tirade are extremely powerful for disabling and disrupting large groups of enemies, though they render you somewhat vulnerable, as Belligerent requires that you stand still, and Taunting Tirade makes you extremely obvious.
As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells.
-As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a proselytizer or a mending motor. Damage from other sources will also similarly weaken structures.
+As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Proselytizer or Mending Mantra. Damage from other sources will also similarly weaken structures.
You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water.
As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least.
As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways.
diff --git a/tgstation.dme b/tgstation.dme
index 4336e73df60..d8a1b779610 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -23,6 +23,7 @@
#include "code\__DATASTRUCTURES\priority_queue.dm"
#include "code\__DATASTRUCTURES\stacks.dm"
#include "code\__DEFINES\admin.dm"
+#include "code\__DEFINES\antagonists.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\atom_hud.dm"
#include "code\__DEFINES\callbacks.dm"
@@ -132,6 +133,7 @@
#include "code\_onclick\hud\blob_overmind.dm"
#include "code\_onclick\hud\blobbernauthud.dm"
#include "code\_onclick\hud\clockwork_marauder.dm"
+#include "code\_onclick\hud\constructs.dm"
#include "code\_onclick\hud\devil.dm"
#include "code\_onclick\hud\drones.dm"
#include "code\_onclick\hud\fullscreen.dm"
@@ -213,6 +215,7 @@
#include "code\datums\dog_fashion.dm"
#include "code\datums\emotes.dm"
#include "code\datums\forced_movement.dm"
+#include "code\datums\holocall.dm"
#include "code\datums\hud.dm"
#include "code\datums\map_config.dm"
#include "code\datums\martial.dm"
@@ -422,7 +425,6 @@
#include "code\game\gamemodes\clock_cult\clock_structures\geis_binding.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\interdiction_lens.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\mania_motor.dm"
-#include "code\game\gamemodes\clock_cult\clock_structures\mending_motor.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\ocular_warden.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\ratvar_the_clockwork_justicar.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\taunting_trail.dm"
@@ -1940,6 +1942,7 @@
#include "code\modules\research\designs\mechfabricator_designs.dm"
#include "code\modules\research\designs\medical_designs.dm"
#include "code\modules\research\designs\power_designs.dm"
+#include "code\modules\research\designs\smelting_designs.dm"
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index d52500b9d64..531fb00530b 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1 @@
-@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.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 d2ccdeaee1c..7f024a02be8 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 p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}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;o
=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(190),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:{})},{190:190}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var a=t(84)("unscopables"),r=Array.prototype;void 0==r[a]&&t(32)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var a=t(39);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments,c=u.length>2?u[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-p,o-s),f=1;for(s>p&&p+l>s&&(f=-1,p+=l-1,s+=l-1);l-- >0;)p in n?n[s]=n[p]:delete n[s],s+=f,p+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,p=r(s>1?o[1]:void 0,n),u=s>2?o[2]:void 0,c=void 0===u?n:r(u,n);c>p;)e[p++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var a=t(79),r=t(80),i=t(77);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var a=t(18),r=t(35),i=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,p=3==t,u=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),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(u)return!1;return c?-1:p||u?u:w}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var a=t(39),r=t(37),i=t(84)("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)}},{37:37,39:39,84:84}],11:[function(t,e,n){var a=t(12),r=t(84)("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}},{12:12,84:84}],12:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var a=t(47),r=t(32),i=t(61),o=t(18),s=t(70),p=t(19),u=t(28),c=t(43),l=t(45),f=t(83)("id"),d=t(31),h=t(39),m=t(66),v=t(20),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=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]},x=function(t,e){var n,a=_(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&&u(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=x(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!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return p(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(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:x,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)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var a=t(28),r=t(11);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}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var a=t(32),r=t(61),i=t(5),o=t(39),s=t(70),p=t(28),u=t(9),c=t(31),l=t(83)("weak"),f=Object.isExtensible||o,d=u(5),h=u(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&&p(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}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var a=t(30),r=t(23),i=t(62),o=t(61),s=t(28),p=t(70),u=t(39),c=t(25),l=t(44),f=t(67);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&&!u(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!u(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,P=k[b](m?{}:-0,1)!=k,C=c(function(){k.has(1)}),E=l(function(t){new g(t)});E||(g=e(function(e,n){p(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)}),(C||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],18:[function(t,e,n){var a=t(3);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)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var a=t(39),r=t(30).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var a=t(47);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}},{47:47}],23:[function(t,e,n){var a=t(30),r=t(17),i=t(32),o=t(62),s=t(18),p="prototype",u=function(t,e,n){var c,l,f,d,h=t&u.F,m=t&u.G,v=t&u.S,g=t&u.P,b=t&u.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});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),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,e.exports=u},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var a=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var a=t(32),r=t(62),i=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var p=s(t),u=""[t];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,p,u)),a(RegExp.prototype,p,2==e?function(t,e){return u.call(t,this,e)}:function(t){return u.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var a=t(5);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}},{5:5}],28:[function(t,e,n){var a=t(18),r=t(41),i=t(36),o=t(5),s=t(80),p=t(85);e.exports=function(t,e,n,u){var c,l,f,d=p(t),h=a(n,u,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)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var a=t(79),r=t(47).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))}},{47:47,79:79}],30:[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)},{}],31:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],32:[function(t,e,n){var a=t(47),r=t(60);e.exports=t(20)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[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)}},{}],35:[function(t,e,n){var a=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var a=t(46),r=t(84)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{46:46,84:84}],37:[function(t,e,n){var a=t(12);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{12:12}],38:[function(t,e,n){var a=t(39),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var a=t(39),r=t(12),i=t(84)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var a=t(5);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}}},{5:5}],42:[function(t,e,n){"use strict";var a=t(47),r=t(60),i=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var a=t(49),r=t(23),i=t(62),o=t(32),s=t(31),p=t(46),u=t(42),c=t(67),l=t(47).getProto,f=t(84)("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){u(n,e,b);var w,k,P=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)}},C=e+" Iterator",E=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,C,!0),!a&&s(A,h)&&o(M,f,g),E&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),p[e]=T,p[C]=g,y)if(w={values:E?T:P(v),keys:_?T:P(m),entries:E?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var a=t(84)("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(){n=!0},i[a]=function(){return o},t(i)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[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}},{}],48:[function(t,e,n){var a=t(47),r=t(79);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,p=0;s>p;)if(i[n=o[p++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[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}},{}],51:[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)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var a,r,i,o=t(30),s=t(76).set,p=o.MutationObserver||o.WebKitMutationObserver,u=o.process,c=o.Promise,l="process"==t(12)(u),f=function(){var t,e,n;for(l&&(t=u.domain)&&(u.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(){u.nextTick(f)};else if(p){var d=1,h=document.createTextNode("");new p(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&&u.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var a=t(47),r=t(81),i=t(35);e.exports=t(25)(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,p=1,u=a.getKeys,c=a.getSymbols,l=a.isEnum;s>p;)for(var f,d=i(o[p++]),h=c?u(d).concat(c(d)):u(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var a=t(23),r=t(17),i=t(25);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)}},{17:17,23:23,25:25}],56:[function(t,e,n){var a=t(47),r=t(79),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{47:47,79:79}],57:[function(t,e,n){var a=t(47),r=t(5),i=t(30).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var a=t(59),r=t(34),i=t(3);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,p=!1;e>o;)(n[o]=arguments[o++])===s&&(p=!0);return function(){var a,i=this,o=arguments,u=o.length,c=0,l=0;if(!p&&!u)return r(t,n,i);if(a=n.slice(),p)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;u>l;)a.push(o[l++]);return r(t,a,i)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var a=t(62);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var a=t(30),r=t(32),i=t(83)("src"),o="toString",s=Function[o],p=(""+s).split(o);t(17).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]:p.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)})},{17:17,30:30,32:32,83:83}],63:[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)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var a=t(47).getDesc,r=t(39),i=t(5),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(18)(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}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var a=t(30),r=t(47),i=t(20),o=t(84)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var a=t(47).setDesc,r=t(31),i=t(84)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var a=t(30),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{30:30}],69:[function(t,e,n){var a=t(5),r=t(3),i=t(84)("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)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var a=t(78),r=t(19);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var a=t(40),r=t(19);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{19:19,40:40}],73:[function(t,e,n){var a=t(80),r=t(74),i=t(19);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c)return s;""==u&&(u=" ");var l=c-p,f=r.call(u,Math.ceil(l/u.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var a=t(78),r=t(19);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}},{19:19,78:78}],75:[function(t,e,n){var a=t(23),r=t(19),i=t(25),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",p="
",u=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]()||p[t]()!=p}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{19:19,23:23,25:25}],76:[function(t,e,n){var a,r,i,o=t(18),s=t(34),p=t(33),u=t(21),c=t(30),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(12)(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 u("script")?function(t){p.appendChild(u("script"))[g]=function(){p.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var a=t(78),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{78:78}],78:[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)}},{}],79:[function(t,e,n){var a=t(35),r=t(19);e.exports=function(t){return a(r(t))}},{19:19,35:35}],80:[function(t,e,n){var a=t(78),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var a=t(19);e.exports=function(t){return Object(a(t))}},{19:19}],82:[function(t,e,n){var a=t(39);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")}},{39:39}],83:[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))}},{}],84:[function(t,e,n){var a=t(68)("wks"),r=t(83),i=t(30).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var a=t(11),r=t(84)("iterator"),i=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var a,r=t(47),i=t(23),o=t(20),s=t(60),p=t(33),u=t(21),c=t(31),l=t(12),f=t(34),d=t(25),h=t(5),m=t(3),v=t(39),g=t(81),b=t(79),y=t(78),_=t(77),x=t(80),w=t(35),k=t(83)("__proto__"),P=t(9),C=t(8)(!1),E=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(u("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 M(t,e)}catch(n){}return c(t,e)?s(!E.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=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:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=u("iframe"),n=D,a=">";for(e.style.display="none",p.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("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(){p&&A.call(p)}),"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),p=0;o>p;p++)s[p]="String"==a?this.charAt(r+p):this[r+p];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(37)});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";
-}})},{12:12,20:20,21:21,23:23,25:25,3:3,31:31,33:33,34:34,35:35,37:37,39:39,47:47,5:5,60:60,77:77,78:78,79:79,8:8,80:80,81:81,83:83,9:9}],87:[function(t,e,n){var a=t(23);a(a.P,"Array",{copyWithin:t(6)}),t(4)("copyWithin")},{23:23,4:4,6:6}],88:[function(t,e,n){var a=t(23);a(a.P,"Array",{fill:t(7)}),t(4)("fill")},{23:23,4:4,7:7}],89:[function(t,e,n){"use strict";var a=t(23),r=t(9)(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(4)(i)},{23:23,4:4,9:9}],90:[function(t,e,n){"use strict";var a=t(23),r=t(9)(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(4)(i)},{23:23,4:4,9:9}],91:[function(t,e,n){"use strict";var a=t(18),r=t(23),i=t(81),o=t(41),s=t(36),p=t(80),u=t(85);r(r.S+r.F*!t(44)(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=u(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=p(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}})},{18:18,23:23,36:36,41:41,44:44,80:80,81:81,85:85}],92:[function(t,e,n){"use strict";var a=t(4),r=t(45),i=t(46),o=t(79);e.exports=t(43)(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")},{4:4,43:43,45:45,46:46,79:79}],93:[function(t,e,n){"use strict";var a=t(23);a(a.S+a.F*t(25)(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}})},{23:23,25:25}],94:[function(t,e,n){t(66)("Array")},{66:66}],95:[function(t,e,n){"use strict";var a=t(47),r=t(39),i=t(84)("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}})},{39:39,47:47,84:84}],96:[function(t,e,n){var a=t(47).setDesc,r=t(60),i=t(31),o=Function.prototype,s=/^\s*function ([^ (]*)/,p="name";p in o||t(20)&&a(o,p,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,p)||a(this,p,r(5,e)),e}})},{20:20,31:31,47:47,60:60}],97:[function(t,e,n){"use strict";var a=t(13);t(16)("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)},{13:13,16:16}],98:[function(t,e,n){var a=t(23),r=t(51),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))}})},{23:23,51:51}],99:[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(23);r(r.S,"Math",{asinh:a})},{23:23}],100:[function(t,e,n){var a=t(23);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{23:23}],101:[function(t,e,n){var a=t(23),r=t(52);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{23:23,52:52}],102:[function(t,e,n){var a=t(23);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{23:23}],103:[function(t,e,n){var a=t(23),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{23:23}],104:[function(t,e,n){var a=t(23);a(a.S,"Math",{expm1:t(50)})},{23:23,50:50}],105:[function(t,e,n){var a=t(23),r=t(52),i=Math.pow,o=i(2,-52),s=i(2,-23),p=i(2,127)*(2-s),u=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 u>a?i*c(a/u/s)*u*s:(e=(1+s/o)*a,n=e-(e-a),n>p||n!=n?i*(1/0):i*n)}})},{23:23,52:52}],106:[function(t,e,n){var a=t(23),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,p=s.length,u=0;p>o;)n=r(s[o++]),n>u?(a=u/n,i=i*a*a+1,u=n):n>0?(a=n/u,i+=a*a):i+=n;return u===1/0?1/0:u*Math.sqrt(i)}})},{23:23}],107:[function(t,e,n){var a=t(23),r=Math.imul;a(a.S+a.F*t(25)(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)}})},{23:23,25:25}],108:[function(t,e,n){var a=t(23);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{23:23}],109:[function(t,e,n){var a=t(23);a(a.S,"Math",{log1p:t(51)})},{23:23,51:51}],110:[function(t,e,n){var a=t(23);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{23:23}],111:[function(t,e,n){var a=t(23);a(a.S,"Math",{sign:t(52)})},{23:23,52:52}],112:[function(t,e,n){var a=t(23),r=t(50),i=Math.exp;a(a.S+a.F*t(25)(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)}})},{23:23,25:25,50:50}],113:[function(t,e,n){var a=t(23),r=t(50),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))}})},{23:23,50:50}],114:[function(t,e,n){var a=t(23);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{23:23}],115:[function(t,e,n){"use strict";var a=t(47),r=t(30),i=t(31),o=t(12),s=t(82),p=t(25),u=t(75).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():u(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,p=e.slice(2),c=0,l=p.length;l>c;c++)if(o=p.charCodeAt(c),48>o||o>r)return NaN;return parseInt(p,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?p(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(20)?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(62)(r,c,l))},{12:12,20:20,25:25,30:30,31:31,47:47,62:62,75:75,82:82}],116:[function(t,e,n){var a=t(23);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{23:23}],117:[function(t,e,n){var a=t(23),r=t(30).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{23:23,30:30}],118:[function(t,e,n){var a=t(23);a(a.S,"Number",{isInteger:t(38)})},{23:23,38:38}],119:[function(t,e,n){var a=t(23);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{23:23}],120:[function(t,e,n){var a=t(23),r=t(38),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{23:23,38:38}],121:[function(t,e,n){var a=t(23);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{23:23}],122:[function(t,e,n){var a=t(23);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{23:23}],123:[function(t,e,n){var a=t(23);a(a.S,"Number",{parseFloat:parseFloat})},{23:23}],124:[function(t,e,n){var a=t(23);a(a.S,"Number",{parseInt:parseInt})},{23:23}],125:[function(t,e,n){var a=t(23);a(a.S+a.F,"Object",{assign:t(54)})},{23:23,54:54}],126:[function(t,e,n){var a=t(39);t(55)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{39:39,55:55}],127:[function(t,e,n){var a=t(79);t(55)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{55:55,79:79}],128:[function(t,e,n){t(55)("getOwnPropertyNames",function(){return t(29).get})},{29:29,55:55}],129:[function(t,e,n){var a=t(81);t(55)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{55:55,81:81}],130:[function(t,e,n){var a=t(39);t(55)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{39:39,55:55}],131:[function(t,e,n){var a=t(39);t(55)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{39:39,55:55}],132:[function(t,e,n){var a=t(39);t(55)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{39:39,55:55}],133:[function(t,e,n){var a=t(23);a(a.S,"Object",{is:t(64)})},{23:23,64:64}],134:[function(t,e,n){var a=t(81);t(55)("keys",function(t){return function(e){return t(a(e))}})},{55:55,81:81}],135:[function(t,e,n){var a=t(39);t(55)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{39:39,55:55}],136:[function(t,e,n){var a=t(39);t(55)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{39:39,55:55}],137:[function(t,e,n){var a=t(23);a(a.S,"Object",{setPrototypeOf:t(65).set})},{23:23,65:65}],138:[function(t,e,n){"use strict";var a=t(11),r={};r[t(84)("toStringTag")]="z",r+""!="[object z]"&&t(62)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{11:11,62:62,84:84}],139:[function(t,e,n){"use strict";var a,r=t(47),i=t(49),o=t(30),s=t(18),p=t(11),u=t(23),c=t(39),l=t(5),f=t(3),d=t(70),h=t(28),m=t(65).set,v=t(64),g=t(84)("species"),b=t(69),y=t(53),_="Promise",x=o.process,w="process"==p(x),k=o[_],P=function(t){var e=new k(function(){});return t&&(e.constructor=Object),k.resolve(e)===e},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&&P(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(20)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),E=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},S=function(t){var e=l(t)[g];return void 0!=e?e:t},A=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},O=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)},T=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,p=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?p(TypeError("Promise-chain cycle")):(i=A(n))?i.call(n,s,p):s(n)):p(a)}catch(u){p(u)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;R(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)})}},R=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||!R(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(),M(e,!0))},L=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=A(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(L,a,1),s(j,a,1))}catch(r){j.call(a,r)}}):(n.v=t,n.s=1,M(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(L,e,1),s(j,e,1))}catch(n){j.call(e,n)}},t(61)(k.prototype,{then:function(t,e){var n=new O(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)}})),u(u.G+u.W+u.F*!C,{Promise:k}),t(67)(k,_),t(66)(_),a=t(17)[_],u(u.S+u.F*!C,_,{reject:function(t){var e=new O(this),n=e.reject;return n(t),e.promise}}),u(u.S+u.F*(!C||P(!0)),_,{resolve:function(t){if(t instanceof k&&E(t.constructor,this))return t;var e=new O(this),n=e.resolve;return n(t),e.promise}}),u(u.S+u.F*!(C&&t(44)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=S(this),n=new O(e),a=n.resolve,i=n.reject,o=[],s=T(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=S(this),n=new O(e),a=n.reject,r=T(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{11:11,17:17,18:18,20:20,23:23,28:28,3:3,30:30,39:39,44:44,47:47,49:49,5:5,53:53,61:61,64:64,65:65,66:66,67:67,69:69,70:70,84:84}],140:[function(t,e,n){var a=t(23),r=Function.apply;a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,n)}})},{23:23}],141:[function(t,e,n){var a=t(47),r=t(23),i=t(3),o=t(5),s=t(39),p=Function.bind||t(17).Function.prototype.bind;r(r.S+r.F*t(25)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t);var n=arguments.length<3?t:i(arguments[2]);if(t==n){if(void 0!=e)switch(o(e).length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(p.apply(t,r))}var u=n.prototype,c=a.create(s(u)?u:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{17:17,23:23,25:25,3:3,39:39,47:47,5:5}],142:[function(t,e,n){var a=t(47),r=t(23),i=t(5);r(r.S+r.F*t(25)(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}}})},{23:23,25:25,47:47,5:5}],143:[function(t,e,n){var a=t(23),r=t(47).getDesc,i=t(5);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{23:23,47:47,5:5}],144:[function(t,e,n){"use strict";var a=t(23),r=t(5),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(42)(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)}})},{23:23,42:42,5:5}],145:[function(t,e,n){var a=t(47),r=t(23),i=t(5);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{23:23,47:47,5:5}],146:[function(t,e,n){var a=t(23),r=t(47).getProto,i=t(5);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{23:23,47:47,5:5}],147:[function(t,e,n){function a(t,e){var n,o,u=arguments.length<3?t:arguments[2];return p(t)===u?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(u):void 0:s(o=r.getProto(t))?a(o,e,u):void 0}var r=t(47),i=t(31),o=t(23),s=t(39),p=t(5);o(o.S,"Reflect",{get:a})},{23:23,31:31,39:39,47:47,5:5}],148:[function(t,e,n){var a=t(23);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{23:23}],149:[function(t,e,n){var a=t(23),r=t(5),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{23:23,5:5}],150:[function(t,e,n){var a=t(23);a(a.S,"Reflect",{ownKeys:t(57)})},{23:23,57:57}],151:[function(t,e,n){var a=t(23),r=t(5),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{23:23,5:5}],152:[function(t,e,n){var a=t(23),r=t(65);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{23:23,65:65}],153:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(p(t),e);if(!f){if(u(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&u(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(47),i=t(31),o=t(23),s=t(60),p=t(5),u=t(39);o(o.S,"Reflect",{set:a})},{23:23,31:31,39:39,47:47,5:5,60:60}],154:[function(t,e,n){var a=t(47),r=t(30),i=t(40),o=t(27),s=r.RegExp,p=s,u=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(20)||f&&!t(25)(function(){return l[t(84)("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 p(n&&!a?t.source:t,e):p((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(p),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return p[t]},set:function(e){p[t]=e}})}),u.constructor=s,s.prototype=u,t(62)(r,"RegExp",s)),t(66)("RegExp")},{20:20,25:25,27:27,30:30,40:40,47:47,62:62,66:66,84:84}],155:[function(t,e,n){var a=t(47);t(20)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(27)})},{20:20,27:27,47:47}],156:[function(t,e,n){t(26)("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+"")}})},{26:26}],157:[function(t,e,n){t(26)("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)}})},{26:26}],158:[function(t,e,n){t(26)("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+"")}})},{26:26}],159:[function(t,e,n){t(26)("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)}})},{26:26}],160:[function(t,e,n){"use strict";var a=t(13);t(16)("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)},{13:13,16:16}],161:[function(t,e,n){"use strict";var a=t(23),r=t(71)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{23:23,71:71}],162:[function(t,e,n){"use strict";var a=t(23),r=t(80),i=t(72),o="endsWith",s=""[o];a(a.P+a.F*t(24)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,p=r(e.length),u=void 0===a?p:Math.min(r(a),p),c=t+"";return s?s.call(e,c,u):e.slice(u-c.length,u)===c}})},{23:23,24:24,72:72,80:80}],163:[function(t,e,n){var a=t(23),r=t(77),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("")}})},{23:23,77:77}],164:[function(t,e,n){"use strict";var a=t(23),r=t(72),i="includes";a(a.P+a.F*t(24)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{23:23,24:24,72:72}],165:[function(t,e,n){"use strict";var a=t(71)(!0);t(43)(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})})},{43:43,71:71}],166:[function(t,e,n){var a=t(23),r=t(79),i=t(80);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],p=0;n>p;)s.push(e[p++]+""),o>p&&s.push(a[p]+"");return s.join("")}})},{23:23,79:79,80:80}],167:[function(t,e,n){var a=t(23);a(a.P,"String",{repeat:t(74)})},{23:23,74:74}],168:[function(t,e,n){"use strict";var a=t(23),r=t(80),i=t(72),o="startsWith",s=""[o];a(a.P+a.F*t(24)(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)),p=t+"";return s?s.call(e,p,a):e.slice(a,a+p.length)===p}})},{23:23,24:24,72:72,80:80}],169:[function(t,e,n){"use strict";t(75)("trim",function(t){return function(){return t(this,3)}})},{75:75}],170:[function(t,e,n){"use strict";var a=t(47),r=t(30),i=t(31),o=t(20),s=t(23),p=t(62),u=t(25),c=t(68),l=t(67),f=t(83),d=t(84),h=t(48),m=t(29),v=t(22),g=t(37),b=t(5),y=t(79),_=t(60),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&&u(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=u(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))},p(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(49)&&p(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)},{20:20,22:22,23:23,25:25,29:29,30:30,31:31,37:37,47:47,48:48,49:49,5:5,60:60,62:62,67:67,68:68,79:79,83:83,84:84}],171:[function(t,e,n){"use strict";var a=t(47),r=t(62),i=t(15),o=t(39),s=t(31),p=i.frozenStore,u=i.WEAK,c=Object.isExtensible||o,l={},f=t(16)("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 p(this).get(t);if(s(t,u))return t[u][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=p(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{15:15,16:16,31:31,39:39,47:47,62:62}],172:[function(t,e,n){"use strict";var a=t(15);t(16)("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)},{15:15,16:16}],173:[function(t,e,n){"use strict";var a=t(23),r=t(8)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(4)("includes")},{23:23,4:4,8:8}],174:[function(t,e,n){var a=t(23);a(a.P,"Map",{toJSON:t(14)("Map")})},{14:14,23:23}],175:[function(t,e,n){var a=t(23),r=t(56)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{23:23,56:56}],176:[function(t,e,n){var a=t(47),r=t(23),i=t(57),o=t(79),s=t(60);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),p=a.setDesc,u=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=u(r,e=c[f++]),e in l?p(l,e,s(0,n)):l[e]=n;return l}})},{23:23,47:47,57:57,60:60,79:79}],177:[function(t,e,n){var a=t(23),r=t(56)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{23:23,56:56}],178:[function(t,e,n){var a=t(23),r=t(63)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{23:23,63:63}],179:[function(t,e,n){var a=t(23);a(a.P,"Set",{toJSON:t(14)("Set")})},{14:14,23:23}],180:[function(t,e,n){"use strict";var a=t(23),r=t(71)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{23:23,71:71}],181:[function(t,e,n){"use strict";var a=t(23),r=t(73);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{23:23,73:73}],182:[function(t,e,n){"use strict";var a=t(23),r=t(73);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{23:23,73:73}],183:[function(t,e,n){"use strict";t(75)("trimLeft",function(t){return function(){return t(this,1)}})},{75:75}],184:[function(t,e,n){"use strict";t(75)("trimRight",function(t){return function(){return t(this,2)}})},{75:75}],185:[function(t,e,n){var a=t(47),r=t(23),i=t(18),o=t(17).Array||Array,s={},p=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))})};p("pop,reverse,shift,keys,values,entries",1),p("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),p("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{17:17,18:18,23:23,47:47}],186:[function(t,e,n){t(92);var a=t(30),r=t(32),i=t(46),o=t(84)("iterator"),s=a.NodeList,p=a.HTMLCollection,u=s&&s.prototype,c=p&&p.prototype,l=i.NodeList=i.HTMLCollection=i.Array;u&&!u[o]&&r(u,o,l),c&&!c[o]&&r(c,o,l)},{30:30,32:32,46:46,84:84,92:92}],187:[function(t,e,n){var a=t(23),r=t(76);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{23:23,76:76}],188:[function(t,e,n){var a=t(30),r=t(23),i=t(34),o=t(58),s=a.navigator,p=!!s&&/MSIE .\./.test(s.userAgent),u=function(t){return p?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*p,{setTimeout:u(a.setTimeout),setInterval:u(a.setInterval)})},{23:23,30:30,34:34,58:58}],189:[function(t,e,n){t(86),t(170),t(125),t(133),t(137),t(138),t(126),t(136),t(135),t(131),t(132),t(130),t(127),t(129),t(134),t(128),t(96),t(95),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(124),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(114),t(163),t(166),t(169),t(165),t(161),t(162),t(164),t(167),t(168),t(91),t(93),t(92),t(94),t(87),t(88),t(90),t(89),t(154),t(155),t(156),t(157),t(158),t(159),t(139),t(97),t(160),t(171),t(172),t(140),t(141),t(142),t(143),t(144),t(147),t(145),t(146),t(148),t(149),t(150),t(151),t(153),t(152),t(173),t(180),t(181),t(182),t(183),t(184),t(178),t(176),t(177),t(175),t(174),t(179),t(185),t(188),t(187),t(186),e.exports=t(17)},{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,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,17:17,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,188:188,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}],190:[function(t,e,n){function a(){c=!1,s.length?u=s.concat(u):l=-1,u.length&&r()}function r(){if(!c){var t=setTimeout(a);c=!0;for(var e=u.length;e;){for(s=u,u=[];++l1)for(var n=1;n-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=p?e(i):document.fonts.load(u(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>=p)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,u(i,"sans-serif")),r(h,u(i,"serif")),r(m,u(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,u(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,u(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,u(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],194:[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 p(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),p=s.length;p>i;i++)a.createElement(s[i]);return a}function u(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||u(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:p,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],195:[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),p=0,u=o.length;u>p&&(handler=o[p],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);p++);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 p(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,p),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function u(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:u},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,p=this,u="on"+t,l=p[m]||v(p,m,{value:{}})[m],f=l[u]||(l[u]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(p,c(p,t),d,!1)},!y.call(P,u))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=p.nodeType&&(null==p.parentNode&&C.appendChild(p),(o=p.getAttribute(u))&&S.call(p,u)),p.fireEvent(u,r),P[u]=!0}catch(r){for(P[u]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&A.call(p,u,o)}else P[u]=!1;(f.n=P[u])&&p.attachEvent(u,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&p.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],p=s&&s.h,u=p?i(p,e):-1;u>-1&&p.splice(u,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]={}),p=s.h||(s.h=[]);i(p,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),p[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&&u.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,p),t==top&&!function i(t){try{r.documentElement.doScroll("left"),p()}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,p=this._,u=p.style,c=p.currentStyle,l=p.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:u[t],n.test(e)&&!a.test(t)&&(o=u.left,s=l&&l.left,s&&(l.left=c.left),u.left="fontSize"===t?"1em":e,e=u.pixelLeft+"px",u.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,p="on"+n;s[p]||(s[p]=function(t){return e(s,c(s,t),o,!1)}),o=s[p][m]||(s[p][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,p["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,u.times)(a,(0,u.minus)(n[l],n[l-1])));for(var f=[(0,u.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,u.minus)(n[l],(0,u.average)([i[l],i[l-1]])));f.push((0,u.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,u.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,u.average)(n)}},e.exports=n["default"]},{199:199,200:200,201:201}],197:[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(p){r=!0,i=p}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(198),o=a(i),s=t(199),p=1e-5,u=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],u=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==u&&(u+=p),c==l&&(l+=p),{points:a,xmin:o,xmax:u,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,p=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 u(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],[p,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"]},{198:198,199:199}],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(p){r=!0,i=p}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),p=s[0],u=s[1],c=function(t){return p+(u-p)*(t-r)/(o-r)};return c.inverse=function(){return i([p,u],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],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(p){r=!0,i=p}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)},p=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},u=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],p=o[1];return[r+s,i+p]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r-s,i-p]},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 p=o.value,u=t[p];n.push(e(p,u))}}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=p,n.maxBy=u,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:p,maxBy:u,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],200:[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(p){r=!0,i=p}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],p=o[1];return r===s&&i===p},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)},p=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},u=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(p).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 p=o.value,c=u(p,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"]},{}],201:[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?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 p(t){return!isNaN(parseFloat(t))&&isFinite(t)}function u(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,p,u="";if(!zo[t]){for(a=[];u.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)p.push(r(n[o]));a[i]=p}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]&&p(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||!p(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(!p(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!p(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,p;s=function(e){o||(o=!0,q(t,e,n,a))},p=function(t){o||(o=!0,a(t))};try{r.call(e,s,p)}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,p;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),p=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:p}),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 p=t.component.name+"."+e[e.length-1];e=P(p).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||cp,e.isPattern?(r=new pp(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(u(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="",up(this,t,e,n);if(i=t.split(" "),1===i.length)return up(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(up(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(dp).filter(hp),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(dp).filter(hp),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,p,u=[];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],p=0;i>p;p+=1)u.push(p);for(;o>p;p+=1)u.push(-1);for(;r>p;p+=1)u.push(p+s);return 0!==s?u.touchedFrom=a[0]:u.touchedFrom=t.length,u}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 Mp.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&&Op.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 Rp.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,p,u=[];for(e=[];n=Ip.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),p=e.length;p--;)s=i.slice(),r=e[p],s[p]=r.base+a+r.modifiers||"",o=i.slice(),o[p]=a+" "+o[p],u.push(s.join(" "),o.join(" "));return u.join(", ")},n=qp.test(t)?t.replace(qp,a):t.replace(Fp,"").replace(Dp,function(t,e){var n,a;return Bp.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(Qp);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hp)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hp(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(){p&&A.call(p)}),"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),p=0;o>p;p++)s[p]="String"==a?this.charAt(r+p):this[r+p];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),p=t(79),u=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=u(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=p(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 ([^ (]*)/,p="name";p in o||t(19)&&a(o,p,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,p)||a(this,p,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),p=i(2,127)*(2-s),u=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 u>a?i*c(a/u/s)*u*s:(e=(1+s/o)*a,n=e-(e-a),n>p||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,p=s.length,u=0;p>o;)n=r(s[o++]),n>u?(a=u/n,i=i*a*a+1,u=n):n>0?(a=n/u,i+=a*a):i+=n;return u===1/0?1/0:u*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),p=t(24),u=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():u(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,p=e.slice(2),c=0,l=p.length;l>c;c++)if(o=p.charCodeAt(c),48>o||o>r)return NaN;return parseInt(p,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?p(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),p=t(10),u=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"==p(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,p=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?p(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,p):s(n)):p(a)}catch(u){p(u)}};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)}})),u(u.G+u.W+u.F*!E,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],u(u.S+u.F*!E,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),u(u.S+u.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}}),u(u.S+u.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),p=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(p.apply(t,r))}var u=n.prototype,c=a.create(s(u)?u: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,u=arguments.length<3?t:arguments[2];return p(t)===u?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(u):void 0:s(o=r.getProto(t))?a(o,e,u):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),p=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(p(t),e);if(!f){if(u(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&u(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),p=t(4),u=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,p=s,u=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 p(n&&!a?t.source:t,e):p((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(p),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return p[t]},set:function(e){p[t]=e}})}),u.constructor=s,s.prototype=u,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,p=r(e.length),u=void 0===a?p:Math.min(r(a),p),c=t+"";return s?s.call(e,c,u):e.slice(u-c.length,u)===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=[],p=0;n>p;)s.push(e[p++]+""),o>p&&s.push(a[p]+"");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)),p=t+"";return s?s.call(e,p,a):e.slice(a,a+p.length)===p}})},{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),p=t(61),u=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&&u(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=u(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))},p(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)&&p(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),p=i.frozenStore,u=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 p(this).get(t);if(s(t,u))return t[u][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=p(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),p=a.setDesc,u=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=u(r,e=c[f++]),e in l?p(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={},p=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))})};p("pop,reverse,shift,keys,values,entries",1),p("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),p("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,p=a.HTMLCollection,u=s&&s.prototype,c=p&&p.prototype,l=i.NodeList=i.HTMLCollection=i.Array;u&&!u[o]&&r(u,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,p=!!s&&/MSIE .\./.test(s.userAgent),u=function(t){return p?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*p,{setTimeout:u(a.setTimeout),setInterval:u(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 p(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function u(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof u?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 p=s.iterator["return"];if(p){var u=r(p,s.iterator,o);if("throw"===u.type){i="throw",o=u.arg;continue}}if("return"===i)continue}var u=r(s.iterator[i],s.iterator,o);if("throw"===u.type){n.delegate=null,i="throw",o=u.arg;continue}i="next",o=g;var c=u.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 u=r(t,e,n);if("normal"===u.type){a=n.done?C:k;var c={value:u.arg,done:n.done};if(u.arg!==E)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===u.type&&(a=C,i="throw",o=u.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=p?e(i):document.fonts.load(u(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>=p)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,u(i,"sans-serif")),r(h,u(i,"serif")),r(m,u(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,u(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,u(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,u(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 p(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),p=s.length;p>i;i++)a.createElement(s[i]);return a}function u(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||u(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:p,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),p=0,u=o.length;u>p&&(handler=o[p],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);p++);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 p(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,p),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function u(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:u},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,p=this,u="on"+t,l=p[m]||v(p,m,{value:{}})[m],f=l[u]||(l[u]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(p,c(p,t),d,!1)},!y.call(P,u))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=p.nodeType&&(null==p.parentNode&&C.appendChild(p),(o=p.getAttribute(u))&&S.call(p,u)),p.fireEvent(u,r),P[u]=!0}catch(r){for(P[u]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&A.call(p,u,o)}else P[u]=!1;(f.n=P[u])&&p.attachEvent(u,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&p.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],p=s&&s.h,u=p?i(p,e):-1;u>-1&&p.splice(u,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]={}),p=s.h||(s.h=[]);i(p,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),p[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&&u.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,p),t==top&&!function i(t){try{r.documentElement.doScroll("left"),p()}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,p=this._,u=p.style,c=p.currentStyle,l=p.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:u[t],n.test(e)&&!a.test(t)&&(o=u.left,s=l&&l.left,s&&(l.left=c.left),u.left="fontSize"===t?"1em":e,e=u.pixelLeft+"px",u.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,p="on"+n;s[p]||(s[p]=function(t){return e(s,c(s,t),o,!1)}),o=s[p][m]||(s[p][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,p["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,u.times)(a,(0,u.minus)(n[l],n[l-1])));for(var f=[(0,u.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,u.minus)(n[l],(0,u.average)([i[l],i[l-1]])));f.push((0,u.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,u.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,u.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(p){r=!0,i=p}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),p=1e-5,u=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],u=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==u&&(u+=p),c==l&&(l+=p),{points:a,xmin:o,xmax:u,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,p=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 u(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],[p,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(p){r=!0,i=p}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),p=s[0],u=s[1],c=function(t){return p+(u-p)*(t-r)/(o-r)};return c.inverse=function(){return i([p,u],[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(p){r=!0,i=p}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)},p=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},u=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],p=o[1];return[r+s,i+p]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r-s,i-p]},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 p=o.value,u=t[p];n.push(e(p,u))}}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=p,n.maxBy=u,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:p,maxBy:u,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(p){r=!0,i=p}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],p=o[1];return r===s&&i===p},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)},p=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},u=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(p).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 p=o.value,c=u(p,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 p(t){return!isNaN(parseFloat(t))&&isFinite(t)}function u(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,p,u="";if(!zo[t]){for(a=[];u.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)p.push(r(n[o]));a[i]=p}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]&&p(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||!p(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(!p(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!p(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,p;s=function(e){o||(o=!0,q(t,e,n,a))},p=function(t){o||(o=!0,a(t))};try{r.call(e,s,p)}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,p;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),p=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:p}),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 p=t.component.name+"."+e[e.length-1];e=P(p).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||cp,e.isPattern?(r=new pp(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(u(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="",up(this,t,e,n);if(i=t.split(" "),1===i.length)return up(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(up(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(dp).filter(hp),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(dp).filter(hp),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,p,u=[];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],p=0;i>p;p+=1)u.push(p);for(;o>p;p+=1)u.push(-1);for(;r>p;p+=1)u.push(p+s);return 0!==s?u.touchedFrom=a[0]:u.touchedFrom=t.length,u}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 Mp.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&&Op.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 Rp.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,p,u=[];for(e=[];n=Ip.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),p=e.length;p--;)s=i.slice(),r=e[p],s[p]=r.base+a+r.modifiers||"",o=i.slice(),o[p]=a+" "+o[p],u.push(s.join(" "),o.join(" "));return u.join(", ")},n=qp.test(t)?t.replace(qp,a):t.replace(Fp,"").replace(Dp,function(t,e){var n,a;return Bp.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(Qp);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hp)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hp(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