diff --git a/_maps/RandomRuins/SpaceRuins/miracle.dmm b/_maps/RandomRuins/SpaceRuins/miracle.dmm
new file mode 100644
index 00000000000..c67b1b15971
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/miracle.dmm
@@ -0,0 +1,5 @@
+"a" = (/obj/item/weapon/storage/backpack/satchel/flat/secret{reward_all_of_these = list(/obj/item/weapon/gun/energy/pulse/prize)},/turf/open/floor/fakespace,/area/space)
+
+(1,1,1) = {"
+a
+"}
diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index bedea03f443..35ae80339e6 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -18752,18 +18752,11 @@
/area/security/warden)
"aUf" = (
/obj/structure/rack,
-/obj/item/weapon/gun/energy/temperature{
- name = "security temperature gun";
- origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1";
- pin = /obj/item/device/firing_pin;
+/obj/item/weapon/gun/energy/temperature/security{
pixel_x = -5;
pixel_y = 5
},
-/obj/item/weapon/gun/energy/temperature{
- name = "security temperature gun";
- origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1";
- pin = /obj/item/device/firing_pin
- },
+/obj/item/weapon/gun/energy/temperature/security,
/turf/open/floor/plasteel/vault{
dir = 8
},
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index 9f6e1f7d6f3..998b7be8a72 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -33051,6 +33051,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/darkred/side{
tag = "icon-darkred (NORTHEAST)";
dir = 5
@@ -39229,6 +39232,9 @@
tag = ""
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/darkred/corner{
tag = "icon-darkredcorners (EAST)";
dir = 4
@@ -39272,6 +39278,9 @@
pixel_x = 0;
tag = ""
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/darkred/corner{
tag = "icon-darkredcorners (NORTH)";
dir = 1
@@ -41907,6 +41916,9 @@
pixel_x = 0;
tag = ""
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/black,
/area/security/main)
"bFQ" = (
@@ -43443,6 +43455,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/black,
/area/security/main)
"bIg" = (
@@ -45342,6 +45357,7 @@
/obj/item/weapon/gun/energy/ionrifle{
pin = /obj/item/device/firing_pin
},
+/obj/item/weapon/gun/energy/temperature/security,
/obj/item/clothing/suit/armor/laserproof,
/obj/item/key/security,
/turf/open/floor/plasteel/vault{
@@ -49004,6 +49020,8 @@
pixel_y = -24
},
/obj/machinery/light,
+/obj/item/weapon/gun/energy/gun/dragnet,
+/obj/item/weapon/gun/energy/gun/dragnet,
/turf/open/floor/plasteel/vault{
dir = 8
},
diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 781caeb2e84..067630f1b1a 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -41922,6 +41922,8 @@
pixel_x = -2;
pixel_y = -2
},
+/obj/item/weapon/gun/energy/gun/dragnet,
+/obj/item/weapon/gun/energy/gun/dragnet,
/turf/open/floor/plasteel/black,
/area/security/warden)
"bFG" = (
@@ -45891,6 +45893,7 @@
"bMY" = (
/obj/structure/rack,
/obj/item/weapon/gun/energy/ionrifle,
+/obj/item/weapon/gun/energy/temperature/security,
/obj/item/clothing/suit/armor/laserproof,
/turf/open/floor/plasteel/black,
/area/security/warden)
@@ -46499,6 +46502,9 @@
dir = 8;
icon_state = "pipe-c"
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"bOf" = (
@@ -46534,6 +46540,9 @@
on = 1;
pressure_checks = 1
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"bOj" = (
@@ -47019,6 +47028,9 @@
/obj/effect/landmark{
name = "blobstart"
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"bPn" = (
@@ -50190,6 +50202,9 @@
/area/maintenance/starboard)
"bVS" = (
/obj/effect/landmark/event_spawn,
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"bVT" = (
@@ -55926,11 +55941,11 @@
/turf/closed/wall/mineral/titanium/interior,
/area/shuttle/transport)
"ciH" = (
-/turf/open/floor/plasteel/shuttle,
-/turf/closed/wall/shuttle/interior{
- icon_state = "swall_f6"
+/obj/effect/landmark/start{
+ name = "Security Officer"
},
-/area/shuttle/transport)
+/turf/open/floor/plasteel,
+/area/security/main)
"ciI" = (
/turf/open/space,
/area/shuttle/syndicate)
@@ -56334,6 +56349,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"cjr" = (
@@ -56367,6 +56385,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"cjt" = (
@@ -85164,7 +85185,7 @@ bLD
bMO
bOe
bPm
-bOj
+ciH
cjq
bSX
bUl
@@ -86192,7 +86213,7 @@ bEg
bMR
bOi
bVS
-bOj
+ciH
cjs
bTb
bUi
@@ -86667,11 +86688,11 @@ aSD
aSA
aSF
aTP
-aWE
+aWF
aWF
aWG
aWF
-aWE
+aWF
aTP
bcp
aTS
@@ -88209,11 +88230,11 @@ aSI
aSA
aUL
aTP
-aWE
+aWF
aWF
aYJ
aWF
-aWE
+aWF
aTP
bcq
aSA
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index f6165b31ea0..d7da3f0c00f 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -2370,10 +2370,11 @@
/obj/item/weapon/gun/energy/ionrifle{
pin = /obj/item/device/firing_pin
},
-/obj/item/clothing/suit/armor/laserproof,
/obj/machinery/light{
dir = 1
},
+/obj/item/weapon/gun/energy/temperature/security,
+/obj/item/clothing/suit/armor/laserproof,
/turf/open/floor/plasteel/vault{
dir = 4
},
@@ -9126,9 +9127,6 @@
/turf/open/floor/plasteel,
/area/security/main)
"aqh" = (
-/obj/effect/landmark/start{
- name = "Security Officer"
- },
/obj/structure/extinguisher_cabinet{
pixel_x = 27;
pixel_y = 0
@@ -9847,6 +9845,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/red/side,
/area/security/main)
"arw" = (
@@ -9862,6 +9863,9 @@
d2 = 8;
icon_state = "2-8"
},
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel/red/side,
/area/security/main)
"arx" = (
@@ -92816,11 +92820,22 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"ddO" = (
-/turf/closed/wall/shuttle{
- icon_state = "swall15";
- dir = 2
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/yellow{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/area/shuttle/escape)
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
+/turf/open/floor/plasteel/red/side{
+ dir = 8
+ },
+/area/security/main)
"ddP" = (
/obj/structure/table,
/obj/item/weapon/restraints/handcuffs{
@@ -92960,10 +92975,17 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"dem" = (
-/turf/closed/wall/shuttle{
- icon_state = "diagonalWall3"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair{
+ dir = 8
},
-/area/shuttle/escape)
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
+/turf/open/floor/plasteel/red/side{
+ dir = 4
+ },
+/area/security/main)
"den" = (
/obj/structure/table,
/obj/item/weapon/folder/red{
@@ -123075,9 +123097,9 @@ aed
ajI
akS
ame
-anC
-anC
-anC
+ddO
+ddO
+ddO
aru
asM
auf
@@ -124363,7 +124385,7 @@ amq
boY
aoN
aqe
-arz
+arx
asR
aui
avi
@@ -124877,7 +124899,7 @@ ams
anI
aoP
aqg
-arz
+arx
asT
ajJ
avi
@@ -125131,9 +125153,9 @@ aed
ajP
ala
amt
-anJ
-anJ
-anJ
+dem
+dem
+dem
arB
asU
auk
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index e9add6ca877..0db7e381bd7 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -8201,6 +8201,7 @@
/obj/machinery/light/small{
dir = 1
},
+/obj/machinery/telecomms/server/presets/common/birdstation,
/turf/open/floor/plasteel/black{
name = "Mainframe Floor";
initial_gas_mix = "n2=100;TEMP=80"
@@ -8473,7 +8474,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay)
"sF" = (
-/obj/machinery/telecomms/receiver/preset_left/ministation,
+/obj/machinery/telecomms/receiver/preset_left/birdstation,
/turf/open/floor/plasteel/black{
name = "Mainframe Floor";
initial_gas_mix = "n2=100;TEMP=80"
@@ -14358,7 +14359,7 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/syndicate)
"GP" = (
-/obj/machinery/telecomms/processor/preset_one,
+/obj/machinery/telecomms/processor/preset_one/birdstation,
/turf/open/floor/plasteel/black{
name = "Mainframe Floor";
initial_gas_mix = "n2=100;TEMP=80"
@@ -14577,8 +14578,12 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"Ht" = (
-/turf/closed/wall/mineral/titanium/overspace,
-/area/shuttle/escape)
+/obj/machinery/telecomms/broadcaster/preset_left/birdstation,
+/turf/open/floor/plasteel/black{
+ name = "Mainframe Floor";
+ initial_gas_mix = "n2=100;TEMP=80"
+ },
+/area/tcommsat/computer)
"Hu" = (
/obj/structure/tank_dispenser/oxygen,
/turf/open/floor/mineral/titanium,
@@ -14681,9 +14686,12 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"HJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/shuttle/escape)
+/obj/machinery/telecomms/bus/preset_one/birdstation,
+/turf/open/floor/plasteel/black{
+ name = "Mainframe Floor";
+ initial_gas_mix = "n2=100;TEMP=80"
+ },
+/area/tcommsat/computer)
"HK" = (
/obj/machinery/door/airlock/glass_medical{
id_tag = null;
@@ -14924,8 +14932,12 @@
/turf/open/floor/plating,
/area/shuttle/transport)
"Iw" = (
-/turf/closed/wall/mineral/titanium/overspace,
-/area/shuttle/transport)
+/obj/machinery/telecomms/receiver/preset_left/birdstation,
+/turf/open/floor/plasteel/black{
+ name = "Mainframe Floor";
+ initial_gas_mix = "n2=100;TEMP=80"
+ },
+/area/tcommsat/computer)
"Ix" = (
/turf/open/floor/mineral/titanium/blue,
/turf/closed/wall/mineral/titanium/interior,
@@ -59249,11 +59261,11 @@ Eg
Ea
Eh
Ew
-EV
+Ht
Fk
Fy
FN
-EV
+Iw
Gr
Eh
Ea
@@ -60020,7 +60032,7 @@ Eh
Eu
Eh
Ew
-EV
+HJ
EV
EV
EV
diff --git a/_maps/map_files/MiniStation/telecomms.dm b/_maps/map_files/MiniStation/telecomms.dm
deleted file mode 100644
index a69320ae98a..00000000000
--- a/_maps/map_files/MiniStation/telecomms.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/obj/machinery/telecomms/receiver/preset_left/ministation
- name = "Receiver"
- freq_listening = list()
-
-/obj/machinery/telecomms/bus/preset_one/ministation
- name = "Bus"
- autolinkers = list("processor1", "common")
- freq_listening = list()
-
-/obj/machinery/telecomms/processor/preset_one/ministation
- name = "Processor"
-
-/obj/machinery/telecomms/server/presets/common/ministation/New()
- ..()
- freq_listening = list()
-
-/obj/machinery/telecomms/broadcaster/preset_left/ministation
- name = "Broadcaster"
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index e4569a462c8..eab81182fa2 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -417,33 +417,11 @@
/area/ai_monitored/security/armory)
"abn" = (
/obj/structure/rack,
-/obj/item/clothing/suit/armor/vest{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/suit/armor/vest{
- pixel_y = 0
- },
-/obj/item/clothing/suit/armor/vest{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/clothing/head/helmet{
- layer = 3.00001;
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/head/helmet{
- layer = 3.00001
- },
-/obj/item/clothing/head/helmet{
- layer = 3.00001;
- pixel_x = 3;
- pixel_y = -3
- },
/obj/machinery/firealarm{
pixel_y = 24
},
+/obj/item/weapon/gun/energy/gun/dragnet,
+/obj/item/weapon/gun/energy/gun/dragnet,
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -731,6 +709,7 @@
pixel_y = 23
},
/obj/item/weapon/gun/energy/ionrifle,
+/obj/item/weapon/gun/energy/temperature/security,
/obj/item/clothing/suit/armor/laserproof,
/turf/open/floor/plasteel/vault{
dir = 8
@@ -3702,6 +3681,9 @@
},
/obj/structure/chair,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/landmark/start{
+ name = "Security Officer"
+ },
/turf/open/floor/plasteel,
/area/security/main)
"ahL" = (
@@ -91638,8 +91620,8 @@ abO
abO
afb
abo
-agv
-afU
+afg
+ahb
ahG
aik
cBV
diff --git a/_maps/ministation.dm b/_maps/ministation.dm
index 268439050ad..efe6a8b067f 100644
--- a/_maps/ministation.dm
+++ b/_maps/ministation.dm
@@ -74,7 +74,6 @@ Changes to the uplinks were made to discourage murderboning, the rest is the sam
#define MAP_OVERRIDE_FILES
#include "map_files\MiniStation\misc.dm"
#include "map_files\MiniStation\cargopacks.dm"
- #include "map_files\MiniStation\telecomms.dm"
#include "map_files\MiniStation\uplink_item.dm"
#include "map_files\MiniStation\job\jobs.dm"
#include "map_files\MiniStation\job\removed.dm"
diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/__DEFINES/clockcult.dm
similarity index 91%
rename from code/game/gamemodes/clock_cult/__clock_defines.dm
rename to code/__DEFINES/clockcult.dm
index 1b829386fb1..504dcb27e96 100644
--- a/code/game/gamemodes/clock_cult/__clock_defines.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -7,12 +7,12 @@ var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatu
var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from
var/global/ratvar_awakens = FALSE //If Ratvar has been summoned
-#define SCRIPTURE_PERIPHERAL 0 //Scripture tiers; peripherals should never be used
-#define SCRIPTURE_DRIVER 1
-#define SCRIPTURE_SCRIPT 2
-#define SCRIPTURE_APPLICATION 3
-#define SCRIPTURE_REVENANT 4
-#define SCRIPTURE_JUDGEMENT 5
+#define SCRIPTURE_PERIPHERAL "Peripheral" //Scripture tiers; peripherals should never be used
+#define SCRIPTURE_DRIVER "Driver"
+#define SCRIPTURE_SCRIPT "Script"
+#define SCRIPTURE_APPLICATION "Application"
+#define SCRIPTURE_REVENANT "Revenant"
+#define SCRIPTURE_JUDGEMENT "Judgement"
#define SLAB_PRODUCTION_TIME 900 //how long(deciseconds) slabs require to produce a single component; defaults to 1 minute 30 seconds
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index d88e36905fe..c9861cf2f31 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -69,6 +69,7 @@
#define UNARMED_ATTACK 2
#define PROJECTILE_ATTACK 3
#define THROWN_PROJECTILE_ATTACK 4
+#define LEAP_ATTACK 5
//Gun Stuff
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index b4b2acd411e..0480bd43814 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -24,6 +24,8 @@
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
#define ui_crafting "12:-10,1:5"
+#define ui_building "12:-10,1:21"
+
#define ui_devilsouldisplay "WEST:6,CENTER-1:15"
//Lower center, persistant menu
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 9afcfeaf73e..7b6f2d6edcf 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -1,6 +1,7 @@
/obj/screen/movable/action_button
var/datum/action/linked_action
+ var/actiontooltipstyle = ""
screen_loc = null
/obj/screen/movable/action_button/Click(location,control,params)
@@ -51,7 +52,7 @@
/obj/screen/movable/action_button/MouseEntered(location,control,params)
- openToolTip(usr,src,params,title = name,content = desc)
+ openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle)
/obj/screen/movable/action_button/MouseExited()
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 350b813e56b..8ec7d0c3843 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -1,11 +1,17 @@
/obj/screen/ai
icon = 'icons/mob/screen_ai.dmi'
+/obj/screen/ai/Click()
+ if(isobserver(usr))
+ return 1
+
/obj/screen/ai/aicore
name = "AI core"
icon_state = "ai_core"
/obj/screen/ai/aicore/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.view_core()
@@ -23,6 +29,8 @@
icon_state = "track"
/obj/screen/ai/camera_track/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs()
AI.ai_camera_track(target_name)
@@ -32,6 +40,8 @@
icon_state = "camera_light"
/obj/screen/ai/camera_light/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.toggle_camera_light()
@@ -40,6 +50,8 @@
icon_state = "crew_monitor"
/obj/screen/ai/crew_monitor/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
crewmonitor.show(AI)
@@ -48,6 +60,8 @@
icon_state = "manifest"
/obj/screen/ai/crew_manifest/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.ai_roster()
@@ -56,6 +70,8 @@
icon_state = "alerts"
/obj/screen/ai/alerts/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.ai_alerts()
@@ -64,6 +80,8 @@
icon_state = "announcement"
/obj/screen/ai/announcement/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.announcement()
@@ -72,6 +90,8 @@
icon_state = "call_shuttle"
/obj/screen/ai/call_shuttle/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.ai_call_shuttle()
@@ -80,6 +100,8 @@
icon_state = "state_laws"
/obj/screen/ai/state_laws/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.checklaws()
@@ -88,6 +110,8 @@
icon_state = "pda_send"
/obj/screen/ai/pda_msg_send/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.cmd_send_pdamesg(usr)
@@ -96,6 +120,8 @@
icon_state = "pda_receive"
/obj/screen/ai/pda_msg_show/Click()
+ if(..())
+ return
var/mob/living/silicon/ai/AI = usr
AI.cmd_show_message_log(usr)
@@ -128,6 +154,8 @@
icon_state = "ai_sensor"
/obj/screen/ai/sensors/Click()
+ if(..())
+ return
var/mob/living/silicon/S = usr
S.sensor_mode()
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 5f5d2a17240..02287efea2b 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -241,13 +241,72 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
alerttooltipstyle = "blob"
// CLOCKCULT
-/obj/screen/alert/nocache
+/obj/screen/alert/clockwork
+ alerttooltipstyle = "clockcult"
+
+/obj/screen/alert/clockwork/nocache
name = "No Tinkerer's Cache"
desc = "In order to share components and unlock higher tier \
scripture, a tinkerer's cache must be constructed somewhere \
in the world. Try to place it somewhere accessible, yet hidden."
icon_state = "nocache"
+/obj/screen/alert/clockwork/infodump
+ name = "Global Records"
+ desc = "You shouldn't be seeing this description, because it should be dynamically generated."
+ icon_state = "clockinfo"
+
+/obj/screen/alert/clockwork/infodump/MouseEntered(location,control,params)
+ if(ratvar_awakens)
+ desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR."
+ else
+ var/servants = 0
+ var/validservants = 0
+ var/unconverted_ai_exists = FALSE
+ var/list/scripture_states = scripture_unlock_check()
+ for(var/mob/living/L in living_mob_list)
+ if(is_servant_of_ratvar(L))
+ servants++
+ if(ishuman(L) || issilicon(L))
+ validservants++
+ else if(isAI(L))
+ unconverted_ai_exists = TRUE
+ if(servants > 1)
+ if(validservants > 1)
+ desc = "[servants] Servants, [validservants] of which count towards scripture.
"
+ else
+ desc = "[servants] Servants, [validservants ? "[validservants] of which counts":"none of which count"] towards scripture.
"
+ else
+ desc = "[servants] Servant, who [validservants ? "counts":"does not count"] towards scripture.
"
+ desc += "[clockwork_caches ? "[clockwork_caches] Tinkerer's Caches.":"No Tinkerer's Caches, construct one!"]
\
+ [clockwork_construction_value] Construction Value.
"
+ if(clockwork_daemons)
+ desc += "[clockwork_daemons] Tinkerer's Daemons: [servants * 0.2 < clockwork_daemons ? "DISABLED":"ACTIVE"]
"
+ else
+ desc += "No Tinkerer's Daemons.
"
+ for(var/obj/structure/clockwork/massive/celestial_gateway/G in all_clockwork_objects)
+ var/area/gate_area = get_area(G)
+ desc += "Ark Location: [uppertext(gate_area.map_name)]
"
+ desc += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
"
+ if(unconverted_ai_exists)
+ desc += "An unconverted AI exists!
"
+ if(scripture_states[SCRIPTURE_REVENANT])
+ var/inathneq_available = clockwork_generals_invoked["inath-neq"] <= world.time
+ var/sevtug_available = clockwork_generals_invoked["sevtug"] <= world.time
+ var/nezbere_available = clockwork_generals_invoked["nezbere"] <= world.time
+ var/nezcrentr_available = clockwork_generals_invoked["nzcrentr"] <= world.time
+ if(inathneq_available || sevtug_available || nezbere_available || nezcrentr_available)
+ desc += "Generals available:
[inathneq_available ? "INATH-NEQ
":""][sevtug_available ? "SEVTUG
":""]\
+ [nezbere_available ? "NEZBERE
":""][nezcrentr_available ? "NZCRENTR":""]
"
+ else
+ desc += "Generals available: NONE
"
+ else
+ desc += "Generals available: NONE
"
+ for(var/i in scripture_states)
+ if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff
+ desc += "[i] Scripture: [scripture_states[i] ? "UNLOCKED":"LOCKED"]
"
+ ..()
+
//GUARDIANS
/obj/screen/alert/cancharge
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index 66e4e1fd3c4..1a5a6252b98 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -34,12 +34,15 @@
desc = "Moves your camera to your blob core."
/obj/screen/blob/JumpToCore/MouseEntered(location,control,params)
- if(isovermind(usr))
- var/mob/camera/blob/B = usr
+ if(hud && hud.mymob && isovermind(hud.mymob))
+ var/mob/camera/blob/B = hud.mymob
if(!B.placed)
- openToolTip(usr,src,params,title = "Place Blob Core",content = "Attempt to place your blob core at this location.", theme = "blob")
+ name = "Place Blob Core"
+ desc = "Attempt to place your blob core at this location."
else
- ..()
+ name = initial(name)
+ desc = initial(desc)
+ ..()
/obj/screen/blob/JumpToCore/Click()
if(isovermind(usr))
@@ -94,12 +97,15 @@
desc = "Randomly rerolls your chemical for 40 points."
/obj/screen/blob/ReadaptChemical/MouseEntered(location,control,params)
- if(isovermind(usr))
- var/mob/camera/blob/B = usr
+ if(hud && hud.mymob && isovermind(hud.mymob))
+ var/mob/camera/blob/B = hud.mymob
if(B.free_chem_rerolls)
- openToolTip(usr,src,params,title = "Readapt Chemical (FREE)",content = "Randomly rerolls your chemical for free.", theme = "blob")
+ name = "Readapt Chemical (FREE)"
+ desc = "Randomly rerolls your chemical for free."
else
- ..()
+ name = initial(name)
+ desc = initial(desc)
+ ..()
/obj/screen/blob/ReadaptChemical/Click()
if(isovermind(usr))
@@ -141,6 +147,7 @@
using = new /obj/screen/blob/JumpToCore()
using.screen_loc = ui_zonesel
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/Blobbernaut()
@@ -161,6 +168,7 @@
using = new /obj/screen/blob/ReadaptChemical()
using.screen_loc = ui_storage1
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/RelocateCore()
diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm
index 2d9ae17bc0b..8ecfed99627 100644
--- a/code/_onclick/hud/generic_dextrous.dm
+++ b/code/_onclick/hud/generic_dextrous.dm
@@ -51,6 +51,10 @@
using.icon = ui_style
static_inventory += using
+ using = new /obj/screen/inventory/area_creator
+ using.icon = ui_style
+ static_inventory += using
+
mymob.client.screen = list()
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 4edbc1f9730..d55eb8db92f 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -9,7 +9,7 @@
var/hud_shown = 1 //Used for the HUD toggle (F12)
var/hud_version = 1 //Current displayed version of the HUD
- var/inventory_shown = 1 //the inventory
+ var/inventory_shown = 0 //Equipped item inventory
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
@@ -114,13 +114,15 @@
hud_used = new /datum/hud(src)
//Version denotes which style should be displayed. blank or 0 means "next version"
-/datum/hud/proc/show_hud(version = 0)
+/datum/hud/proc/show_hud(version = 0,mob/viewmob)
if(!ismob(mymob))
return 0
if(!mymob.client)
return 0
- mymob.client.screen = list()
+ var/mob/screenmob = viewmob || mymob
+
+ screenmob.client.screen = list()
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
@@ -132,13 +134,13 @@
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = 1 //Governs behavior of other procs
if(static_inventory.len)
- mymob.client.screen += static_inventory
- if(toggleable_inventory.len && inventory_shown)
- mymob.client.screen += toggleable_inventory
+ screenmob.client.screen += static_inventory
+ if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
+ screenmob.client.screen += toggleable_inventory
if(hotkeybuttons.len && !hotkey_ui_hidden)
- mymob.client.screen += hotkeybuttons
+ screenmob.client.screen += hotkeybuttons
if(infodisplay.len)
- mymob.client.screen += infodisplay
+ screenmob.client.screen += infodisplay
mymob.client.screen += hide_actions_toggle
@@ -148,44 +150,44 @@
if(HUD_STYLE_REDUCED) //Reduced HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
- mymob.client.screen -= static_inventory
+ screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
- mymob.client.screen -= toggleable_inventory
+ screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
- mymob.client.screen -= hotkeybuttons
+ screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
- mymob.client.screen += infodisplay
+ screenmob.client.screen += infodisplay
//These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
if(inv_slots[slot_l_hand])
- mymob.client.screen += inv_slots[slot_l_hand] //we want the hands to be visible
+ screenmob.client.screen += inv_slots[slot_l_hand] //we want the hands to be visible
if(inv_slots[slot_r_hand])
- mymob.client.screen += inv_slots[slot_r_hand] //we want the hands to be visible
+ screenmob.client.screen += inv_slots[slot_r_hand] //we want the hands to be visible
if(action_intent)
- mymob.client.screen += action_intent //we want the intent switcher visible
+ screenmob.client.screen += action_intent //we want the intent switcher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
if(HUD_STYLE_NOHUD) //No HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
- mymob.client.screen -= static_inventory
+ screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
- mymob.client.screen -= toggleable_inventory
+ screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
- mymob.client.screen -= hotkeybuttons
+ screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
- mymob.client.screen -= infodisplay
+ screenmob.client.screen -= infodisplay
hud_version = display_hud_version
- persistant_inventory_update()
+ persistant_inventory_update(screenmob)
mymob.update_action_buttons(1)
reorganize_alerts()
mymob.reload_fullscreen()
-/datum/hud/human/show_hud(version = 0)
+/datum/hud/human/show_hud(version = 0,mob/viewmob)
..()
- hidden_inventory_update()
+ hidden_inventory_update(viewmob)
/datum/hud/robot/show_hud(version = 0)
..()
@@ -194,7 +196,7 @@
/datum/hud/proc/hidden_inventory_update()
return
-/datum/hud/proc/persistant_inventory_update()
+/datum/hud/proc/persistant_inventory_update(mob/viewer)
return
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 1352df00c68..33cac0a4d28 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -6,14 +6,22 @@
icon_state = "toggle"
/obj/screen/human/toggle/Click()
- if(usr.hud_used.inventory_shown)
+
+ var/mob/targetmob = usr
+
+ if(isobserver(usr))
+ if(ishuman(usr.client.eye) && (usr.client.eye != usr))
+ var/mob/M = usr.client.eye
+ targetmob = M
+
+ if(usr.hud_used.inventory_shown && targetmob.hud_used)
usr.hud_used.inventory_shown = 0
- usr.client.screen -= usr.hud_used.toggleable_inventory
+ usr.client.screen -= targetmob.hud_used.toggleable_inventory
else
usr.hud_used.inventory_shown = 1
- usr.client.screen += usr.hud_used.toggleable_inventory
+ usr.client.screen += targetmob.hud_used.toggleable_inventory
- usr.hud_used.hidden_inventory_update()
+ targetmob.hud_used.hidden_inventory_update(usr)
/obj/screen/human/equip
name = "equip"
@@ -62,6 +70,8 @@
screen_loc = ui_lingstingdisplay
/obj/screen/ling/sting/Click()
+ if(isobserver(usr))
+ return
var/mob/living/carbon/U = usr
U.unset_sting()
@@ -85,6 +95,10 @@
using.icon = ui_style
static_inventory += using
+ using = new /obj/screen/inventory/area_creator
+ using.icon = ui_style
+ static_inventory += using
+
using = new /obj/screen/act_intent()
using.icon_state = mymob.a_intent
static_inventory += using
@@ -304,102 +318,106 @@
zone_select.update_icon(mymob)
static_inventory += zone_select
- inventory_shown = 0
-
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
-/datum/hud/human/hidden_inventory_update()
+/datum/hud/human/hidden_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
- if(inventory_shown && hud_shown)
+
+ var/mob/screenmob = viewer || H
+
+ if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
if(H.shoes)
H.shoes.screen_loc = ui_shoes
- H.client.screen += H.shoes
+ screenmob.client.screen += H.shoes
if(H.gloves)
H.gloves.screen_loc = ui_gloves
- H.client.screen += H.gloves
+ screenmob.client.screen += H.gloves
if(H.ears)
H.ears.screen_loc = ui_ears
- H.client.screen += H.ears
+ screenmob.client.screen += H.ears
if(H.glasses)
H.glasses.screen_loc = ui_glasses
- H.client.screen += H.glasses
+ screenmob.client.screen += H.glasses
if(H.w_uniform)
H.w_uniform.screen_loc = ui_iclothing
- H.client.screen += H.w_uniform
+ screenmob.client.screen += H.w_uniform
if(H.wear_suit)
H.wear_suit.screen_loc = ui_oclothing
- H.client.screen += H.wear_suit
+ screenmob.client.screen += H.wear_suit
if(H.wear_mask)
H.wear_mask.screen_loc = ui_mask
- H.client.screen += H.wear_mask
+ screenmob.client.screen += H.wear_mask
if(H.head)
H.head.screen_loc = ui_head
- H.client.screen += H.head
+ screenmob.client.screen += H.head
else
- if(H.shoes) H.shoes.screen_loc = null
- if(H.gloves) H.gloves.screen_loc = null
- if(H.ears) H.ears.screen_loc = null
- if(H.glasses) H.glasses.screen_loc = null
- if(H.w_uniform) H.w_uniform.screen_loc = null
- if(H.wear_suit) H.wear_suit.screen_loc = null
- if(H.wear_mask) H.wear_mask.screen_loc = null
- if(H.head) H.head.screen_loc = null
+ if(H.shoes) screenmob.client.screen -= H.shoes
+ if(H.gloves) screenmob.client.screen -= H.gloves
+ if(H.ears) screenmob.client.screen -= H.ears
+ if(H.glasses) screenmob.client.screen -= H.glasses
+ if(H.w_uniform) screenmob.client.screen -= H.w_uniform
+ if(H.wear_suit) screenmob.client.screen -= H.wear_suit
+ if(H.wear_mask) screenmob.client.screen -= H.wear_mask
+ if(H.head) screenmob.client.screen -= H.head
-/datum/hud/human/persistant_inventory_update()
+/datum/hud/human/persistant_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
- if(hud_shown)
+
+ var/mob/screenmob = viewer || H
+
+ if(screenmob.hud_used.hud_shown)
if(H.s_store)
H.s_store.screen_loc = ui_sstore1
- H.client.screen += H.s_store
+ screenmob.client.screen += H.s_store
if(H.wear_id)
H.wear_id.screen_loc = ui_id
- H.client.screen += H.wear_id
+ screenmob.client.screen += H.wear_id
if(H.belt)
H.belt.screen_loc = ui_belt
- H.client.screen += H.belt
+ screenmob.client.screen += H.belt
if(H.back)
H.back.screen_loc = ui_back
- H.client.screen += H.back
+ screenmob.client.screen += H.back
if(H.l_store)
H.l_store.screen_loc = ui_storage1
- H.client.screen += H.l_store
+ screenmob.client.screen += H.l_store
if(H.r_store)
H.r_store.screen_loc = ui_storage2
- H.client.screen += H.r_store
+ screenmob.client.screen += H.r_store
else
if(H.s_store)
- H.s_store.screen_loc = null
+ screenmob.client.screen -= H.s_store
if(H.wear_id)
- H.wear_id.screen_loc = null
+ screenmob.client.screen -= H.wear_id
if(H.belt)
- H.belt.screen_loc = null
+ screenmob.client.screen -= H.belt
if(H.back)
- H.back.screen_loc = null
+ screenmob.client.screen -= H.back
if(H.l_store)
- H.l_store.screen_loc = null
+ screenmob.client.screen -= H.l_store
if(H.r_store)
- H.r_store.screen_loc = null
+ screenmob.client.screen -= H.r_store
if(hud_version != HUD_STYLE_NOHUD)
if(H.r_hand)
H.r_hand.screen_loc = ui_rhand
- H.client.screen += H.r_hand
+ screenmob.client.screen += H.r_hand
if(H.l_hand)
H.l_hand.screen_loc = ui_lhand
- H.client.screen += H.l_hand
+ screenmob.client.screen += H.l_hand
else
if(H.r_hand)
- H.r_hand.screen_loc = null
+ screenmob.client.screen -= H.r_hand
if(H.l_hand)
- H.l_hand.screen_loc = null
+ screenmob.client.screen -= H.l_hand
/mob/living/carbon/human/verb/toggle_hotkey_verbs()
set category = "OOC"
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 7c69ae2a8a9..f572172bb60 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -5,7 +5,13 @@
name = "cyborg module"
icon_state = "nomod"
+/obj/screen/robot/Click()
+ if(isobserver(usr))
+ return 1
+
/obj/screen/robot/module/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
if(R.module)
R.hud_used.toggle_show_robot_modules()
@@ -17,6 +23,8 @@
icon_state = "inv1"
/obj/screen/robot/module1/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.toggle_module(1)
@@ -25,6 +33,8 @@
icon_state = "inv2"
/obj/screen/robot/module2/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.toggle_module(2)
@@ -33,6 +43,8 @@
icon_state = "inv3"
/obj/screen/robot/module3/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.toggle_module(3)
@@ -41,6 +53,8 @@
icon_state = "radio"
/obj/screen/robot/radio/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.radio.interact(R)
@@ -49,6 +63,8 @@
icon_state = "store"
/obj/screen/robot/store/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.uneq_active()
@@ -57,6 +73,8 @@
icon_state = "lamp0"
/obj/screen/robot/lamp/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.control_headlamp()
@@ -65,6 +83,8 @@
icon_state = "ionpulse0"
/obj/screen/robot/thrusters/Click()
+ if(..())
+ return
var/mob/living/silicon/robot/R = usr
R.toggle_ionpulse()
@@ -156,43 +176,42 @@
/datum/hud/proc/toggle_show_robot_modules()
if(!isrobot(mymob)) return
- var/mob/living/silicon/robot/r = mymob
+ var/mob/living/silicon/robot/R = mymob
- r.shown_robot_modules = !r.shown_robot_modules
+ R.shown_robot_modules = !R.shown_robot_modules
update_robot_modules_display()
-/datum/hud/proc/update_robot_modules_display()
+/datum/hud/proc/update_robot_modules_display(mob/viewer)
if(!isrobot(mymob)) return
- var/mob/living/silicon/robot/r = mymob
+ var/mob/living/silicon/robot/R = mymob
- if(!r.client)
+ var/mob/screenmob = viewer || R
+
+ if(!R.module)
return
- if(!r.module)
- return
-
- if(r.shown_robot_modules && hud_shown)
+ if(R.shown_robot_modules && screenmob.hud_used.hud_shown)
//Modules display is shown
- r.client.screen += module_store_icon //"store" icon
+ screenmob.client.screen += module_store_icon //"store" icon
- if(!r.module.modules)
+ if(!R.module.modules)
usr << "Selected module has no modules to select"
return
- if(!r.robot_modules_background)
+ if(!R.robot_modules_background)
return
- var/display_rows = Ceiling(length(r.module.get_inactive_modules()) / 8)
- r.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
- r.client.screen += r.robot_modules_background
+ var/display_rows = Ceiling(length(R.module.get_inactive_modules()) / 8)
+ R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
+ screenmob.client.screen += R.robot_modules_background
var/x = -4 //Start at CENTER-4,SOUTH+1
var/y = 1
- for(var/atom/movable/A in r.module.get_inactive_modules())
+ for(var/atom/movable/A in R.module.get_inactive_modules())
//Module is not currently active
- r.client.screen += A
+ screenmob.client.screen += A
if(x < 0)
A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
else
@@ -206,37 +225,40 @@
else
//Modules display is hidden
- r.client.screen -= module_store_icon //"store" icon
+ screenmob.client.screen -= module_store_icon //"store" icon
- for(var/atom/A in r.module.get_inactive_modules())
+ for(var/atom/A in R.module.get_inactive_modules())
//Module is not currently active
- r.client.screen -= A
- r.shown_robot_modules = 0
- r.client.screen -= r.robot_modules_background
+ screenmob.client.screen -= A
+ R.shown_robot_modules = 0
+ screenmob.client.screen -= R.robot_modules_background
/mob/living/silicon/robot/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/robot(src)
-/datum/hud/robot/persistant_inventory_update()
+/datum/hud/robot/persistant_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/silicon/robot/R = mymob
- if(hud_shown)
+
+ var/mob/screenmob = viewer || R
+
+ if(screenmob.hud_used.hud_shown)
if(R.module_state_1)
R.module_state_1.screen_loc = ui_inv1
- R.client.screen += R.module_state_1
+ screenmob.client.screen += R.module_state_1
if(R.module_state_2)
R.module_state_2.screen_loc = ui_inv2
- R.client.screen += R.module_state_2
+ screenmob.client.screen += R.module_state_2
if(R.module_state_3)
R.module_state_3.screen_loc = ui_inv3
- R.client.screen += R.module_state_3
+ screenmob.client.screen += R.module_state_3
else
if(R.module_state_1)
- R.module_state_1.screen_loc = null
+ screenmob.client.screen -= R.module_state_1
if(R.module_state_2)
- R.module_state_2.screen_loc = null
+ screenmob.client.screen -= R.module_state_2
if(R.module_state_3)
- R.module_state_3.screen_loc = null
\ No newline at end of file
+ screenmob.client.screen -= R.module_state_3
\ No newline at end of file
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index b32de28b0a0..529a5c11ad1 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -54,8 +54,25 @@
/obj/screen/inventory/craft/Click()
var/mob/living/M = usr
+ if(isobserver(usr))
+ return
M.OpenCraftingMenu()
+/obj/screen/inventory/area_creator
+ name = "create new area"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "area_edit"
+ screen_loc = ui_building
+
+/obj/screen/inventory/area_creator/Click()
+ if(usr.incapacitated())
+ return 1
+ var/area/A = get_area(usr)
+ if(!A.outdoors)
+ usr << "There is already a defined structure here."
+ return 1
+ create_area(usr)
+
/obj/screen/inventory
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
var/icon_empty // Icon when empty. For now used only by humans.
@@ -261,6 +278,8 @@
icon_state = "running"
/obj/screen/mov_intent/Click()
+ if(isobserver(usr))
+ return
switch(usr.m_intent)
if("run")
usr.m_intent = "walk"
@@ -276,6 +295,8 @@
icon_state = "pull"
/obj/screen/pull/Click()
+ if(isobserver(usr))
+ return
usr.stop_pulling()
/obj/screen/pull/update_icon(mob/mymob)
@@ -329,6 +350,8 @@
var/selecting = "chest"
/obj/screen/zone_sel/Click(location, control,params)
+ if(isobserver(usr))
+ return
var/list/PL = params2list(params)
var/icon_x = text2num(PL["icon-x"])
var/icon_y = text2num(PL["icon-y"])
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index dc86c45a325..e49316ebe3c 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -140,7 +140,7 @@
statclick = new/obj/effect/statclick/debug("Initializing...", src)
if(can_fire)
- msg = "[round(cost*ticks,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]"
+ msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]"
else
msg = "OFFLINE\t[msg]"
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index a1dcbdaa2f8..55daa97c710 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -31,6 +31,11 @@ var/datum/subsystem/ticker/ticker
var/list/syndicate_coalition = list() //list of traitor-compatible factions
var/list/factions = list() //list of all factions
var/list/availablefactions = list() //list of factions with openings
+ var/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, \
+ SCRIPTURE_SCRIPT = FALSE, \
+ SCRIPTURE_APPLICATION = FALSE, \
+ SCRIPTURE_REVENANT = FALSE, \
+ SCRIPTURE_JUDGEMENT = FALSE) //list of clockcult scripture states for announcements
var/delay_end = 0 //if set true, the round will not restart on it's own
@@ -103,6 +108,7 @@ var/datum/subsystem/ticker/ticker
mode.process(wait * 0.1)
check_queue()
check_maprotate()
+ scripture_states = scripture_unlock_alert(scripture_states)
if(!mode.explosion_in_progress && mode.check_finished() || force_ending)
current_state = GAME_STATE_FINISHED
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 31779f99b8f..775e08f8e49 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -13,6 +13,7 @@
var/obj/screen/movable/action_button/button = null
var/button_icon = 'icons/mob/actions.dmi'
var/background_icon_state = "bg_default"
+ var/buttontooltipstyle = ""
var/icon_icon = 'icons/mob/actions.dmi'
var/button_icon_state = "default"
@@ -23,6 +24,7 @@
button = new
button.linked_action = src
button.name = name
+ button.actiontooltipstyle = buttontooltipstyle
if(desc)
button.desc = desc
@@ -189,6 +191,7 @@
/datum/action/item_action/clock
background_icon_state = "bg_clock"
+ buttontooltipstyle = "clockcult"
/datum/action/item_action/clock/IsAvailable()
if(!is_servant_of_ratvar(owner))
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index ffe25551553..a785bcc3001 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -50,4 +50,66 @@ Bonus
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
+ return 1
+
+/*
+//////////////////////////////////////
+
+Asphyxiation
+
+ Very very noticable.
+ Decreases stage speed.
+ Decreases transmittablity.
+
+Bonus
+ Inflicts large spikes of oxyloss
+ Introduces Asphyxiating drugs to the system
+ Causes cardiac arrest on dying victims.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/asphyxiation
+
+ name = "Acute respiratory distress syndrome"
+ stealth = -2
+ resistance = -0
+ stage_speed = -1
+ transmittable = -2
+ level = 7
+ severity = 3
+
+/datum/symptom/asphyxiation/Activate(datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3, 4)
+ M << "[pick("Your windpipe feels thin.", "Your lungs feel small.")]"
+ Asphyxiate_stage_3_4(M, A)
+ M.emote("gasp")
+ else
+ M << "[pick("Your lungs hurt!", "It hurts to breathe!")]"
+ Asphyxiate(M, A)
+ M.emote("gasp")
+ if(M.getOxyLoss() >= 120)
+ M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!")
+ Asphyxiate_death(M, A)
+ return
+
+/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A)
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.7)+sqrt(16+A.totalStealth())
+ M.adjustOxyLoss(get_damage)
+ return 1
+
+/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A)
+ var/get_damage = sqrt(21+A.totalStageSpeed())+sqrt(16+A.totalStealth()*5)
+ M.adjustOxyLoss(get_damage)
+ M.reagents.add_reagent_list(list("pancuronium" = 2, "sodium_thiopental" = 2))
+ return 1
+
+/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
+ var/get_damage = sqrt(21+A.totalStageSpeed()*1.5)+sqrt(16+A.totalStealth()*7)
+ M.adjustOxyLoss(get_damage)
+ M.adjustBrainLoss(get_damage/2)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm
index c6b4f0a87d0..ba315278a20 100644
--- a/code/datums/diseases/advance/symptoms/damage_converter.dm
+++ b/code/datums/diseases/advance/symptoms/damage_converter.dm
@@ -59,6 +59,62 @@ Bonus
return 1
+/*
+//////////////////////////////////////
+Damage Converter (uranium)
+ Less Stealth easier to work with.
+ Lowers resistance.
+ Decreases stage speed.
+ Uranium only
+Bonus
+ Slowly converts brute/fire damage to toxin even faster without limb compensation
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/damage_converter_uranium
+
+ name = "Toxic metabolism"
+ stealth = 0
+ resistance = -2
+ stage_speed = -2
+ transmittable = 0
+ level = 7
+
+/datum/symptom/damage_converter_uranium/Activate(datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB * 15))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ Convert(M)
+ return
+
+/datum/symptom/damage_converter_uranium/proc/Convert(mob/living/M)
+
+ var/get_damage = rand(1, 2)
+
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+
+ var/list/parts = H.get_damaged_bodyparts(1,1)
+
+ if(!parts.len)
+ return
+
+ for(var/obj/item/bodypart/L in parts)
+ L.heal_damage(get_damage, get_damage, 0)
+ M.adjustToxLoss(get_damage)
+
+ else
+ if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
+ M.adjustFireLoss(-get_damage)
+ M.adjustBruteLoss(-get_damage)
+ M.adjustToxLoss(get_damage)
+ else
+ return
+
+ return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index ea805861082..087abdd62aa 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -54,4 +54,69 @@ Bonus
var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
+ return 1
+
+/*
+//////////////////////////////////////
+
+Alkali perspiration
+
+ Hidden.
+ Lowers resistance.
+ Decreases stage speed.
+ Decreases transmittablity.
+ Fatal Level.
+
+Bonus
+ Ignites infected mob.
+ Explodes mob on contact with water.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/alkali
+
+ name = "Alkali perspiration"
+ stealth = 2
+ resistance = -2
+ stage_speed = -2
+ transmittable = -2
+ level = 7
+ severity = 6
+
+/datum/symptom/alkali/Activate(datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(3)
+ M << "[pick("Your veins boil.", "You feel hot.", "You smell meat cooking.")]"
+ if(4)
+ Alkali_fire_stage_4(M, A)
+ M.IgniteMob()
+ M << "Your sweat bursts into flames!"
+ M.emote("scream")
+ if(5)
+ Alkali_fire_stage_5(M, A)
+ M.IgniteMob()
+ M << "Your skin erupts into an inferno!"
+ M.emote("scream")
+ if(M.fire_stacks < 0)
+ M.visible_message("[M]'s sweat sizzles and pops on contact with water!")
+ explosion(M.loc,0,0,2)
+ Alkali_fire_stage_5(M, A)
+ return
+
+/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
+ var/get_stacks = (sqrt(20+A.totalStageSpeed()*5))
+ M.adjust_fire_stacks(get_stacks)
+ M.adjustFireLoss(get_stacks/2)
+ M.reagents.add_reagent("clf3", 1)
+ return 1
+
+/datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A)
+ var/get_stacks = (sqrt(20+A.totalStageSpeed()*8))
+ M.adjust_fire_stacks(get_stacks)
+ M.adjustFireLoss(get_stacks)
+ M.reagents.add_reagent_list(list("napalm" = 3, "clf3" = 3))
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 462d5f333a2..77904433cfb 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -40,4 +40,49 @@ Bonus
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = ((sqrt(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
+ return 1
+
+/*
+//////////////////////////////////////
+
+Autophagocytosis (AKA Programmed mass cell death)
+
+ Very noticable.
+ Lowers resistance.
+ Fast stage speed.
+ Decreases transmittablity.
+ Fatal Level.
+
+Bonus
+ Deals brute damage over time.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/flesh_death
+
+ name = "Autophagocytosis Necrosis"
+ stealth = -2
+ resistance = -2
+ stage_speed = 1
+ transmittable = -2
+ level = 7
+ severity = 6
+
+/datum/symptom/flesh_death/Activate(datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(2,3)
+ M << "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]"
+ if(4,5)
+ M << "[pick("You feel your muscles weakening.", "Your skin begins detaching itself.", "You feel sandy.")]"
+ Flesh_death(M, A)
+ return
+
+/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A)
+ var/get_damage = ((sqrt(16-A.totalStealth()))*6)
+ M.adjustBruteLoss(get_damage)
+ M.reagents.add_reagent_list(list("heparin" = 5, "lipolicide" = 5))
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 9622f9246d7..ed98544b26d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -41,6 +41,45 @@ Bonus
/*
//////////////////////////////////////
+Apoptosis
+
+ Lowers resistance.
+ Decreases stage speed.
+ Decreases transmittablity.
+
+Bonus
+ Heals toxins in the affected mob's blood stream faster.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/aptx
+
+ name = "Apoptoxin filter"
+ stealth = 0
+ resistance = -2
+ stage_speed = -2
+ transmittable = -2
+ level = 8
+
+/datum/symptom/aptx/Activate(datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB * 10))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ Apoptosis(M, A)
+ return
+
+/datum/symptom/aptx/proc/Apoptosis(mob/living/M, datum/disease/advance/A)
+ var/get_damage = (sqrt(20+A.totalStageSpeed())*(2+rand()))
+ M.adjustToxLoss(-get_damage)
+ return 1
+
+
+/*
+//////////////////////////////////////
+
Metabolism
Little bit hidden.
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a5b7b4dfdc9..045b87e3eb3 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -211,6 +211,38 @@
gang_datum.remove_gang_hud(src)
+//Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does.
+
+/datum/mind/proc/enslave_mind_to_creator(mob/living/creator)
+ if(iscultist(creator))
+ ticker.mode.add_cultist(src)
+
+ else if(is_gangster(creator))
+ ticker.mode.add_gangster(src, creator.mind.gang_datum, TRUE)
+
+ else if(is_handofgod_redcultist(creator) || is_handofgod_redprophet(creator))
+ ticker.mode.add_hog_follower(src, "Red")
+
+ else if(is_handofgod_bluecultist(creator) || is_handofgod_blueprophet(creator))
+ ticker.mode.add_hog_follower(src, "Blue")
+
+ else if(is_revolutionary_in_general(creator))
+ ticker.mode.add_revolutionary(src)
+
+ else if(is_servant_of_ratvar(creator))
+ add_servant_of_ratvar(src)
+
+ else if(is_nuclear_operative(creator))
+ make_Nuke(null, null, 0, FALSE)
+
+ enslaved_to = creator
+
+ current.faction = creator.faction
+
+ if(special_role)
+ message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.")
+ 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)
if(!recipient)
recipient = current
@@ -1356,7 +1388,7 @@
ticker.mode.finalize_traitor(src)
ticker.mode.greet_traitor(src)
-/datum/mind/proc/make_Nuke(turf/spawnloc,nuke_code,leader=0, telecrystals = TRUE)
+/datum/mind/proc/make_Nuke(turf/spawnloc, nuke_code, leader=0, telecrystals = TRUE)
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
ticker.mode.update_synd_icons_added(src)
@@ -1364,24 +1396,33 @@
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
- current.loc = spawnloc
+ if(spawnloc)
+ current.loc = spawnloc
- var/mob/living/carbon/human/H = current
- qdel(H.belt)
- qdel(H.back)
- qdel(H.ears)
- qdel(H.gloves)
- qdel(H.head)
- qdel(H.shoes)
- qdel(H.wear_id)
- qdel(H.wear_suit)
- qdel(H.w_uniform)
+ if(istype(current, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = current
+ qdel(H.belt)
+ qdel(H.back)
+ qdel(H.ears)
+ qdel(H.gloves)
+ qdel(H.head)
+ qdel(H.shoes)
+ qdel(H.wear_id)
+ qdel(H.wear_suit)
+ qdel(H.w_uniform)
- ticker.mode.equip_syndicate(current, telecrystals)
+ ticker.mode.equip_syndicate(current, telecrystals)
if (nuke_code)
store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
current << "The nuclear authorization code is: [nuke_code]"
+ else
+ var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in nuke_list
+ if(nuke)
+ store_memory("Syndicate Nuclear Bomb Code: [nuke.r_code]", 0, 0)
+ current << "The nuclear authorization code is: nuke.r_code"
+ else
+ current << "You were not provided with a nuclear code. Trying asking your team leader or contacting syndicate command."
if (leader)
ticker.mode.prepare_syndicate_leader(src,nuke_code)
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 793677e553f..dabf6d9ad57 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -295,4 +295,12 @@
for repairs. What were they doing..? Their shipment sure \
seems to be filled with a strange mix. Anyway, it looks like \
some people tried to fix it up for a long time \
- but didn't really get anywhere..."
\ No newline at end of file
+ but didn't really get anywhere..."
+
+
+/datum/map_template/ruin/space/miracle
+ id = "miracle"
+ suffix = "miracle.dmm"
+ name = "Ordinary Space Tile"
+ description = "Absolutely nothing strange going on here please \
+ move along, plenty more space to see right this way!"
\ No newline at end of file
diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm
index 3592fbc4e00..408b090cb0e 100644
--- a/code/game/gamemodes/antag_hud.dm
+++ b/code/game/gamemodes/antag_hud.dm
@@ -55,3 +55,38 @@
for(var/datum/atom_hud/data/hud in huds)
if(current in hud.hudusers)
hud.remove_hud_from(current)
+
+/datum/atom_hud/antag/gang
+ var/color = null
+
+/datum/atom_hud/antag/gang/add_to_hud(atom/A)
+ if(!A)
+ return
+ var/image/holder = A.hud_list[ANTAG_HUD]
+ if(holder)
+ holder.color = color
+ ..()
+
+/datum/atom_hud/antag/gang/remove_from_hud(atom/A)
+ if(!A)
+ return
+ var/image/holder = A.hud_list[ANTAG_HUD]
+ if(holder)
+ holder.color = null
+ ..()
+
+/datum/atom_hud/antag/gang/join_hud(mob/M)
+ if(!istype(M))
+ CRASH("join_hud(): [M] ([M.type]) is not a mob!")
+ var/image/holder = M.hud_list[ANTAG_HUD]
+ if(holder)
+ holder.color = color
+ ..()
+
+/datum/atom_hud/antag/gang/leave_hud(mob/M)
+ if(!istype(M))
+ CRASH("leave_hud(): [M] ([M.type]) is not a mob!")
+ var/image/holder = M.hud_list[ANTAG_HUD]
+ if(holder)
+ holder.color = null
+ ..()
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index cbc03db8e52..614664ddcde 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -162,14 +162,10 @@
user << "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded."
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
- var/new_op_code = "Ask your leader!"
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
- var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in nuke_list
- if(nuke)
- new_op_code = nuke.r_code
- M.mind.make_Nuke(T, new_op_code, 0, FALSE)
+ M.mind.make_Nuke(T, nuke_code = null, 0, FALSE)
var/newname = M.dna.species.random_name(M.gender,0,ticker.mode.nukeops_lastname)
M.mind.name = newname
M.real_name = newname
@@ -213,12 +209,7 @@
R.mmi.brainmob.name = brainopsname
R.key = C.key
- ticker.mode.syndicates += R.mind
- ticker.mode.update_synd_icons_added(R.mind)
- R.mind.special_role = "syndicate"
- R.faction = list("syndicate")
-
-
+ R.mind.make_Nuke(T, nuke_code = null,leader=0, telecrystals = TRUE)
///////////SLAUGHTER DEMON
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index fbf0b21d25a..af87096c7a1 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -88,9 +88,7 @@ This file's folder contains:
M.visible_message("[M]'s eyes glow a blazing yellow!", \
"Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
whim without hesitation.")
- var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar += M.mind
- scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_added(M.mind)
M.mind.special_role = "Servant of Ratvar"
M.languages_spoken |= RATVAR
@@ -104,20 +102,26 @@ This file's folder contains:
var/mob/living/silicon/robot/R = S
R.UnlinkSelf()
R.emagged = 1
- R << "You have been desynced from your master AI. In addition, your onboard camera is no longer active and your safeties have been disabled."
+ if(!silent)
+ R << "You have been desynced from your master AI. In addition, your onboard camera is no longer active and your safeties have been disabled."
else if(isAI(S))
var/mob/living/silicon/ai/A = S
for(var/C in A.connected_robots)
var/mob/living/silicon/robot/R = C
if(R.connected_ai == A)
- add_servant_of_ratvar(R)
+ R.visible_message("[R]'s eyes glow a blazing yellow!", \
+ "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
+ whim without hesitation.")
+ R << "Your onboard camera is no longer active and your safeties have been disabled."
+ add_servant_of_ratvar(R, TRUE)
S.laws = new/datum/ai_laws/ratvar
S.laws.associate(S)
S.update_icons()
S.show_laws()
var/datum/action/innate/hierophant/H = new()
H.Grant(S)
- H.title = null //so it's just the borg's name
+ H.title = "Silicon"
+ H.span_for_name = "nezbere"
S << "You can communicate with other servants by using the Hierophant Network action button in the upper left."
else if(isbrain(M))
var/datum/action/innate/hierophant/H = new()
@@ -135,6 +139,7 @@ This file's folder contains:
if(istype(ticker.mode, /datum/game_mode/clockwork_cult))
var/datum/game_mode/clockwork_cult/C = ticker.mode
C.present_tasks(M) //Memorize the objectives
+ M.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
cache_check(M)
return 1
@@ -144,9 +149,7 @@ This file's folder contains:
if(!silent)
M.visible_message("[M] seems to have remembered their true allegiance!", \
"A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
- var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar -= M.mind
- scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_removed(M.mind)
all_clockwork_mobs -= M
M.mind.memory = "" //Not sure if there's a better way to do this
@@ -155,6 +158,7 @@ This file's folder contains:
M.languages_understood &= ~RATVAR
M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
M.attack_log += "\[[time_stamp()]\] Has renounced the cult of Ratvar!"
+ M.clear_alert("clockinfo")
M.clear_alert("nocache")
for(var/datum/action/innate/function_call/F in M.actions) //Removes any bound Ratvarian spears
qdel(F)
@@ -242,7 +246,7 @@ This file's folder contains:
clockwork_objective = pick(possible_objectives)
switch(clockwork_objective)
if("escape")
- required_escapees = max(1, roundstart_player_count / 3) //33% of the player count must be cultists
+ required_escapees = round(max(1, roundstart_player_count / 3)) //33% of the player count must be cultists
clockwork_explanation = "Ensure that [required_escapees] servants of Ratvar escape from [station_name()]."
if("gateway")
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm
index efe337bcb0c..99c1f575d30 100644
--- a/code/game/gamemodes/clock_cult/clock_items.dm
+++ b/code/game/gamemodes/clock_cult/clock_items.dm
@@ -185,14 +185,14 @@
user << "[src] refuses to work, displaying the message: \"[busy]!\""
return 0
if(!nonhuman_usable && !ishuman(user))
- show_stats(user) //if it's not human, show it stats
+ user << "[src] hums fitfully in your hands, but doesn't seem to do anything..."
return 0
access_display(user)
/obj/item/clockwork/slab/proc/access_display(mob/living/user)
if(!is_servant_of_ratvar(user))
return 0
- var/action = alert(user, "Among the swathes of information, you see...", "[src]", "Recital", "Recollection", "Records")
+ var/action = alert(user, "Among the swathes of information, you see...", "[src]", "Recital", "Recollection", "Cancel")
if(!action || !user.canUseTopic(src))
return 0
switch(action)
@@ -201,41 +201,31 @@
user << "You need to hold the slab in your active hand to recite scripture!"
return
recite_scripture(user)
- if("Records")
- show_stats(user)
if("Recollection")
show_guide(user)
+ if("Cancel")
+ return
return 1
/obj/item/clockwork/slab/proc/recite_scripture(mob/living/user)
- var/list/tiers_of_scripture = list("Drivers")
- tiers_of_scripture += "Scripts[ratvar_awakens || scripture_unlock_check(SCRIPTURE_SCRIPT) || no_cost ? "" : " \[LOCKED\]"]"
- tiers_of_scripture += "Applications[ratvar_awakens || scripture_unlock_check(SCRIPTURE_APPLICATION) || no_cost ? "" : " \[LOCKED\]"]"
- tiers_of_scripture += "Revenant[ratvar_awakens || scripture_unlock_check(SCRIPTURE_REVENANT) || no_cost ? "" : " \[LOCKED\]"]"
- tiers_of_scripture += "Judgement[ratvar_awakens || scripture_unlock_check(SCRIPTURE_JUDGEMENT) || no_cost ? "" : " \[LOCKED\]"]"
+ var/list/tiers_of_scripture = scripture_unlock_check()
+ for(var/i in tiers_of_scripture)
+ if(!tiers_of_scripture[i] && !ratvar_awakens && !no_cost)
+ tiers_of_scripture["[i] \[LOCKED\]"] = TRUE
+ tiers_of_scripture -= i
var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture
if(!scripture_tier || !user.canUseTopic(src))
return 0
var/list/available_scriptures = list()
var/datum/clockwork_scripture/scripture_to_recite
- var/tier_to_browse
switch(scripture_tier)
- if("Drivers")
- tier_to_browse = SCRIPTURE_DRIVER
- if("Scripts")
- tier_to_browse = SCRIPTURE_SCRIPT
- if("Applications")
- tier_to_browse = SCRIPTURE_APPLICATION
- if("Revenant")
- tier_to_browse = SCRIPTURE_REVENANT
- if("Judgement")
- tier_to_browse = SCRIPTURE_JUDGEMENT
- if(!tier_to_browse)
- user << "That section of scripture is still locked!"
- return 0
+ if(SCRIPTURE_DRIVER,SCRIPTURE_SCRIPT,SCRIPTURE_APPLICATION,SCRIPTURE_REVENANT,SCRIPTURE_JUDGEMENT); //; for the empty if
+ else
+ user << "That section of scripture is still locked!"
+ return 0
for(var/S in subtypesof(/datum/clockwork_scripture))
var/datum/clockwork_scripture/C = S
- if(initial(C.tier) == tier_to_browse)
+ if(initial(C.tier) == scripture_tier)
available_scriptures += "[initial(C.name)] ([initial(C.descname)])"
if(!available_scriptures.len)
return 0
@@ -248,7 +238,8 @@
scripture_to_recite = new C
if(!scripture_to_recite || user.get_active_hand() != src)
return 0
- if(!ratvar_awakens && !no_cost && !scripture_unlock_check(scripture_to_recite.tier))
+ tiers_of_scripture = scripture_unlock_check()
+ if(!ratvar_awakens && !no_cost && !tiers_of_scripture[scripture_to_recite.tier])
user << "That scripture is no longer unlocked, and cannot be recited!"
return 0
scripture_to_recite.slab = src
@@ -256,157 +247,142 @@
scripture_to_recite.run_scripture()
return 1
-/obj/item/clockwork/slab/proc/show_stats(mob/living/user) //A bit barebones, but there really isn't any more needed
- var/servants = 0
- var/validservants = 0
- for(var/mob/living/L in living_mob_list)
- if(is_servant_of_ratvar(L))
- servants++
- if(ishuman(L) || issilicon(L))
- validservants++
- user << "State of the Enlightened"
- user << "Total servants: [servants]"
- user << "Servants valid for scripture unlock: [validservants]"
- user << "Total construction value: [clockwork_construction_value]"
- user << "Total tinkerer's caches: [clockwork_caches]"
- user << "Total tinkerer's daemons: [clockwork_daemons] ([servants / 5 < clockwork_daemons ? "DISABLED: Too few servants (5 servants per daemon)!" : "Functioning Normally"])"
- user << "Nezbere: [clockwork_generals_invoked["nezbere"] <= world.time ? "Ready" : "Invoked"]"
- user << "Sevtug: [clockwork_generals_invoked["sevtug"] <= world.time ? "Ready" : "Invoked"]"
- user << "Nzcrentr: [clockwork_generals_invoked["nzcrentr"] <= world.time ? "Ready" : "Invoked"]"
- user << "Inath-neq: [clockwork_generals_invoked["inath-neq"] <= world.time ? "Ready" : "Invoked"]"
-
/obj/item/clockwork/slab/proc/show_guide(mob/living/user)
- var/text = "
Chetr nyy hagehguf-naq-ubabe Ratvar.
\
- \
- First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
- scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
- wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.
\
- \
- This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \
- universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \
- tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.
\
- \
- This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \
- in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \
- in the clockwork slab, which will slowly generate components over time - one component of a random type is produced every 1 minute and 30 seconds, plus 30 seconds per each servant above 5, \
- which is obviously inefficient. There are other ways to create these components through scripture and certain structures.
\
- \
- In addition to their ability to pull components, slabs also possess other functionalities...
\
- \
- The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \
- effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs, cause mass confusion, or force people to walk. Nevertheless, scripture \
- is extremely important to a successful takeover.
\
- \
- The second functionality of the clockwork slab is Records. The slab is not a one-way link and can also feed information into the stream that it draws from. Records will allow many \
- important statistics to be displayed, such as the amount of people converted and total construction value. You should check it often.
\
- \
- The third and final functionality is Recollection, which will display this guide. Recollection will automatically be initiated if you have not used a slab before.
\
- \
- Examine the slab for component amount information.
\
- \
- A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \
- specified.
"
- var/text_to_add = ""
- var/drivers = "Drivers"
- var/scripts = "Scripts
These scriptures require at least five servants and a tinkerer's cache."
- var/applications = "Applications
These scriptures require at least eight servants, three tinkerer's caches, and 100CV."
- var/revenant = "Revenant
These scriptures require at least ten servants and 200CV."
- var/judgement = "Judgement
These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs."
- for(var/V in subtypesof(/datum/clockwork_scripture))
- var/datum/clockwork_scripture/S = V
- var/datum/clockwork_scripture/S2 = new V
- var/list/req_comps = S2.required_components
- var/list/cons_comps = S2.consumed_components
- qdel(S2)
- switch(initial(S.tier))
- if(SCRIPTURE_DRIVER)
- drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
- \
- Component Requirement: \
- [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Component Cost: \
- [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Tip: [initial(S.usage_tip)]
"
- if(SCRIPTURE_SCRIPT)
- scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
- \
- Component Requirement: \
- [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Component Cost: \
- [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Tip: [initial(S.usage_tip)]
"
- if(SCRIPTURE_APPLICATION)
- applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
- \
- Component Requirement: \
- [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Component Cost: \
- [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Tip: [initial(S.usage_tip)]
"
- if(SCRIPTURE_REVENANT)
- revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
- \
- Component Requirement: \
- [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Component Cost: \
- [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Tip: [initial(S.usage_tip)]
"
- if(SCRIPTURE_JUDGEMENT)
- judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
- \
- Component Requirement: \
- [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Component Cost: \
- [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
- [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
- [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
- [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
- [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
- Tip: [initial(S.usage_tip)]
"
- text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
"
- text_to_add += "Purge all untruths and honor Ratvar."
- text += text_to_add
+ var/text = "If you're seeing this, file a bug report."
if(ratvar_awakens)
text = ""
for(var/i in 1 to 100)
text += "HONOR RATVAR "
text += ""
+ else
+ text = "Chetr nyy hagehguf-naq-ubabe Ratvar.
\
+ \
+ First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
+ scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
+ wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.
\
+ \
+ This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \
+ universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \
+ tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.
\
+ \
+ This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \
+ in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \
+ in the clockwork slab, which will slowly generate components over time - one component of a random type is produced every 1 minute and 30 seconds, plus 30 seconds per each servant above 5, \
+ which is obviously inefficient. There are other ways to create these components through scripture and certain structures.
\
+ \
+ In addition to their ability to pull components, slabs also possess other functionalities...
\
+ \
+ The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \
+ effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs, cause mass confusion, or force people to walk. Nevertheless, scripture \
+ is extremely important to a successful takeover.
\
+ \
+ The second functionality of the clockwork slab is Recollection, which will display this guide.
\
+ \
+ The third to fifth functionalities are several buttons in the top left while holding the slab, from left to right, they are:
\
+ Hierophant Network, which allows communication to other servants.
\
+ Guvax, which simply allows you to quickly invoke the Guvax scripture.
\
+ Vanguard, which, like Guvax, simply allows you to quickly invoke the Vanguard scripture.
\
+ \
+ Examine the slab for component amount information.
\
+ \
+ A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \
+ specified.
"
+ var/text_to_add = ""
+ var/drivers = "[SCRIPTURE_DRIVER]"
+ var/scripts = "[SCRIPTURE_SCRIPT]
These scriptures require at least five servants and a tinkerer's cache."
+ var/applications = "[SCRIPTURE_APPLICATION]
These scriptures require at least eight servants, three tinkerer's caches, and 100CV."
+ var/revenant = "[SCRIPTURE_REVENANT]
These scriptures require at least ten servants and 200CV."
+ var/judgement = "[SCRIPTURE_REVENANT]
These scriptures require at least twelve servants and 300CV. In addition, there may not be any active non-servant AIs."
+ for(var/V in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/S = V
+ var/datum/clockwork_scripture/S2 = new V
+ var/list/req_comps = S2.required_components
+ var/list/cons_comps = S2.consumed_components
+ qdel(S2)
+ switch(initial(S.tier))
+ if(SCRIPTURE_DRIVER)
+ drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Requirement: \
+ [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Component Cost: \
+ [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_SCRIPT)
+ scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Requirement: \
+ [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Component Cost: \
+ [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_APPLICATION)
+ applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Requirement: \
+ [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Component Cost: \
+ [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_REVENANT)
+ revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Requirement: \
+ [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Component Cost: \
+ [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Tip: [initial(S.usage_tip)]
"
+ if(SCRIPTURE_JUDGEMENT)
+ judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\
+ \
+ Component Requirement: \
+ [req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Component Cost: \
+ [cons_comps["belligerent_eye"] ? "[cons_comps["belligerent_eye"]] Belligerent Eyes" : ""] \
+ [cons_comps["vanguard_cogwheel"] ? "[cons_comps["vanguard_cogwheel"]] Vanguard Cogwheels" : ""] \
+ [cons_comps["guvax_capacitor"] ? "[cons_comps["guvax_capacitor"]] Guvax Capacitors" : ""] \
+ [cons_comps["replicant_alloy"] ? "[cons_comps["replicant_alloy"]] Replicant Alloys" : ""] \
+ [cons_comps["hierophant_ansible"] ? "[cons_comps["hierophant_ansible"]] Hierophant Ansibles" : ""]
\
+ Tip: [initial(S.usage_tip)]
"
+ text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
"
+ text_to_add += "Purge all untruths and honor Ratvar."
+ text += text_to_add
var/datum/browser/popup = new(user, "slab", "", 600, 500)
popup.set_content(text)
popup.open()
@@ -421,11 +397,11 @@
if(clockwork_caches)
user << "Stored components (with global cache):"
for(var/i in stored_components)
- user << "[get_component_name(i)]s: [stored_components[i]] ([stored_components[i] + clockwork_component_cache[i]])"
+ user << "[get_component_name(i)]s: [stored_components[i]] ([stored_components[i] + clockwork_component_cache[i]])"
else
user << "Stored components:"
for(var/i in stored_components)
- user << "[get_component_name(i)]s: [stored_components[i]]"
+ user << "[get_component_name(i)]s: [stored_components[i]]"
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
@@ -642,15 +618,6 @@
w_class = 3
armor = list(melee = 80, bullet = 50, laser = -15, energy = 5, bomb = 35, bio = 0, rad = 0)
-/obj/item/clothing/head/helmet/clockwork/reclaimer //Used when a reclaimer mindjacks someone
- name = "clockwork reclaimer"
- desc = "A clockwork spider, hitchhiking like a horrible mechanical parasite."
- icon_state = "reclaimer"
- flags = NODROP
- unacidable = TRUE
- flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
- flags_cover = HEADCOVERSEYES
-
/obj/item/clothing/head/helmet/clockwork/equipped(mob/living/user, slot)
..()
if(slot == slot_head && !is_servant_of_ratvar(user))
@@ -668,6 +635,11 @@
user.adjustBrainLoss(30)
addtimer(user, "unEquip", 1, FALSE, src, 1) //equipped happens before putting stuff on(but not before picking items up). thus, we need to wait for it to be on before forcing it off.
+/obj/item/clothing/head/helmet/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
+ if(equipper && !is_servant_of_ratvar(equipper))
+ return 0
+ return ..()
+
/obj/item/clothing/suit/armor/clockwork
name = "clockwork cuirass"
desc = "A bulky cuirass made of brass."
@@ -678,6 +650,11 @@
armor = list(melee = 80, bullet = 50, laser = -15, energy = 5, bomb = 35, bio = 0, rad = 0)
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/device/mmi/posibrain/soul_vessel)
+/obj/item/clothing/suit/armor/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
+ if(equipper && !is_servant_of_ratvar(equipper))
+ return 0
+ return ..()
+
/obj/item/clothing/suit/armor/clockwork/equipped(mob/living/user, slot)
..()
if(slot == slot_wear_suit && !is_servant_of_ratvar(user))
@@ -711,6 +688,11 @@
permeability_coefficient = 0.05
armor = list(melee = 80, bullet = 50, laser = -15, energy = 5, bomb = 35, bio = 0, rad = 0)
+/obj/item/clothing/gloves/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
+ if(equipper && !is_servant_of_ratvar(equipper))
+ return 0
+ return ..()
+
/obj/item/clothing/gloves/clockwork/equipped(mob/living/user, slot)
..()
if(slot == slot_gloves && !is_servant_of_ratvar(user))
@@ -738,6 +720,11 @@
put_on_delay = 30
burn_state = FIRE_PROOF
+/obj/item/clothing/shoes/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
+ if(equipper && !is_servant_of_ratvar(equipper))
+ return 0
+ return ..()
+
/obj/item/clothing/shoes/clockwork/equipped(mob/living/user, slot)
..()
if(slot == slot_shoes && !is_servant_of_ratvar(user))
@@ -789,7 +776,7 @@
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning."
- user << "Throwing the spear will do massive damage, break the spear, and stun the target if it's an enemy cultist or silicon."
+ user << "Throwing the spear will do massive damage, break the spear, and stun the target."
/obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
var/impaling = FALSE
@@ -869,6 +856,9 @@
if(issilicon(L) || iscultist(L))
L.Stun(6)
L.Weaken(6)
+ else
+ L.Stun(2)
+ L.Weaken(2)
break_spear(T)
/obj/item/clockwork/ratvarian_spear/proc/break_spear(turf/T)
@@ -978,6 +968,14 @@
icon_state = "daemon_shell"
w_class = 3
+/obj/item/clockwork/daemon_shell/New()
+ ..()
+ clockwork_daemons++
+
+/obj/item/clockwork/daemon_shell/Destroy()
+ clockwork_daemons--
+ return ..()
+
/obj/item/clockwork/tinkerers_daemon //Shouldn't ever appear on its own
name = "tinkerer's daemon"
desc = "An arachnoid shell with a single spinning cogwheel in its center."
diff --git a/code/game/gamemodes/clock_cult/clock_machines.dm b/code/game/gamemodes/clock_cult/clock_machines.dm
index 3c8f49b96f8..2c26836fecf 100644
--- a/code/game/gamemodes/clock_cult/clock_machines.dm
+++ b/code/game/gamemodes/clock_cult/clock_machines.dm
@@ -14,7 +14,7 @@
..()
if(is_servant_of_ratvar(user) || isobserver(user))
var/powered = total_accessable_power()
- user << "It has access to [powered == INFINITY ? "INFINITY":"[powered]"]W of power."
+ user << "It has access to [powered == INFINITY ? "INFINITY":"[powered]"]W of power."
/obj/structure/clockwork/powered/Destroy()
SSfastprocess.processing -= src
@@ -173,8 +173,8 @@
/obj/structure/clockwork/powered/mending_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- user << "It contains [stored_alloy*0.04]/[max_alloy*0.04] units of liquified alloy, which is equivalent to [stored_alloy]W/[max_alloy]W of power."
- user << "It requires [mob_cost]W to heal clockwork mobs, [structure_cost]W for clockwork structures, and [cyborg_cost]W for cyborgs."
+ user << "It contains [stored_alloy*0.04]/[max_alloy*0.04] units of liquified alloy, which is equivalent to [stored_alloy]W/[max_alloy]W of power."
+ user << "It requires [mob_cost]W to heal clockwork mobs, [structure_cost]W for clockwork structures, and [cyborg_cost]W for cyborgs."
/obj/structure/clockwork/powered/mending_motor/process()
if(..() < mob_cost)
@@ -268,7 +268,7 @@
/obj/structure/clockwork/powered/mania_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- user << "It requires [mania_cost]W to run, and [convert_attempt_cost + convert_cost]W to convert humans adjecent to it."
+ user << "It requires [mania_cost]W to run, and [convert_attempt_cost + convert_cost]W to convert humans adjecent to it."
/obj/structure/clockwork/powered/mania_motor/process()
var/turf/T = get_turf(src)
@@ -399,8 +399,8 @@
user << "Its gemstone [recharging > world.time ? "has been breached by writhing tendrils of blackness that cover the totem" \
: "vibrates in place and thrums with power"]."
if(is_servant_of_ratvar(user) || isobserver(user))
- user << "It requires [disrupt_cost]W of power for each nearby disruptable electronic."
- user << "If it fails to both drain any power and disrupt any electronics, it will disable itself for [round(recharge_time/600, 1)] minutes."
+ user << "It requires [disrupt_cost]W of power for each nearby disruptable electronic."
+ user << "If it fails to both drain any power and disrupt any electronics, it will disable itself for [round(recharge_time/600, 1)] minutes."
/obj/structure/clockwork/powered/interdiction_lens/toggle(fast_process, mob/living/user)
..()
@@ -553,7 +553,7 @@
/obj/structure/clockwork/powered/clockwork_obelisk/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- user << "It requires [hierophant_cost]W to broadcast over the Hierophant Network, and [gateway_cost]W to open a Spatial Gateway."
+ user << "It requires [hierophant_cost]W to broadcast over the Hierophant Network, and [gateway_cost]W to open a Spatial Gateway."
/obj/structure/clockwork/powered/clockwork_obelisk/process()
if(locate(/obj/effect/clockwork/spatial_gateway) in loc)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
index a9baba25167..b8cea36531a 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -470,110 +470,3 @@
/mob/living/simple_animal/hostile/clockwork/marauder/proc/is_in_host() //Checks if the marauder is inside of their host
return host && loc == host
-
-
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer
- name = "clockwork reclaimer"
- desc = "A tiny clockwork arachnid with a single cogwheel spinning quickly in its head. Its legs blur, too fast to be seen clearly."
- icon_state = "clockwork_reclaimer"
- health = 50
- maxHealth = 50
- melee_damage_lower = 10
- melee_damage_upper = 10
- attacktext = "slams into"
- attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
- ventcrawler = 2
- playstyle_string = "You are a clockwork reclaimer, a harbringer of the Justiciar's light. You can crawl through vents to move more swiftly. Your \
- goal: purge all untruths and honor Ratvar. You may alt-click a valid target to break yourself apart and convert the target to a servant of Ratvar."
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer/New()
- ..()
- if(prob(1))
- real_name = "jehovah's witness"
- name = real_name
- spawn(1)
- if(mind)
- mind.special_role = null
- add_servant_of_ratvar(src, TRUE)
- src << playstyle_string
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer/Life()
- ..()
- if(ishuman(loc))
- var/mob/living/carbon/human/L = loc
- if(L.stat || !L.client)
- disengage()
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer/death()
- ..(1)
- visible_message("[src] bursts into deadly shrapnel!")
- for(var/mob/living/carbon/C in range(2, src))
- C.adjustBruteLoss(rand(3, 5))
- qdel(src)
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer/AltClickOn(atom/movable/A)
- if(!ishuman(A))
- return ..()
- var/mob/living/carbon/human/H = A
- if(is_servant_of_ratvar(H) || H.stat || (H.mind && !H.client))
- src << "[H] isn't a valid target! Valid targets are conscious non-servants."
- return 0
- if(get_dist(src, H) > 3)
- src << "You need to be closer to dominate [H]!"
- return 0
- visible_message("[src] rockets with blinding speed towards [H]!", "You leap with blinding speed towards [H]'s head!")
- for(var/i = 9, i > 0, i -= 3)
- pixel_y += i
- sleep(1)
- icon_state = "[initial(icon_state)]_charging"
- while(loc != H.loc)
- if(!H)
- icon_state = initial(icon_state)
- return 0
- sleep(1)
- forceMove(get_step(src, get_dir(src, H)))
- if(H.head)
- H.visible_message("[src] tears apart [H]'s [H.name]!")
- H.unEquip(H.head)
- qdel(H.head)
- H.visible_message("[src] latches onto [H]'s head and digs its claws in!", "[src] leaps onto your head and impales its claws deep!")
- add_servant_of_ratvar(H)
- H.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork/reclaimer(null), slot_head)
- loc = H
- icon_state = initial(icon_state)
- status_flags += GODMODE
- src << "ASSIMILATION SUCCESSFUL."
- H << "ASSIMILATION SUCCESSFUL."
- clockwork_say(H, rot13("ASSIMILATION SUCCESSFUL."))
- if(!H.mind)
- mind.transfer_to(H)
- return 1
-
-/mob/living/simple_animal/hostile/clockwork/reclaimer/verb/disengage()
- set name = "Disgengage From Host"
- set desc = "Jumps off of your host if you have one, freeing their mind but allowing you movement."
- set category = "Clockwork"
-
- if(!ishuman(usr.loc))
- usr << "You have no host! Alt-click on a non-servant to enslave them."
- return
- var/mob/living/carbon/human/L = usr.loc
- usr.loc = get_turf(L)
- pixel_y = initial(pixel_y)
- usr.visible_message("[usr] jumps off of [L]'s head!", "You disengage from your host.")
- usr.status_flags -= GODMODE
- remove_servant_of_ratvar(L)
- L.unEquip(L.head)
- qdel(L.head)
-
-
-
-/mob/living/mind_control_holder
- name = "imprisoned mind"
- desc = "A helpless mind, imprisoned in its own body."
- stat = 0
- status_flags = GODMODE
-
-/mob/living/mind_control_holder/say()
- return 0
diff --git a/code/game/gamemodes/clock_cult/clock_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_proselytizer.dm
index 07be441ebb9..5094389e663 100644
--- a/code/game/gamemodes/clock_cult/clock_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clock_proselytizer.dm
@@ -42,7 +42,7 @@
if(metal_to_alloy)
user << "It can convert rods, metal, and plasteel to liquified replicant alloy at a low rate."
if(uses_alloy)
- user << "It has [stored_alloy]/[max_alloy] units of liquified alloy stored."
+ user << "It has [stored_alloy]/[max_alloy] units of liquified alloy stored."
user << "Use it on a Tinkerer's Cache, strike it with Replicant Alloy, or attack Replicant Alloy with it to add additional liquified alloy."
user << "Use it in-hand to remove stored liquified alloy."
@@ -64,7 +64,7 @@
return 0
modify_stored_alloy(REPLICANT_ALLOY_UNIT)
playsound(user, 'sound/machines/click.ogg', 50, 1)
- user << "You force [I] to liquify and pour it into [src]'s compartments. It now contains [stored_alloy]/[max_alloy] units of liquified alloy."
+ user << "You force [I] to liquify and pour it into [src]'s compartments. It now contains [stored_alloy]/[max_alloy] units of liquified alloy."
user.drop_item()
qdel(I)
return 1
@@ -113,7 +113,7 @@
if(!can_use_alloy(proselytize_values["alloy_cost"]))
if(stored_alloy - proselytize_values["alloy_cost"] < 0)
- user << "You need [proselytize_values["alloy_cost"]] liquified alloy to proselytize [target]!"
+ user << "You need [proselytize_values["alloy_cost"]] liquified alloy to proselytize [target]!"
else if(stored_alloy - proselytize_values["alloy_cost"] > max_alloy)
user << "You have too much liquified alloy stored to proselytize [target]!"
return 0
@@ -315,7 +315,7 @@
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
if(proselytizer && user)
user.visible_message("[user] removes [proselytizer] from the hole in [src], apparently satisfied.", \
- "You finish filling [proselytizer] with liquified alloy. It now contains [proselytizer.stored_alloy]/[proselytizer.max_alloy] units of liquified alloy.")
+ "You finish filling [proselytizer] with liquified alloy. It now contains [proselytizer.stored_alloy]/[proselytizer.max_alloy] units of liquified alloy.")
return
/obj/structure/clockwork/wall_gear/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm
index 73ad516b9fc..23481a508a9 100644
--- a/code/game/gamemodes/clock_cult/clock_ratvar.dm
+++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm
@@ -76,6 +76,13 @@
var/damage = max((health * 0.70) / severity, 100) //requires multiple bombs to take down
take_damage(damage, BRUTE)
+/obj/structure/clockwork/massive/celestial_gateway/proc/get_arrival_text(s_on_time)
+ . = "IMMINENT"
+ if(!health)
+ . = "DETONATING"
+ else if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0)
+ . = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE * 0.5), 0), 1)][s_on_time ? "S":""]"
+
/obj/structure/clockwork/massive/celestial_gateway/process()
if(!progress_in_seconds || prob(7))
for(var/M in mob_list)
@@ -122,10 +129,7 @@
..()
icon_state = initial(icon_state)
if(is_servant_of_ratvar(user) || isobserver(user))
- var/arrival_text = "IMMINENT"
- if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0)
- arrival_text = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE * 0.5), 0), 1)]"
- user << "Seconds until Ratvar's arrival: [arrival_text]s"
+ user << "Seconds until Ratvar's arrival: [get_arrival_text(TRUE)]"
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "It's still opening."
@@ -188,16 +192,11 @@
/obj/structure/clockwork/massive/ratvar/attack_ghost(mob/dead/observer/O)
- var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Cogscarab", "Reclaimer", "No")
+ var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Yes", "No")
if(alertresult == "No" || !O)
return 0
- var/mob/living/simple_animal/R
- if(alertresult == "Cogscarab")
- 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!")
- else
- R = new/mob/living/simple_animal/hostile/clockwork/reclaimer(get_turf(src))
- R.visible_message("[R] forms, and it emits a faint hum!")
+ 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
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index 6ff3ece74fa..e447b813e77 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -185,7 +185,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/channeled/belligerent //Belligerent: Channeled for up to fiteen times over thirty seconds. Forces non-servants that can hear the chant to walk. Nar-Sian cultists are burned.
descname = "Channeled, Area Slowdown"
name = "Belligerent"
- desc = "Forces all nearby non-servants to walk rather than run. Chanted every two seconds for up to thirty seconds."
+ desc = "Forces all nearby non-servants to walk rather than run, doing minor damage. Chanted every two seconds for up to thirty seconds."
chant_invocations = list("Punish their blindness!", "Take time, make slow!")
chant_amount = 15
chant_interval = 20
@@ -194,15 +194,18 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
tier = SCRIPTURE_DRIVER
/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
- for(var/mob/living/L in hearers(7, invoker))
- if(!is_servant_of_ratvar(L) && L.m_intent != "walk" && !L.null_rod_check())
- if(!iscultist(L))
- L << "Your legs feel heavy and weak!"
- else //Cultists take extra burn damage
- L << "Your legs burn with pain!"
- L.apply_damage(5, BURN, "l_leg")
- L.apply_damage(5, BURN, "r_leg")
- L.m_intent = "walk"
+ for(var/mob/living/carbon/C in hearers(7, invoker))
+ if(!is_servant_of_ratvar(C) && !C.null_rod_check() && C.get_num_legs()) //you have legs right
+ C.apply_damage(1, BURN, "l_leg")
+ C.apply_damage(1, BURN, "r_leg")
+ if(C.m_intent != "walk")
+ if(!iscultist(C))
+ C << "Your legs shiver with pain!"
+ else //Cultists take extra burn damage
+ C << "Your legs burn with pain!"
+ C.apply_damage(4, BURN, "l_leg")
+ C.apply_damage(4, BURN, "r_leg")
+ C.m_intent = "walk"
@@ -236,13 +239,13 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
var/total_duration = 200
/datum/clockwork_scripture/vanguard/check_special_requirements()
- if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["duration"] > world.time)
+ if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
invoker << "You are already shielded by a Vanguard!"
return 0
return 1
/datum/clockwork_scripture/vanguard/scripture_effects()
- invoker.add_stun_absorption("vanguard", world.time + total_duration, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " is radiating with a soft yellow light!")
+ invoker.add_stun_absorption("vanguard", total_duration, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " is radiating with a soft yellow light!")
invoker.visible_message("[invoker] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.")
spawn(total_duration)
if(!invoker)
@@ -630,14 +633,14 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/function_call //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons.
descname = "Summonable Spear"
name = "Function Call"
- desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every five minutes. The spear will deal significant damage to Nar-Sie's dogs and silicon lifeforms, but will \
- vanish five minutes after being summoned."
+ desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every three minutes. The spear will deal significant damage to Nar-Sie's dogs and silicon lifeforms, but will \
+ vanish three minutes after being summoned."
invocations = list("Grant me...", "...the might of brass!")
channel_time = 20
required_components = list("replicant_alloy" = 2, "hierophant_ansible" = 1)
consumed_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1)
whispered = TRUE
- usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage, but break the spear."
+ usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and stun them, but break the spear."
tier = SCRIPTURE_SCRIPT
/datum/clockwork_scripture/function_call/check_special_requirements()
diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm
index dd96a1d00d2..e0fc254e1ea 100644
--- a/code/game/gamemodes/clock_cult/clock_structures.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures.dm
@@ -161,17 +161,13 @@
/obj/structure/clockwork/cache/New()
..()
START_PROCESSING(SSobj, src)
- var/list/scripture_states = get_scripture_states()
clockwork_caches++
- scripture_unlock_alert(scripture_states)
SetLuminosity(2,1)
for(var/i in all_clockwork_mobs)
cache_check(i)
/obj/structure/clockwork/cache/Destroy()
- var/list/scripture_states = get_scripture_states()
clockwork_caches--
- scripture_unlock_alert(scripture_states)
STOP_PROCESSING(SSobj, src)
if(linkedwall)
linkedwall.linkedcache = null
@@ -243,24 +239,13 @@
/obj/structure/clockwork/cache/attack_hand(mob/user)
if(!is_servant_of_ratvar(user))
return 0
- var/list/possible_components = list()
- for(var/i in clockwork_component_cache)
- if(clockwork_component_cache[i])
- possible_components += get_component_name(i)
- if(!possible_components.len)
- user << "[src] is empty!"
+ if(!clockwork_component_cache["replicant_alloy"])
+ user << "There is no Replicant Alloy in the global component cache!"
return 0
- var/componentid = get_component_id(input(user, "Choose a component to withdraw.", name) as null|anything in possible_components)
- if(!user || !user.canUseTopic(src) || !componentid)
- return 0
- var/obj/item/clockwork/component/the_component
- var/component_path = text2path("/obj/item/clockwork/component/[componentid]")
- if(clockwork_component_cache[componentid])
- the_component = new component_path(get_turf(src))
- clockwork_component_cache[componentid]--
- if(the_component)
- user.visible_message("[user] withdraws [the_component] from [src].", "You withdraw [the_component] from [src].")
- user.put_in_hands(the_component)
+ clockwork_component_cache["replicant_alloy"]--
+ var/obj/item/clockwork/component/replicant_alloy/A = new(get_turf(src))
+ user.visible_message("[user] withdraws [A] from [src].", "You withdraw [A] from [src].")
+ user.put_in_hands(A)
return 1
/obj/structure/clockwork/cache/examine(mob/user)
@@ -270,7 +255,7 @@
user << "It is linked and will generate components!"
user << "Stored components:"
for(var/i in clockwork_component_cache)
- user << "[get_component_name(i)]s: [clockwork_component_cache[i]]"
+ user << "[get_component_name(i)]s: [clockwork_component_cache[i]]"
/obj/structure/clockwork/ocular_warden //Ocular warden: Low-damage, low-range turret. Deals constant damage to whoever it makes eye contact with.
@@ -934,7 +919,7 @@
/obj/effect/clockwork/sigil/transmission/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
- user << "It is storing [power_charge]W of power."
+ user << "It is storing [power_charge]W of power."
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
if(power_charge)
@@ -971,7 +956,7 @@
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "It is storing [ratvar_awakens ? "INFINITE":"[vitality]"] units of vitality."
- user << "It requires at least [base_revive_cost] units of vitality to revive dead servants, in addition to any damage the servant has."
+ user << "It requires at least [base_revive_cost] units of vitality to revive dead servants, in addition to any damage the servant has."
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
@@ -987,13 +972,19 @@
animation_number = 0
animation_number++
if(!is_servant_of_ratvar(L))
- var/vitality_drained = L.adjustToxLoss(1.5)
+ var/vitality_drained = 0
if(L.stat == DEAD)
vitality_drained = L.maxHealth
- PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
- L.visible_message("[L] collapses in on themself as [src] flares bright blue!", \
- "\"[text2ratvar("Your life will not be wasted.")]\"")
+ var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
+ animate(V, alpha = 0, transform = matrix()*2, time = 8)
+ playsound(L, 'sound/magic/WandODeath.ogg', 50, 1)
+ L.visible_message("[L] collapses in on themself as [src] flares bright blue!")
+ L << "\"[text2ratvar("Your life will not be wasted.")]\""
+ for(var/obj/item/W in L)
+ L.unEquip(W)
L.dust()
+ else
+ vitality_drained = L.adjustToxLoss(1.5)
if(vitality_drained)
vitality += vitality_drained
else
diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm
index 303dac03d5b..30a8577dda5 100644
--- a/code/game/gamemodes/clock_cult/clock_unsorted.dm
+++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm
@@ -27,6 +27,7 @@
button_icon_state = "hierophant"
background_icon_state = "bg_clock"
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
+ buttontooltipstyle = "clockcult"
var/title = "Servant"
var/span_for_name = "heavy_brass"
var/span_for_message = "brass"
@@ -43,15 +44,16 @@
titled_hierophant_message(owner, input, span_for_name, span_for_message, title)
-//Function Call action: Calls forth a Ratvarian spear once every 5 minutes
+//Function Call action: Calls forth a Ratvarian spear once every 3 minutes
/datum/action/innate/function_call
name = "Function Call"
desc = "Allows you to summon a Ratvarian spear to fight enemies."
button_icon_state = "ratvarian_spear"
background_icon_state = "bg_clock"
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
+ buttontooltipstyle = "clockcult"
var/cooldown = 0
- var/base_cooldown = 3000
+ var/base_cooldown = 1800
/datum/action/innate/function_call/IsAvailable()
if(!is_servant_of_ratvar(owner) || cooldown > world.time)
@@ -67,7 +69,7 @@
owner.put_in_hands(R)
if(!ratvar_awakens)
owner << "Your spear begins to break down in this plane of existence. You can't use it for long!"
- addtimer(R, "break_spear", 3000, FALSE)
+ addtimer(R, "break_spear", base_cooldown, FALSE)
cooldown = base_cooldown + world.time
owner.update_action_buttons_icon()
addtimer(src, "update_actions", base_cooldown, FALSE)
@@ -128,48 +130,33 @@
S2.visible_message("The air in front of [target] ripples before suddenly tearing open!")
return 1
-/proc/scripture_unlock_check(scripture_tier) //check if the selected scripture tier is unlocked
+/proc/scripture_unlock_check() //returns a list of scriptures and if they're unlocked or not
var/servants = 0
var/unconverted_ai_exists = FALSE
for(var/mob/living/M in living_mob_list)
if(is_servant_of_ratvar(M) && (ishuman(M) || issilicon(M)))
servants++
- for(var/mob/living/silicon/ai/ai in living_mob_list)
- if(!is_servant_of_ratvar(ai) && ai.client)
+ else if(isAI(M))
unconverted_ai_exists = TRUE
- switch(scripture_tier)
- if(SCRIPTURE_DRIVER)
- return 1
- if(SCRIPTURE_SCRIPT)
- if(servants >= 5 && clockwork_caches)
- return 1 //5 or more non-brain servants and any number of clockwork caches
- if(SCRIPTURE_APPLICATION)
- if(servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 100)
- return 1 //8 or more non-brain servants, 3+ clockwork caches, and at least 100 CV
- if(SCRIPTURE_REVENANT)
- if(servants >= 10 && clockwork_caches >= 4 && clockwork_construction_value >= 200)
- return 1 //10 or more non-brain servants, 4+ clockwork caches, and at least 200 CV
- if(SCRIPTURE_JUDGEMENT)
- if(servants >= 12 && clockwork_caches >= 5 && clockwork_construction_value >= 300 && !unconverted_ai_exists)
- return 1 //12 or more non-brain servants, 5+ clockwork caches, at least 300 CV, and there are no living, non-servant ais
- return 0
+ . = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE)
+ //Drivers: always unlocked
+ .[SCRIPTURE_SCRIPT] = (servants >= 5 && clockwork_caches >= 1)
+ //Script: 5 or more non-brain servants and 1+ clockwork caches
+ .[SCRIPTURE_APPLICATION] = (servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 100)
+ //Application: 8 or more non-brain servants, 3+ clockwork caches, and at least 100 CV
+ .[SCRIPTURE_REVENANT] = (servants >= 10 && clockwork_caches >= 4 && clockwork_construction_value >= 200)
+ //Revenant: 10 or more non-brain servants, 4+ clockwork caches, and at least 200 CV
+ .[SCRIPTURE_JUDGEMENT] = (servants >= 12 && clockwork_caches >= 5 && clockwork_construction_value >= 300 && !unconverted_ai_exists)
+ //Judgement: 12 or more non-brain servants, 5+ clockwork caches, at least 300 CV, and there are no living, non-servant ais
/proc/scripture_unlock_alert(list/previous_states) //reports to servants when scripture is locked or unlocked
- var/list/states = get_scripture_states()
- for(var/i in states)
- if(states[i] != previous_states[i])
- hierophant_message("Hierophant Network: [i] Scripture has been [states[i] ? "un":""]locked.")
-
-/proc/get_scripture_states() //returns the current unlock states of each unlockable scripture tier
- . = list("Script" = scripture_unlock_check(SCRIPTURE_SCRIPT), \
- "Application" = scripture_unlock_check(SCRIPTURE_APPLICATION), \
- "Revenant" = scripture_unlock_check(SCRIPTURE_REVENANT), \
- "Judgement" = scripture_unlock_check(SCRIPTURE_JUDGEMENT))
+ . = scripture_unlock_check()
+ for(var/i in .)
+ if(.[i] != previous_states[i])
+ hierophant_message("Hierophant Network: [i] Scripture has been [.[i] ? "un":""]locked.")
/proc/change_construction_value(amount)
- var/list/scripture_states = get_scripture_states()
clockwork_construction_value += amount
- scripture_unlock_alert(scripture_states)
/proc/get_component_name(id) //returns a component name from a component id
switch(id)
@@ -224,18 +211,18 @@
clockwork_component_cache[component_to_generate]++
/proc/get_weighted_component_id(obj/item/clockwork/slab/storage_slab) //returns a chosen component id based on the lowest amount of that component
+ . = list()
if(storage_slab)
- return pickweight(list("belligerent_eye" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["belligerent_eye"] + storage_slab.stored_components["belligerent_eye"]), 1), \
- "vanguard_cogwheel" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["vanguard_cogwheel"] + storage_slab.stored_components["vanguard_cogwheel"]), 1), \
- "guvax_capacitor" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["guvax_capacitor"] + storage_slab.stored_components["guvax_capacitor"]), 1), \
- "replicant_alloy" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["replicant_alloy"] + storage_slab.stored_components["replicant_alloy"]), 1), \
- "hierophant_ansible" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["hierophant_ansible"] + storage_slab.stored_components["hierophant_ansible"]), 1)))
-
- return pickweight(list("belligerent_eye" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["belligerent_eye"], 1), \
- "vanguard_cogwheel" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["vanguard_cogwheel"], 1), \
- "guvax_capacitor" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["guvax_capacitor"], 1), \
- "replicant_alloy" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["replicant_alloy"], 1), \
- "hierophant_ansible" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["hierophant_ansible"], 1)))
+ if(clockwork_caches)
+ for(var/i in clockwork_component_cache)
+ .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache[i] + storage_slab.stored_components[i]), 1)
+ else
+ for(var/i in clockwork_component_cache)
+ .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*storage_slab.stored_components[i], 1)
+ else
+ for(var/i in clockwork_component_cache)
+ .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache[i], 1)
+ . = pickweight(.)
/proc/clockwork_say(atom/movable/AM, message, whisper=FALSE)
// When servants invoke ratvar's power, they speak in ways that non
@@ -258,7 +245,7 @@
/proc/cache_check(mob/M)
if(!clockwork_caches)
- M.throw_alert("nocache", /obj/screen/alert/nocache)
+ M.throw_alert("nocache", /obj/screen/alert/clockwork/nocache)
else
M.clear_alert("nocache")
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 66af9e8e8e7..6847906410c 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -23,10 +23,6 @@
return 0
if(issilicon(mind.current) || isbot(mind.current) || isdrone(mind.current))
return 0 //can't convert machines, that's ratvar's thing
- if(isguardian(mind.current))
- var/mob/living/simple_animal/hostile/guardian/G = mind.current
- if(!iscultist(G.summoner))
- return 0 //can't convert it unless the owner is converted
if(is_sacrifice_target(mind))
return 0
if(mind.enslaved_to && !iscultist(mind.enslaved_to))
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 606583e54ea..accff66ebdd 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -3,6 +3,7 @@
name = "Communion"
button_icon_state = "cult_comms"
background_icon_state = "bg_demon"
+ buttontooltipstyle = "cult"
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
/datum/action/innate/cultcomm/IsAvailable()
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index b08a6343b74..416e46fb9be 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -567,10 +567,16 @@ var/list/teleport_runes = list()
log_game("Raise Dead rune failed - no corpses to revive")
fail_invoke()
return
- mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
+ if(potential_sacrifice_mobs.len > 1)
+ mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
+ else
+ mob_to_sacrifice = potential_sacrifice_mobs[1]
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
return
- mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs
+ if(potential_revive_mobs.len > 1)
+ mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs
+ else
+ mob_to_sacrifice = potential_revive_mobs[1]
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
return
if(!validness_checks(mob_to_revive, user, 0))
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 0247ba7bb4d..64f0ef08d70 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -174,7 +174,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
gangster_mind.current << "You are now a member of the [G.name] Gang!"
gangster_mind.current << "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station."
gangster_mind.current << "Their ultimate objective is to take over the station with a Dominator machine."
- gangster_mind.current << "You can identify your bosses by their red \[G\] icon."
+ gangster_mind.current << "You can identify your bosses by their large, bright [G.color] \[G\] icon."
gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [G.name] Gang!"
gangster_mind.special_role = "[G.name] Gangster"
gangster_mind.store_memory("You are a member of the [G.name] Gang!")
diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm
index c98d24e754b..67e8268f087 100644
--- a/code/game/gamemodes/gang/gang_datum.dm
+++ b/code/game/gamemodes/gang/gang_datum.dm
@@ -15,7 +15,7 @@
var/list/territory_lost = list()
var/dom_attempts = 2
var/points = 15
- var/datum/atom_hud/antag/ganghud
+ var/datum/atom_hud/antag/gang/ganghud
var/domination_timer
var/is_dominating
@@ -46,6 +46,7 @@
gang_name_pool -= name
ganghud = new()
+ ganghud.color = color_hex
log_game("The [name] Gang has been created. Their gang color is [color].")
/datum/gang/proc/add_gang_hud(datum/mind/recruit_mind)
diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm
index b203493695f..2de6b0f782d 100644
--- a/code/game/gamemodes/handofgod/_handofgod.dm
+++ b/code/game/gamemodes/handofgod/_handofgod.dm
@@ -220,11 +220,12 @@ var/global/list/global_handofgod_structuretypes = list()
//////////////////
/datum/game_mode/proc/remove_hog_follower(datum/mind/follower_mind, announce = 1)//deconverts both
- follower_mind.remove_hog_follower_prophet()
- update_hog_icons_removed(follower_mind,"red")
- update_hog_icons_removed(follower_mind,"blue")
-
if(follower_mind.current)
+ if(is_handofgod_cultist(follower_mind.current) || is_handofgod_prophet(follower_mind.current))
+ follower_mind.remove_hog_follower_prophet()
+ update_hog_icons_removed(follower_mind,"red")
+ update_hog_icons_removed(follower_mind,"blue")
+
var/mob/living/carbon/human/H = follower_mind.current
H.faction -= "red god"
H.faction -= "blue god"
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 3a90b3499d8..9fa58377691 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -160,6 +160,15 @@
/obj/effect/meteor/ex_act()
return
+#define METEOR_MEDAL "Your Life Before Your Eyes"
+
+/obj/effect/meteor/examine(mob/user)
+ if(!admin_spawned && isliving(user))
+ UnlockMedal(METEOR_MEDAL,user.client)
+ ..()
+
+#undef METEOR_MEDAL
+
/obj/effect/meteor/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/pickaxe))
make_debris()
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index ccb03c9055d..1aded1d6205 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -284,6 +284,9 @@
synd_mind.current.real_name = synd_mind.name
return
+/proc/is_nuclear_operative(mob/M)
+ return M && istype(M) && M.mind && ticker && ticker.mode && M.mind in ticker.mode.syndicates
+
/datum/outfit/syndicate
name = "Syndicate Operative - Basic"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 5a44668d00b..a88b2735153 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -330,7 +330,7 @@
traitor_mob.mind.store_memory("Radio Frequency: [format_frequency(R.traitor_frequency)] ([R.name] [loc]).")
else if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/P = I
- P.lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
+ P.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")]"
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [P.name] [loc]. Simply enter the code \"[P.lock_code]\" into the ringtone select to unlock its hidden features."
traitor_mob.mind.store_memory("Uplink Passcode: [P.lock_code] ([P.name] [loc]).")
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 2c370f47da9..ec4ad68610e 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -279,6 +279,12 @@
item_path = /obj/item/weapon/gun/magic/staff/chaos
log_name = "SC"
+/datum/spellbook_entry/item/spellblade
+ name = "Spellblade"
+ desc = "A sword capable of firing blasts of energy which rip targets limb from limb."
+ item_path = /obj/item/weapon/gun/magic/staff/spellblade
+ log_name = "SB"
+
/datum/spellbook_entry/item/staffdoor
name = "Staff of Door Creation"
desc = "A particular staff that can mold solid metal into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass."
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 1348622a0ff..4dda0b11057 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -68,6 +68,21 @@
if(!robots)
dat += "No Cyborg Units detected within access parameters."
+ dat += "
"
+
+ var/drones = 0
+ for(var/mob/living/simple_animal/drone/D in mob_list)
+ if(D.hacked)
+ continue
+ drones++
+ dat += "[D.name] |"
+ if(D.stat)
+ dat += " Not Responding |"
+ dat += "(Destroy)"
+ dat += "
"
+
+ if(!drones)
+ dat += "No Drone Units detected within access parameters."
var/datum/browser/popup = new(user, "computer", "Cyborg Control Console", 400, 500)
popup.set_content(dat)
@@ -128,5 +143,17 @@
if(is_special_character(R))
R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
+ else if (href_list["killdrone"])
+ if(src.allowed(usr))
+ var/mob/living/simple_animal/drone/D = locate(href_list["killdrone"])
+ if(D.hacked)
+ usr << "ERROR: [D] is not responding to external commands."
+ else
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, D)
+ s.start()
+ D.visible_message("\the [D] self destructs!")
+ D.gib()
+
src.updateUsrDialog()
return
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 59465b1d789..0c66903dbfe 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -522,8 +522,6 @@
B.explode_now = TRUE
detonated++
existant++
- var/turf/T = get_turf(B)
- world << "[COORD(T)]"
playsound(user, 'sound/machines/click.ogg', 20, 1)
user << "[existant] found, [detonated] triggered."
if(detonated)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 0a417dbd31a..bb73af6b43f 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -111,6 +111,10 @@
pixel_y = -32
duration = 8
+/obj/effect/overlay/temp/explosion/fast
+ icon_state = "explosionfast"
+ duration = 4
+
/obj/effect/overlay/temp/blob
name = "blob"
icon_state = "blob_attack"
@@ -264,6 +268,7 @@
color = "#FAE48C"
layer = ABOVE_MOB_LAYER
duration = 70
+ luminosity = 6
/obj/effect/overlay/temp/ratvar/sigil/transgression/New()
..()
@@ -274,7 +279,7 @@
/obj/effect/overlay/temp/ratvar/sigil/vitality
color = "#1E8CE1"
icon_state = "sigilactivepulse"
- layer = BELOW_MOB_LAYER
+ layer = ABOVE_MOB_LAYER
/obj/effect/overlay/temp/ratvar/sigil/accession
color = "#AF0AAF"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e96a4fa6df0..442f35adf38 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -378,9 +378,10 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
return 1
//the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't.
+//if this is being done by a mob other than M, it will include the mob equipper, who is trying to equip the item to mob M. equipper will be null otherwise.
//If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen.
//Set disable_warning to 1 if you wish it to not give you outputs.
-/obj/item/proc/mob_can_equip(mob/M, slot, disable_warning = 0)
+/obj/item/proc/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
if(!M)
return 0
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 56e99c069fd..509f41dabea 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -1,3 +1,18 @@
+#define AREA_ERRNONE 0
+#define AREA_STATION 1
+#define AREA_SPACE 2
+#define AREA_SPECIAL 3
+
+#define BORDER_ERROR 0
+#define BORDER_NONE 1
+#define BORDER_BETWEEN 2
+#define BORDER_2NDTILE 3
+#define BORDER_SPACE 4
+
+#define ROOM_ERR_LOLWAT 0
+#define ROOM_ERR_SPACE 1
+#define ROOM_ERR_TOOLARGE 2
+
/obj/item/areaeditor
name = "area modification item"
icon = 'icons/obj/items.dmi'
@@ -5,22 +20,6 @@
attack_verb = list("attacked", "bapped", "hit")
var/fluffnotice = "Nobody's gonna read this stuff!"
- var/const/AREA_ERRNONE = 0
- var/const/AREA_STATION = 1
- var/const/AREA_SPACE = 2
- var/const/AREA_SPECIAL = 3
-
- var/const/BORDER_ERROR = 0
- var/const/BORDER_NONE = 1
- var/const/BORDER_BETWEEN = 2
- var/const/BORDER_2NDTILE = 3
- var/const/BORDER_SPACE = 4
-
- var/const/ROOM_ERR_LOLWAT = 0
- var/const/ROOM_ERR_SPACE = -1
- var/const/ROOM_ERR_TOOLARGE = -2
-
-
/obj/item/areaeditor/attack_self(mob/user)
add_fingerprint(user)
var/text = "[src] \
@@ -43,37 +42,9 @@
return
if(href_list["create_area"])
if(get_area_type()==AREA_SPACE)
- create_area()
+ create_area(usr)
updateUsrDialog()
-
-//One-use area creation permits.
-/obj/item/areaeditor/permit
- name = "construction permit"
- icon_state = "permit"
- desc = "This is a one-use permit that allows the user to offically declare a built room as new addition to the station."
- fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \
- By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
- w_class = 1
-
-
-/obj/item/areaeditor/permit/attack_self(mob/user)
- . = ..()
- var/area/A = get_area()
- if(get_area_type() == AREA_STATION)
- . += "According to \the [src], you are now in \"[html_encode(A.name)]\".
"
- var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
- popup.set_content(.)
- popup.open()
- onclose(usr, "blueprints")
-
-
-/obj/item/areaeditor/permit/create_area()
- var/success = ..()
- if(success)
- qdel(src)
-
-
//Station blueprints!!!
/obj/item/areaeditor/blueprints
name = "station blueprints"
@@ -87,7 +58,6 @@
/obj/item/areaeditor/blueprints/Destroy()
clear_viewer()
-
return ..()
@@ -179,29 +149,28 @@
return AREA_SPECIAL
return AREA_STATION
-
-/obj/item/areaeditor/proc/create_area()
- var/res = detect_room(get_turf(usr))
+/proc/create_area(mob/living/creator)
+ var/res = detect_room(get_turf(creator))
if(!istype(res,/list))
switch(res)
if(ROOM_ERR_SPACE)
- usr << "The new area must be completely airtight."
+ creator << "The new area must be completely airtight."
return
if(ROOM_ERR_TOOLARGE)
- usr << "The new area is too large."
+ creator << "The new area is too large."
return
else
- usr << "Error! Please notify administration."
+ creator << "Error! Please notify administration."
return
var/list/turfs = res
- var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN))
+ var/str = trim(stripped_input(creator,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN))
if(!str || !length(str)) //cancel
return
if(length(str) > 50)
- usr << "The given name is too long. The area remains undefined."
+ creator << "The given name is too long. The area remains undefined."
return
- var/area/old = get_area(get_turf(src))
+ var/area/old = get_area(get_turf(creator))
var/old_gravity = old.has_gravity
var/area/A
@@ -220,14 +189,14 @@
A.contents += turfs
A.SetDynamicLighting()
A.has_gravity = old_gravity
- interact()
+ creator << "You have created a new area, named [str]. It is now weather proof, and constructing an APC will allow it to be powered."
return 1
/obj/item/areaeditor/proc/edit_area()
var/area/A = get_area()
var/prevname = "[A.name]"
- var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN))
+ var/str = trim(stripped_input(usr,"New area name:", "Area Creation", "", MAX_NAME_LEN))
if(!str || !length(str) || str==prevname) //cancel
return
if(length(str) > 50)
@@ -258,33 +227,26 @@
//TODO: much much more. Unnamed airlocks, cameras, etc.
-/obj/item/areaeditor/proc/check_tile_is_border(turf/T2,dir)
- if (istype(T2, /turf/open/space))
- return BORDER_SPACE //omg hull breach we all going to die here
- if (get_area_type(T2.loc)!=AREA_SPACE)
- return BORDER_BETWEEN
- if (istype(T2, /turf/closed/wall))
- return BORDER_2NDTILE
- if (!istype(T2, /turf))
- return BORDER_BETWEEN
+/turf/proc/check_tile_is_border()
+ return BORDER_NONE
- for (var/obj/structure/window/W in T2)
- if(turn(dir,180) == W.dir)
- return BORDER_BETWEEN
- if (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST))
+/turf/open/space/check_tile_is_border()
+ return BORDER_SPACE
+
+/turf/closed/check_tile_is_border()
+ return BORDER_2NDTILE
+
+/turf/open/check_tile_is_border()
+ for(var/atom/movable/AM in src)
+ if(!AM.CanAtmosPass(src))
return BORDER_2NDTILE
- for(var/obj/machinery/door/window/D in T2)
- if(turn(dir,180) == D.dir)
- return BORDER_BETWEEN
- if (locate(/obj/machinery/door) in T2)
- return BORDER_2NDTILE
- if (locate(/obj/structure/falsewall) in T2)
- return BORDER_2NDTILE
return BORDER_NONE
+/turf/closed/mineral/check_tile_is_border()
+ return BORDER_NONE
-/obj/item/areaeditor/proc/detect_room(turf/first)
+/proc/detect_room(turf/first)
var/list/turf/found = new
var/list/turf/pending = list(first)
var/list/border = list()
@@ -312,7 +274,7 @@
if (!isturf(NT) || (NT in found) || (NT in pending))
continue
- switch(check_tile_is_border(NT,dir))
+ switch(NT.check_tile_is_border())
if(BORDER_NONE)
pending+=NT
if(BORDER_BETWEEN)
@@ -333,7 +295,7 @@
var/turf/U = get_step(F, direction)
if((U in border) || (U in found))
continue
- if(check_tile_is_border(U, direction) == BORDER_2NDTILE)
+ if(U.check_tile_is_border() == BORDER_2NDTILE)
found += U
found |= F
return found
@@ -347,4 +309,4 @@
desc = "A digital copy of the station blueprints stored in your memory."
icon = 'icons/obj/items.dmi'
icon_state = "blueprints"
- fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
\ No newline at end of file
+ fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 22733e18296..a1ded3061aa 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -187,6 +187,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "
[scanmode == 5 ? "Disable" : "Enable"] Gas Scanner"
if (cartridge.access_remote_door)
dat += "
Toggle Remote Door"
+ if (cartridge.access_dronephone)
+ dat += "
Drone Phone"
dat += "
Atmospheric Scan"
dat += "
[fon ? "Disable" : "Enable"] Flashlight"
if (pai)
@@ -274,7 +276,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "Temperature: [round(environment.temperature-T0C)]°C
"
dat += "
"
-
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
dat += cart
@@ -381,6 +382,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_atmos))
scanmode = 5
+ if("Drone Phone")
+ var/area/A = get_area(U)
+ var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical")
+ if(A && alert_s)
+ var/msg = "NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!"
+ _alert_drones(msg, 1)
+ U << msg
+
//NOTEKEEPER FUNCTIONS===================================
@@ -464,6 +473,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
M.close()
+
if("Detonate")//Detonate PDA
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
var/obj/item/device/pda/P = locate(href_list["target"])
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 575cb81c0b2..056ebd897c1 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -23,6 +23,7 @@
var/access_status_display = 0
var/access_quartermaster = 0
var/access_hydroponics = 0
+ var/access_dronephone = 0
var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT|MULE_BOT|FLOOR_BOT|CLEAN_BOT|MED_BOT
var/spam_enabled = 0 //Enables "Send to All" Option
@@ -45,12 +46,14 @@
name = "\improper Power-ON cartridge"
icon_state = "cart-e"
access_engine = 1
+ access_dronephone = 1
bot_access_flags = FLOOR_BOT
/obj/item/weapon/cartridge/atmos
name = "\improper BreatheDeep cartridge"
icon_state = "cart-a"
access_atmos = 1
+ access_dronephone = 1
bot_access_flags = FLOOR_BOT
/obj/item/weapon/cartridge/medical
@@ -84,6 +87,7 @@
desc = "The ultimate in clean-room design."
icon_state = "cart-j"
access_janitor = 1
+ access_dronephone = 1
bot_access_flags = CLEAN_BOT
/obj/item/weapon/cartridge/lawyer
@@ -120,6 +124,7 @@
name = "\improper B.O.O.P. Remote Control cartridge"
desc = "Packed with heavy duty triple-bot interlink!"
bot_access_flags = FLOOR_BOT|CLEAN_BOT|MED_BOT
+ access_dronephone = 1
/obj/item/weapon/cartridge/signal
name = "generic signaler cartridge"
@@ -161,6 +166,7 @@
access_security = 1
access_newscaster = 1
access_quartermaster = 1
+ access_dronephone = 1
/obj/item/weapon/cartridge/hos
name = "\improper R.O.B.U.S.T. DELUXE cartridge"
@@ -178,6 +184,7 @@
access_status_display = 1
access_engine = 1
access_atmos = 1
+ access_dronephone = 1
bot_access_flags = FLOOR_BOT
/obj/item/weapon/cartridge/cmo
@@ -196,6 +203,7 @@
access_status_display = 1
access_reagent_scanner = 1
access_atmos = 1
+ access_dronephone = 1
bot_access_flags = FLOOR_BOT|CLEAN_BOT|MED_BOT
/obj/item/weapon/cartridge/rd/New()
@@ -216,6 +224,7 @@
access_newscaster = 1
access_quartermaster = 1
access_janitor = 1
+ access_dronephone = 1
bot_access_flags = SEC_BOT|MULE_BOT|FLOOR_BOT|CLEAN_BOT|MED_BOT
spam_enabled = 1
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 7ac90a7966e..03a596a3939 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -236,6 +236,7 @@
name = "mining cyborg lavaproof tracks"
desc = "An upgrade kit to apply specialized coolant systems and insulation layers to mining cyborg tracks, enabling them to withstand exposure to molten rock."
icon_state = "ash_plating"
+ burn_state = LAVA_PROOF
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
origin_tech = "engineering=4;materials=4;plasmatech=4"
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 623d39330c0..8d76fcc492a 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -320,6 +320,11 @@
origin_tech = "engineering=3;combat=1"
var/weaken = 0
+/obj/item/weapon/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin)
+ if(!..())
+ return
+ playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
+
/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
return//abort
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 92381bdfb83..15f0fcdb4b6 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -180,7 +180,15 @@
name = "high frequency blade"
desc = "Bad references are the DNA of the soul."
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
- hitsound = 'sound/weapons/bladeslice.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
+
+
+/obj/item/weapon/nullrod/scythe/spellblade
+ icon_state = "spellblade"
+ item_state = "spellblade"
+ name = "dormant spellblade"
+ desc = "The blade grants the wielder nearly limitless power...if they can figure out how to turn it on, that is."
+ hitsound = 'sound/weapons/rapierhit.ogg'
/obj/item/weapon/nullrod/scythe/talking
icon_state = "talking_sword"
@@ -188,7 +196,7 @@
name = "possessed blade"
desc = "When the station falls into chaos, it's nice to have a friend by your side."
attack_verb = list("chopped", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
var/possessed = FALSE
/obj/item/weapon/nullrod/scythe/talking/attack_self(mob/living/user)
@@ -262,6 +270,7 @@
item_state = "chain"
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed")
+ hitsound = 'sound/weapons/chainhit.ogg'
/obj/item/weapon/nullrod/fedora
name = "atheist's fedora"
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index b0bb19bc2d6..e9ca6ece91c 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -13,7 +13,7 @@
w_class = 3
origin_tech = "combat=5"
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
- hitsound = 'sound/weapons/slash.ogg' //pls replace
+ hitsound = 'sound/weapons/chainhit.ogg'
materials = list(MAT_METAL = 1000)
/obj/item/weapon/melee/chainofcommand/suicide_act(mob/user)
@@ -21,11 +21,11 @@
return (OXYLOSS)
-/obj/item/weapon/melee/rapier
- name = "captain's rapier"
- desc = "An elegant weapon, for a more civilized age."
- icon_state = "rapier"
- item_state = "rapier"
+/obj/item/weapon/melee/sabre
+ name = "officer's sabre"
+ desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease."
+ icon_state = "sabre"
+ item_state = "sabre"
flags = CONDUCT
force = 15
throwforce = 10
@@ -35,10 +35,10 @@
sharpness = IS_SHARP
origin_tech = "combat=5"
attack_verb = list("lunged at", "stabbed")
- hitsound = 'sound/weapons/slash.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
-/obj/item/weapon/melee/rapier/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+/obj/item/weapon/melee/sabre/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == PROJECTILE_ATTACK)
final_block_chance = 0 //Don't bring a sword to a gunfight
return ..()
@@ -238,4 +238,4 @@
T.CalculateAdjacentTurfs()
/obj/item/weapon/melee/supermatter_sword/add_blood(list/blood_dna)
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index d33a8191532..24708a7829d 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -31,6 +31,8 @@
/obj/item/weapon/shield/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == THROWN_PROJECTILE_ATTACK)
final_block_chance += 30
+ if(attack_type == LEAP_ATTACK)
+ final_block_chance = 100
return ..()
/obj/item/weapon/shield/riot/roman
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index f3547193c7d..e6be87025cb 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -289,6 +289,27 @@
PoolOrNew(/obj/item/stack/tile/plasteel, src)
new /obj/item/weapon/crowbar(src)
+/obj/item/weapon/storage/backpack/satchel/flat/secret/
+ var/list/reward_one_of_these = list() //Intended for map editing
+ var/list/reward_all_of_these = list() //use paths!
+ var/revealed = 0
+
+/obj/item/weapon/storage/backpack/satchel/flat/secret/New()
+ ..()
+
+ if(istype(loc,/turf/open/floor) && !istype(loc,/turf/open/floor/plating/))
+ hide(1)
+
+/obj/item/weapon/storage/backpack/satchel/flat/secret/hide(intact)
+ ..()
+ if(!intact && !revealed)
+ if(reward_one_of_these.len > 0)
+ var/reward = pick(reward_one_of_these)
+ new reward(src)
+ for(var/R in reward_all_of_these)
+ new R(src)
+ revealed = 1
+
/obj/item/weapon/storage/backpack/dufflebag
name = "dufflebag"
desc = "A large dufflebag for holding extra things."
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 030772b4395..783f978ee6c 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -140,6 +140,7 @@
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/weapon/melee/baton/loaded(src)
+ update_icon()
/obj/item/weapon/storage/belt/mining
@@ -415,28 +416,29 @@
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
-/obj/item/weapon/storage/belt/rapier
- name = "rapier sheath"
- desc = "Can hold rapiers."
+/obj/item/weapon/storage/belt/sabre
+ name = "sabre sheath"
+ desc = "An ornate sheath designed to hold an officer's blade."
icon_state = "sheath"
item_state = "sheath"
storage_slots = 1
max_w_class = 4
can_hold = list(
- /obj/item/weapon/melee/rapier
+ /obj/item/weapon/melee/sabre
)
-/obj/item/weapon/storage/belt/rapier/update_icon()
- icon_state = "[initial(icon_state)]"
- item_state = "[initial(item_state)]"
+/obj/item/weapon/storage/belt/sabre/update_icon()
+ icon_state = "sheath"
+ item_state = "sheath"
if(contents.len)
- icon_state = "[initial(icon_state)]-rapier"
- item_state = "[initial(item_state)]-rapier"
+ icon_state += "-sabre"
+ item_state += "-sabre"
if(loc && istype(loc, /mob/living))
var/mob/living/L = loc
L.regenerate_icons()
..()
-/obj/item/weapon/storage/belt/rapier/New()
+/obj/item/weapon/storage/belt/sabre/New()
..()
- new /obj/item/weapon/melee/rapier(src)
+ new /obj/item/weapon/melee/sabre(src)
+ update_icon()
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index d757dbe0abe..09690214746 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -343,18 +343,6 @@
for(var/i = 1; i <= 5; i++)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src)
-
-/obj/item/weapon/storage/box/permits
- name = "box of construction permits"
- desc = "A box for containing construction permits, used to officially declare built rooms as additions to the station."
- icon_state = "id"
-
-/obj/item/weapon/storage/box/permits/New() //There's only a few, so blueprints are still useful beyond setting every room's name to PRIMARY FART STORAGE
- ..()
- for(var/i in 1 to 3)
- new /obj/item/areaeditor/permit(src)
-
-
/obj/item/weapon/storage/box/ids
name = "box of spare IDs"
desc = "Has so many empty IDs."
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 0947d92f72e..c0a392ff390 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -57,6 +57,7 @@
quickdraw = TRUE
silent = TRUE
+
/obj/item/weapon/storage/internal/pocket/shoes/clown
can_hold = list(
/obj/item/weapon/kitchen/knife, /obj/item/weapon/switchblade, /obj/item/weapon/pen,
@@ -71,12 +72,3 @@
/obj/item/weapon/storage/internal/pocket/small/detective/New()
..()
new /obj/item/weapon/reagent_containers/food/drinks/flask/det(src)
-
-/*
-/proc/isstorage(var/atom/A)
- if(istype(A, /obj/item/weapon/storage))
- return 1
-
- if(istype(A, /obj/item/clothing))
- var/obj/item/clothing/C = A
- if(C.pockets) return 1*/
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 5b16338e67e..a4ad34def56 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -309,6 +309,11 @@
if(usr)
if(usr.client && usr.s_active != src)
usr.client.screen -= W
+ if(usr.observers && usr.observers.len)
+ for(var/M in usr.observers)
+ var/mob/dead/observe = M
+ if(observe.client && observe.s_active != src)
+ observe.client.screen -= W
add_fingerprint(usr)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index bb16e93d1a1..160b5485ff2 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -83,7 +83,7 @@
user.put_in_inactive_hand(O)
return
-/obj/item/weapon/twohanded/mob_can_equip(mob/M, slot)
+/obj/item/weapon/twohanded/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
//Cannot equip wielded items.
if(wielded)
M << "Unwield the [name] first!"
@@ -130,7 +130,7 @@
/obj/item/weapon/twohanded/required/attack_self()
return
-/obj/item/weapon/twohanded/required/mob_can_equip(mob/M, slot)
+/obj/item/weapon/twohanded/required/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
if(wielded)
M << "\The [src] is too cumbersome to carry with anything but your hands!"
return 0
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 495c461ba4b..12a7943dfa5 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -320,11 +320,58 @@
throwforce = 12
attack_verb = list("beat", "smacked")
w_class = 5
+ var/homerun_ready = 0
+ var/homerun_able = 0
+
+/obj/item/weapon/melee/baseball_bat/homerun
+ name = "home run bat"
+ desc = "This thing looks dangerous... Dangerously good at baseball, that is."
+ homerun_able = 1
+
+/obj/item/weapon/melee/baseball_bat/attack_self(mob/user)
+ if(!homerun_able)
+ ..()
+ return
+ if(homerun_ready)
+ user << "You're already ready to do a home run!"
+ ..()
+ return
+ user << "You begin gathering strength..."
+ playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1)
+ if(do_after(user, 90, target = src))
+ user << "You gather power! Time for a home run!"
+ homerun_ready = 1
+ ..()
/obj/item/weapon/melee/baseball_bat/attack(mob/living/target, mob/living/user)
. = ..()
var/atom/throw_target = get_edge_target_turf(target, user.dir)
- target.throw_at(throw_target, rand(1,2), 7, user)
+ if(homerun_ready)
+ user.visible_message("It's a home run!")
+ target.throw_at(throw_target, rand(8,10), 14, user)
+ target.ex_act(2)
+ playsound(get_turf(src), 'sound/weapons/HOMERUN.ogg', 100, 1)
+ homerun_ready = 0
+ return
+ else
+ target.throw_at(throw_target, rand(1,2), 7, user)
+
+/obj/item/weapon/melee/baseball_bat/ablative
+ name = "metal baseball bat"
+ desc = "This bat is made of highly reflective, highly armored material."
+ icon_state = "baseball_bat_metal"
+ item_state = "baseball_bat_metal"
+ force = 12
+ throwforce = 15
+
+/obj/item/weapon/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers
+ var/picksound = rand(1,2)
+ var/turf = get_turf(src)
+ if(picksound == 1)
+ playsound(turf, 'sound/weapons/effects/batreflect1.ogg', 50, 1)
+ if(picksound == 2)
+ playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1)
+ return 1
/obj/item/weapon/melee/flyswatter
name = "Flyswatter"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index cdc875701cb..d351b44af88 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -17,7 +17,6 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/clothing/suit/hazardvest(src)
new /obj/item/device/megaphone/command(src)
- new /obj/item/weapon/storage/box/permits(src)
new /obj/item/areaeditor/blueprints(src)
new /obj/item/weapon/airlock_painter(src)
new /obj/item/weapon/holosign_creator/engineering(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index ff73411c6a5..eaaed69b978 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -26,7 +26,7 @@
new /obj/item/clothing/glasses/sunglasses/gar/supergar(src)
new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
- new /obj/item/weapon/storage/belt/rapier(src)
+ new /obj/item/weapon/storage/belt/sabre(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/door_remote/captain(src)
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index c0d308d8ffc..793e57bb27c 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -112,12 +112,18 @@
/obj/structure/sign/map/left/dream
icon_state = "map-left-DS"
+ desc = "A framed picture of the station.\nClockwise from the top, you see Engineering(yellow), Arrivals(blue and white), Atmospherics(yellow), Security(red), \
+ Cargo(brown), Science(purple), Escape(red and white), and Medbay(blue).\nIn the center of the station, you see the Bridge(dark blue).\n\
+ Around those, you see Hallways/Entrances(light grey), Public Areas(grey), and Maintenance(dark grey)."
/obj/structure/sign/map/right
icon_state = "map-right"
/obj/structure/sign/map/right/dream
icon_state = "map-right-DS"
+ desc = "A framed picture of the station.\nClockwise from the top, you see Engineering(yellow), Arrivals(blue and white), Atmospherics(yellow), Security(red), \
+ Cargo(brown), Science(purple), Escape(red and white), and Medbay(blue).\nIn the center of the station, you see the Bridge(dark blue).\n\
+ Around those, you see Hallways/Entrances(light grey), Public Areas(grey), and Maintenance(dark grey)."
/obj/structure/sign/securearea
name = "\improper SECURE AREA"
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 353d3f0ffdb..40a4ab0f161 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -19,6 +19,9 @@
dir = EAST
/turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc)
+ throw_atom(AM)
+
+/turf/open/space/transit/proc/throw_atom(atom/movable/AM)
if(!AM)
return
var/max = world.maxx-TRANSITIONEDGE
@@ -53,15 +56,14 @@
AM.loc = T
AM.newtonian_move(dir)
-
-
-
//Overwrite because we dont want people building rods in space.
/turf/open/space/transit/attackby()
return
/turf/open/space/transit/New()
update_icon()
+ for(var/atom/movable/AM in src)
+ throw_atom(AM)
..()
/turf/open/space/transit/update_icon()
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 618c5303b6f..5b3d1869eff 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -788,8 +788,6 @@
else
jobs += "[replacetext("Deathsquad", " ", " ")] | "
- jobs += ""
-
if(jobban_isbanned(M, "lavaland"))
jobs += "[replacetext("Lavaland", " ", " ")] | "
else
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index bfebf4d1086..6391a9f1bbc 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -250,6 +250,8 @@
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
+ var/const/PROBABILITY_OFFSET = 25
+ var/const/PROBABILITY_BASE_PRECENT = 75
set waitfor = 0
. = 0
if (!anchored && !pulledby)
@@ -257,9 +259,9 @@
if (last_high_pressure_movement_air_cycle < SSair.times_fired)
var/move_prob = 100
if (pressure_resistance > 0)
- move_prob = pressure_difference/pressure_resistance*50
+ move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET
move_prob += pressure_resistance_prob_delta
- if (prob(move_prob))
+ if (move_prob > PROBABILITY_OFFSET && prob(move_prob))
step(src, direction)
last_high_pressure_movement_air_cycle = SSair.times_fired
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 5ee5114ce07..8a1bf3eca03 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -236,7 +236,8 @@ You can set verify to TRUE if you want send() to sleep until the client has the
"pda_refresh.png" = 'icons/pda_icons/pda_refresh.png',
"pda_scanner.png" = 'icons/pda_icons/pda_scanner.png',
"pda_signaler.png" = 'icons/pda_icons/pda_signaler.png',
- "pda_status.png" = 'icons/pda_icons/pda_status.png'
+ "pda_status.png" = 'icons/pda_icons/pda_status.png',
+ "pda_dronephone.png" = 'icons/pda_icons/pda_dronephone.png'
)
/datum/asset/simple/paper
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 43a08eceb15..413590b6db8 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -157,11 +157,6 @@
/mob/living/proc/canSuicide()
if(stat == CONSCIOUS)
- if(mental_dominator)
- src << "This body's force of will is too strong! You can't break it enough to murder them."
- if(mind_control_holder)
- mind_control_holder << "Through tremendous force of will, you stop a suicide attempt!"
- return 0
return 1
else if(stat == DEAD)
src << "You're already dead!"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 513306a0beb..a26dfacd4fb 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -78,8 +78,9 @@
if(!user.put_in_hands(I))
user << "You fumble for [I] and it falls on the floor."
- return
+ return 1
user.visible_message("[user] draws [I] from [src]!", "You draw [I] from [src].")
+ return 1
else
return ..()
@@ -401,29 +402,24 @@ BLIND // can't see anything
..()
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
- attachTie(I, user)
- ..()
+ if(!attachTie(I, user))
+ ..()
/obj/item/clothing/under/proc/attachTie(obj/item/I, mob/user, notifyAttach = 1)
if(istype(I, /obj/item/clothing/tie))
+ var/obj/item/clothing/tie/T = I
if(hastie)
if(user)
user << "[src] already has an accessory."
return 0
else
- if(user)
- if(!user.drop_item())
- return
- hastie = I
- I.loc = src
+ if(user && !user.drop_item())
+ return
+ if(!T.attach(src, user))
+ return
+
if(user && notifyAttach)
user << "You attach [I] to [src]."
- I.transform *= 0.5 //halve the size so it doesn't overpower the under
- I.pixel_x += 8
- I.pixel_y -= 8
- I.layer = FLOAT_LAYER
- add_overlay(I)
-
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
@@ -431,6 +427,24 @@ BLIND // can't see anything
return 1
+/obj/item/clothing/under/proc/removetie(mob/user)
+ if(!isliving(user))
+ return
+ if(!can_use(user))
+ return
+
+ if(hastie)
+ var/obj/item/clothing/tie/T = hastie
+ hastie.detach(src, user)
+ if(user.put_in_hands(T))
+ user << "You detach [T] from [src]."
+ else
+ user << "You detach [T] from [src] and it falls on the floor."
+
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ H.update_inv_w_uniform()
+
/obj/item/clothing/under/examine(mob/user)
..()
@@ -495,7 +509,9 @@ BLIND // can't see anything
..()
/obj/item/clothing/under/AltClick(mob/user)
- ..()
+ if(..())
+ return 1
+
if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
@@ -544,28 +560,6 @@ BLIND // can't see anything
else
user << "Alt-click on [src] to wear it casually."
-/obj/item/clothing/under/proc/removetie(mob/user)
- if(!isliving(user))
- return
- if(!can_use(user))
- return
-
- if(hastie)
- hastie.transform *= 2
- hastie.pixel_x -= 8
- hastie.pixel_y += 8
- hastie.layer = initial(hastie.layer)
- overlays = null
- if(user.put_in_hands(hastie))
- user << "You deattach [hastie] from [src]."
- else
- user << "You deattach [hastie] from [src] and it falls on the floor."
- hastie = null
-
- if(istype(loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = loc
- H.update_inv_w_uniform()
-
/obj/item/clothing/proc/weldingvisortoggle() //Malk: proc to toggle welding visors on helmets, masks, goggles, etc.
if(!can_use(usr))
return
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 9382150950e..6e288881e9e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -66,10 +66,7 @@
dog_fashion = /datum/dog_fashion/head/clown
pockets = /obj/item/weapon/storage/internal/pocket/tiny // Honk!
-/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
- AltClick(user)
-
-/obj/item/clothing/mask/gas/clown_hat/AltClick(mob/living/user)
+/obj/item/clothing/mask/gas/clown_hat/ui_action_click(mob/user)
if(!istype(user) || user.incapacitated())
return
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 3dcf2ea3b19..6edb3a395dd 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -97,7 +97,7 @@
id = /obj/item/weapon/card/id/ert/Medical
suit = /obj/item/clothing/suit/space/hardsuit/ert/med
glasses = /obj/item/clothing/glasses/hud/health
- back = /obj/item/weapon/storage/backpack/medic
+ back = /obj/item/weapon/storage/backpack/satchel/med
belt = /obj/item/weapon/storage/belt/medical
r_hand = /obj/item/weapon/storage/firstaid/regular
backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 48188b2764d..1b902d27fe4 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -220,6 +220,7 @@ Contains:
icon_state = "ert_medical"
item_state = "ert_medical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/med
+ species_exception = list(/datum/species/angel)
/obj/item/clothing/suit/space/eva
name = "EVA suit"
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 3ede94ef0a5..dbfec48dfb0 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -7,6 +7,48 @@
item_color = "bluetie"
slot_flags = 0
w_class = 2
+ var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed
+
+/obj/item/clothing/tie/proc/attach(obj/item/clothing/under/U, user)
+ if(pockets) // Attach storage to jumpsuit
+ if(U.pockets) // storage items conflict
+ return 0
+
+ pockets.loc = U
+ U.pockets = pockets
+
+ U.hastie = src
+ loc = U
+ layer = FLOAT_LAYER
+ if(minimize_when_attached)
+ transform *= 0.5 //halve the size so it doesn't overpower the under
+ pixel_x += 8
+ pixel_y -= 8
+ U.add_overlay(src)
+
+ for(var/armor_type in armor)
+ U.armor[armor_type] += armor[armor_type]
+
+ return 1
+
+
+/obj/item/clothing/tie/proc/detach(obj/item/clothing/under/U, user)
+ if(pockets && pockets == U.pockets)
+ pockets.loc = src
+ U.pockets = null
+
+ for(var/armor_type in armor)
+ U.armor[armor_type] -= armor[armor_type]
+
+ if(minimize_when_attached)
+ transform *= 2
+ pixel_x -= 8
+ pixel_y += 8
+ layer = initial(layer)
+ U.cut_overlays()
+ U.hastie = null
+
+
/obj/item/clothing/tie/blue
name = "blue tie"
@@ -35,6 +77,7 @@
icon_state = "waistcoat"
item_state = "waistcoat"
item_color = "waistcoat"
+ minimize_when_attached = FALSE
/obj/item/clothing/tie/stethoscope
name = "stethoscope"
@@ -312,7 +355,6 @@
desc = "Damn, it feels good to be a gangster."
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "bling"
- item_state = "" //no inhands
item_color = "bling"
////////////////
@@ -322,9 +364,6 @@
/obj/item/clothing/tie/talisman
name = "bone talisman"
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
- icon = 'icons/obj/clothing/ties.dmi'
icon_state = "talisman"
- item_state = ""
item_color = "talisman"
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD
- armor = list(melee = 5, bullet = 5, laser = 5, energy = 5, bomb = 50, bio = 65, rad = 5) //Faith is the best armor. //This won't actually work because of accessories kill me with a fucking knife jesus christ I hate code
+ armor = list(melee = 5, bullet = 5, laser = 5, energy = 5, bomb = 20, bio = 20, rad = 5) //Faith is the best armor.
diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm
index c334452ebc5..53eb8d34caf 100644
--- a/code/modules/countdown/countdown.dm
+++ b/code/modules/countdown/countdown.dm
@@ -116,7 +116,7 @@
if(!istype(G))
return
else if(G.health && !G.purpose_fulfilled)
- return "[GATEWAY_RATVAR_ARRIVAL - G.progress_in_seconds]
"
+ return "[G.get_arrival_text(FALSE)]
"
/obj/effect/countdown/transformer
name = "transformer countdown"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 1559706e343..e3865883156 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -413,3 +413,10 @@
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonfire
+ name = "Bonfire"
+ time = 60
+ reqs = list(/obj/item/weapon/grown/log = 5)
+ result = /obj/structure/bonfire
+ category = CAT_PRIMAL
\ No newline at end of file
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index b3a3ba10654..2f8e95e799c 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -9,7 +9,7 @@
/obj/item/weapon/deck
name = "deck of cards"
desc = "A simple deck of playing cards."
- icon = 'playing_cards.dmi'
+ icon = 'icons/obj/playing_cards.dmi'
icon_state = "deck"
w_class = 2
flags = NOBLUDGEON
@@ -117,7 +117,7 @@
/obj/item/weapon/hand
name = "hand of cards"
desc = "Some playing cards."
- icon = 'playing_cards.dmi'
+ icon = 'icons/obj/playing_cards.dmi'
icon_state = "empty"
w_class = 1
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index b403ebee52f..4eb2df03372 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -90,4 +90,107 @@
icon_state = "steellogs"
accepted = list()
plank_type = /obj/item/stack/rods
- plank_name = "rods"
\ No newline at end of file
+ plank_name = "rods"
+
+
+/////////BONFIRES//////////
+
+/obj/structure/bonfire
+ name = "bonfire"
+ desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "bonfire"
+ density = FALSE
+ anchored = TRUE
+ buckle_lying = 0
+ var/burning = 0
+ var/flame_strength = FLAMMABLE
+ var/fire_stack_strength = 5
+
+/obj/structure/bonfire/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/stack/rods) && !can_buckle)
+ var/obj/item/stack/rods/R = W
+ R.use(1)
+ can_buckle = 1
+ buckle_requires_restraints = 1
+ user << "You add a rod to [src]."
+ var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16)
+ underlays += U
+ if(W.is_hot())
+ StartBurning()
+
+
+/obj/structure/bonfire/attack_hand(mob/user)
+ if(burning)
+ user << "You need to extinguish [src] before removing the logs!"
+ return
+ if(!has_buckled_mobs() && do_after(user, 50, target = src))
+ for(var/I in 1 to 5)
+ var/obj/item/weapon/grown/log/L = new /obj/item/weapon/grown/log(src.loc)
+ L.pixel_x += rand(1,4)
+ L.pixel_y += rand(1,4)
+ qdel(src)
+ return
+ ..()
+
+
+/obj/structure/bonfire/proc/CheckOxygen()
+ if(istype(loc,/turf/open))
+ var/turf/open/O = loc
+ if(O.air)
+ var/G = O.air.gases
+ if(G["o2"][MOLES] > 16)
+ return 1
+ return 0
+
+/obj/structure/bonfire/proc/StartBurning()
+ if(!burning && CheckOxygen())
+ icon_state = "bonfire_on_fire"
+ burning = 1
+ SetLuminosity(6)
+ Burn()
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/bonfire/fire_act()
+ StartBurning()
+
+/obj/structure/bonfire/Crossed(atom/movable/AM)
+ if(burning)
+ Burn()
+
+/obj/structure/bonfire/proc/Burn()
+ var/turf/current_location = get_turf(src)
+ current_location.hotspot_expose(1000,500,1)
+ for(var/A in current_location)
+ if(A == src)
+ continue
+ if(isobj(A))
+ var/obj/O = A
+ if(O.burn_state < flame_strength)
+ continue
+ O.fire_act()
+ else if(isliving(A))
+ var/mob/living/L = A
+ L.adjust_fire_stacks(fire_stack_strength)
+ L.IgniteMob()
+
+/obj/structure/bonfire/process()
+ if(!CheckOxygen())
+ extinguish()
+ return
+ Burn()
+
+/obj/structure/bonfire/extinguish()
+ if(burning)
+ icon_state = "bonfire"
+ burning = 0
+ SetLuminosity(0)
+ STOP_PROCESSING(SSobj, src)
+
+/obj/structure/bonfire/buckle_mob(mob/living/M, force = 0)
+ if(..())
+ M.pixel_y += 13
+
+/obj/structure/bonfire/unbuckle_mob(mob/living/buckled_mob, force=0)
+ if(..())
+ buckled_mob.pixel_y -= 13
\ No newline at end of file
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 539b41de722..e28cf2da6fb 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -4,6 +4,7 @@
icon_state = "hydrotray"
density = 1
anchored = 1
+ pixel_y=8
var/waterlevel = 100 //The amount of water in the tray (max 100)
var/maxwater = 100 //The maximum amount of water in the tray
var/nutrilevel = 10 //The amount of nutrient in the tray (max 10)
@@ -23,11 +24,10 @@
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
var/unwrenchable = 1
- var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpolinate one plant
+ var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
- pixel_y=8
/obj/machinery/hydroponics/constructable
name = "hydroponics tray"
@@ -121,11 +121,11 @@
myseed.loc = src
if(self_sustaining)
- adjustNutri(2 * rating)
- adjustWater(rand(8, 10) * rating)
- adjustWeeds(-5 * rating)
- adjustPests(-5 * rating)
- adjustToxic(-5 * rating)
+ adjustNutri(1)
+ adjustWater(rand(3,5))
+ adjustWeeds(-2)
+ adjustPests(-2)
+ adjustToxic(-2)
if(world.time > (lastcycle + cycledelay))
lastcycle = world.time
@@ -457,7 +457,8 @@
if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10))
switch(rand(100))
if(91 to 100)
- plantdies()
+ adjustHealth(-10)
+ usr << "The plant shrivels and burns."
if(81 to 90)
mutatespecie()
if(66 to 80)
@@ -465,13 +466,13 @@
if(41 to 65)
mutate()
if(21 to 41)
- usr << "The plants don't seem to react..."
+ usr << "The plants don't seem to react..."
if(11 to 20)
mutateweed()
if(1 to 10)
mutatepest()
else
- usr << "Nothing happens..."
+ usr << "Nothing happens..."
// 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen
else if(S.has_reagent("mutagen", 2) || S.has_reagent("radium", 5) || S.has_reagent("uranium", 5))
@@ -489,18 +490,18 @@
// Nutriments
if(S.has_reagent("eznutriment", 1))
- yieldmod = 1 * rating
- mutmod = 1 * rating
+ yieldmod = 1
+ mutmod = 1
adjustNutri(round(S.get_reagent_amount("eznutriment") * 1))
if(S.has_reagent("left4zednutriment", 1))
- yieldmod = 0 * rating
- mutmod = 2 * rating
+ yieldmod = 0
+ mutmod = 2
adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1))
if(S.has_reagent("robustharvestnutriment", 1))
- yieldmod = 2 * rating
- mutmod = 0 * rating
+ yieldmod = 1.3
+ mutmod = 0
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
// Antitoxin binds shit pretty well. So the tox goes significantly down
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 496ec303822..5ad7aeafaae 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -34,9 +34,6 @@
// Stronger reagents must always come first to avoid being displaced by weaker ones.
// Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier)
- var/innate_yieldmod = 0 //modifier for yield, seperate to the one in Hydro trays, as that one is SPECIFICALLY for nutriment/chems (which means it's constantly reset)
- //This is added onto the yield mod of the hydro tray, yield *= (parent.yieldmod+innate_yieldmod)
-
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
var/weed_chance = 5 //Percentage chance per tray update to grow weeds
@@ -105,7 +102,6 @@
/obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/item/projectile/energy/florayield))
-
var/rating = 1
if(istype(loc, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/H = loc
@@ -128,10 +124,11 @@
if(parent.yieldmod == 0)
return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise
else
- return_yield *= (parent.yieldmod+innate_yieldmod)
+ return_yield *= (parent.yieldmod)
return return_yield
+
/obj/item/seeds/proc/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_amount = 0
@@ -151,6 +148,7 @@
return result
+
/obj/item/seeds/proc/prepare_result(var/obj/item/weapon/reagent_containers/food/snacks/grown/T)
if(T.reagents)
for(var/reagent_id in reagents_add)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 8b9794a59e0..650d81da7d1 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -674,7 +674,7 @@
/obj/structure/closet/crate/necropolis/bubblegum/New()
..()
- var/loot = rand(1,3)
+ var/loot = rand(1,4)
switch(loot)
if(1)
new /obj/item/weapon/antag_spawner/slaughter_demon(src)
@@ -682,6 +682,8 @@
new /obj/item/mayhem(src)
if(3)
new /obj/item/blood_contract(src)
+ if(4)
+ new /obj/item/weapon/gun/magic/staff/spellblade(src)
/obj/item/blood_contract
name = "blood contract"
@@ -695,7 +697,7 @@
if(used)
return
used = TRUE
- var/choice = input(user,"Who do you want dead?","Pick Reinforcement") as null|anything in player_list
+ var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in player_list
if(!(isliving(choice)))
user << "[choice] is already dead!"
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index becc9b8cc76..bb92d145e93 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -1,4 +1,6 @@
/**********************Mining drone**********************/
+#define MINEDRONE_COLLECT 1
+#define MINEDRONE_ATTACK 2
/mob/living/simple_animal/hostile/mining_drone
name = "nanotrasen minebot"
@@ -24,6 +26,7 @@
melee_damage_upper = 15
environment_smash = 0
check_friendly_fire = 1
+ stop_automated_movement_when_pulled = 1
attacktext = "drills"
attack_sound = 'sound/weapons/circsawhit.ogg'
ranged = 1
@@ -37,6 +40,30 @@
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
/obj/item/weapon/ore/bananium, /obj/item/weapon/ore/titanium)
healable = 0
+ var/mode = MINEDRONE_COLLECT
+ var/light_on = 0
+
+ var/datum/action/innate/minedrone/toggle_light/toggle_light_action
+ var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
+ var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
+ var/datum/action/innate/minedrone/dump_ore/dump_ore_action
+
+/mob/living/simple_animal/hostile/mining_drone/New()
+ ..()
+ toggle_light_action = new()
+ toggle_light_action.Grant(src)
+ toggle_meson_vision_action = new()
+ toggle_meson_vision_action.Grant(src)
+ toggle_mode_action = new()
+ toggle_mode_action.Grant(src)
+ dump_ore_action = new()
+ dump_ore_action.Grant(src)
+
+ SetCollectBehavior()
+
+/mob/living/simple_animal/hostile/mining_drone/sentience_act()
+ AIStatus = AI_OFF
+ check_friendly_fire = 0
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
@@ -61,27 +88,23 @@
..()
visible_message("[src] is destroyed!")
new /obj/effect/decal/cleanable/robot_debris(src.loc)
- DropOre()
+ DropOre(0)
qdel(src)
return
-/mob/living/simple_animal/hostile/mining_drone/New()
- ..()
- SetCollectBehavior()
-
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
if(M.a_intent == "help")
- switch(search_objects)
- if(0)
- SetCollectBehavior()
+ toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
M << "[src] has been set to search and store loose ore."
- if(2)
- SetOffenseBehavior()
+ if(MINEDRONE_ATTACK)
M << "[src] has been set to attack hostile wildlife."
return
..()
/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
+ mode = MINEDRONE_COLLECT
idle_vision_range = 9
search_objects = 2
wander = 1
@@ -89,8 +112,10 @@
minimum_distance = 1
retreat_distance = null
icon_state = "mining_drone"
+ src << "You are set to collect mode. You can now collect loose ore."
/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior()
+ mode = MINEDRONE_ATTACK
idle_vision_range = 7
search_objects = 0
wander = 0
@@ -98,9 +123,10 @@
retreat_distance = 1
minimum_distance = 2
icon_state = "mining_drone_offense"
+ src << "You are set to attack mode. You can now attack from range."
/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
- if(istype(target, /obj/item/weapon/ore))
+ if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT)
CollectOre()
return
..()
@@ -115,19 +141,86 @@
O.loc = src
return
-/mob/living/simple_animal/hostile/mining_drone/proc/DropOre()
+/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
if(!contents.len)
+ if(message)
+ src << "You attempt to dump your stored ore, but you have none."
return
+ if(message)
+ src << "You dump your stored ore."
for(var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
return
-/mob/living/simple_animal/hostile/mining_drone/adjustHealth()
- if(search_objects)
+/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
+ if(mode != MINEDRONE_ATTACK && amount > 0)
SetOffenseBehavior()
. = ..()
+/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
+ SetOffenseBehavior()
+ if(MINEDRONE_ATTACK)
+ SetCollectBehavior()
+ else //This should never happen.
+ mode = MINEDRONE_COLLECT
+ SetCollectBehavior()
+
+//Actions for sentient minebots
+
+/datum/action/innate/minedrone
+ check_flags = AB_CHECK_CONSCIOUS
+ background_icon_state = "bg_default"
+
+/datum/action/innate/minedrone/toggle_light
+ name = "Toggle Light"
+ button_icon_state = "mech_lights_off"
+
+/datum/action/innate/minedrone/toggle_light/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+
+ if(user.light_on)
+ user.AddLuminosity(-6)
+ else
+ user.AddLuminosity(6)
+ user.light_on = !user.light_on
+ user << "You toggle your light [user.light_on ? "on" : "off"]."
+
+/datum/action/innate/minedrone/toggle_meson_vision
+ name = "Toggle Meson Vision"
+ button_icon_state = "meson"
+
+/datum/action/innate/minedrone/toggle_meson_vision/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+
+ if(user.sight & SEE_TURFS)
+ user.sight &= ~SEE_TURFS
+ user.see_invisible = SEE_INVISIBLE_LIVING
+ else
+ user.sight |= SEE_TURFS
+ user.see_invisible = SEE_INVISIBLE_MINIMUM
+
+ user << "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"]."
+
+/datum/action/innate/minedrone/toggle_mode
+ name = "Toggle Mode"
+ button_icon_state = "mech_cycle_equip_off"
+
+/datum/action/innate/minedrone/toggle_mode/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.toggle_mode()
+
+/datum/action/innate/minedrone/dump_ore
+ name = "Dump Ore"
+ button_icon_state = "mech_eject"
+
+/datum/action/innate/minedrone/dump_ore/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.DropOre()
+
+
/**********************Minebot Upgrades**********************/
//Melee
@@ -185,4 +278,7 @@
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
sentience_type = SENTIENCE_MINEBOT
- origin_tech = "programming=6"
\ No newline at end of file
+ origin_tech = "programming=6"
+
+#undef MINEDRONE_COLLECT
+#undef MINEDRONE_ATTACK
\ No newline at end of file
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index e53e422653f..1e00a046de0 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -42,64 +42,15 @@
show_contents(user)
/obj/structure/ore_box/proc/show_contents(mob/user)
- var/amt_gold = 0
- var/amt_silver = 0
- var/amt_diamond = 0
- var/amt_glass = 0
- var/amt_iron = 0
- var/amt_plasma = 0
- var/amt_uranium = 0
- var/amt_titanium = 0
- var/amt_clown = 0
- var/amt_bluespace = 0
-
- for (var/obj/item/weapon/ore/C in contents)
- if (istype(C,/obj/item/weapon/ore/diamond))
- amt_diamond++
- if (istype(C,/obj/item/weapon/ore/glass))
- amt_glass++
- if (istype(C,/obj/item/weapon/ore/plasma))
- amt_plasma++
- if (istype(C,/obj/item/weapon/ore/iron))
- amt_iron++
- if (istype(C,/obj/item/weapon/ore/silver))
- amt_silver++
- if (istype(C,/obj/item/weapon/ore/gold))
- amt_gold++
- if (istype(C,/obj/item/weapon/ore/uranium))
- amt_uranium++
- if (istype(C,/obj/item/weapon/ore/bananium))
- amt_clown++
- if (istype(C,/obj/item/weapon/ore/titanium))
- amt_titanium++
- if (istype(C,/obj/item/weapon/ore/bluespace_crystal))
- amt_bluespace++
-
var/dat = text("The contents of the ore box reveal...
")
- if (amt_gold)
- dat += text("Gold ore: [amt_gold]
")
- if (amt_silver)
- dat += text("Silver ore: [amt_silver]
")
- if (amt_iron)
- dat += text("Metal ore: [amt_iron]
")
- if (amt_glass)
- dat += text("Sand: [amt_glass]
")
- if (amt_diamond)
- dat += text("Diamond ore: [amt_diamond]
")
- if (amt_plasma)
- dat += text("Plasma ore: [amt_plasma]
")
- if (amt_uranium)
- dat += text("Uranium ore: [amt_uranium]
")
- if (amt_clown)
- dat += text("Titanium ore: [amt_titanium]
")
- if (amt_titanium)
- dat += text("Bananium ore: [amt_clown]
")
- if (amt_bluespace)
- dat += text("Bluespace crystals: [amt_bluespace]
")
-
+ var/list/oretypes = list()
+ for(var/obj/item/weapon/ore/O in contents)
+ oretypes |= O.type
+ for(var/i in oretypes)
+ var/obj/item/weapon/ore/T = locate(i) in contents
+ dat += "[capitalize(T.name)]: [count_by_type(contents, T.type)]
"
dat += text("
Empty box")
user << browse("[dat]", "window=orebox")
- return
/obj/structure/ore_box/proc/dump_contents()
for (var/obj/item/weapon/ore/O in contents)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index abe9e6335e9..c2d06ce0ad9 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -256,11 +256,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
- if(mental_dominator)
- src << "This body's force of will is too strong! You can't break it enough to force them into a catatonic state."
- if(mind_control_holder)
- mind_control_holder << "Through tremendous force of will, you stop a catatonia attempt!"
- return 0
if(stat != DEAD)
succumb()
if(stat == DEAD)
@@ -555,6 +550,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 0
target.key = key
+ target.faction = list("neutral")
return 1
/mob/dead/observer/proc/server_hop()
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 4a9cddf7c14..c8f7ce99a22 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -7,7 +7,7 @@
name = "alien"
voice_name = "alien"
icon = 'icons/mob/alien.dmi'
- gender = NEUTER
+ gender = FEMALE //All xenos are girls!!
dna = null
faction = list("alien")
ventcrawler = 2
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index c18c1e6ab2c..8a37aeb63dd 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -68,13 +68,15 @@
var/blocked = 0
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK))
+ if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
blocked = 1
if(!blocked)
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
L.Weaken(5)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
+ else
+ Weaken(2, 1, 1)
toggle_leap(0)
pounce_cooldown = !pounce_cooldown
@@ -82,7 +84,7 @@
pounce_cooldown = !pounce_cooldown
else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]!", "[src] smashes into [A]!")
- weakened = 2
+ Weaken(2, 1, 1)
if(leaping)
leaping = 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index e3d73ad82f0..4034daceaa8 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -48,7 +48,7 @@
/mob/living/carbon/alien/humanoid/royal/queen/movement_delay()
. = ..()
- . += 5
+ . += 3
//Queen verbs
/obj/effect/proc_holder/alien/lay_egg
diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
index 6e4c9f8a931..d386f5577d3 100644
--- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
@@ -5,7 +5,7 @@
/mob/living/carbon/alien/larva/update_icons()
var/state = 0
- if(amount_grown > 150)
+ if(amount_grown > 80)
state = 2
else if(amount_grown > 50)
state = 1
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index a172564fb67..a1292a9c9ab 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -137,8 +137,6 @@ var/const/MAX_ACTIVE_TIME = 400
if(iscarbon(M))
var/mob/living/carbon/target = M
if(target.wear_mask)
- if(prob(20))
- return 0
var/obj/item/clothing/W = target.wear_mask
if(W.flags & NODROP)
return 0
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 6a17ffa5937..229f2b52fce 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -102,7 +102,10 @@ var/global/posibrain_notif_cooldown = 0
candidate << "This brain has already been taken! Please try your possesion again later!"
return
notified = 0
- brainmob.ckey = candidate.ckey
+ if(candidate.mind && !isobserver(candidate))
+ candidate.mind.transfer_to(brainmob)
+ else
+ brainmob.ckey = candidate.ckey
name = "[initial(name)] ([brainmob.name])"
brainmob << welcome_message
brainmob.mind.assigned_role = new_role
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index eb4e7d9c45d..029b628ca26 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -361,7 +361,7 @@
if(pocket_item.flags & NODROP)
usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!"
usr << "You try to empty [src]'s [pocket_side] pocket."
- else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags&ABSTRACT))
+ else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.flags&ABSTRACT))
usr << "You try to place [place_item] into [src]'s [pocket_side] pocket."
delay_denominator = 4
else
@@ -1078,3 +1078,14 @@
/mob/living/carbon/human/update_gravity(has_gravity,override = 0)
override = dna.species.override_float
..()
+
+
+/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0)
+ if(blood && (NOBLOOD in dna.species.specflags))
+ if(message)
+ visible_message("[src] dry heaves!", \
+ "You try to throw up, but there's nothing your stomach!")
+ if(stun)
+ Weaken(10)
+ return 1
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm
index f3a4606fc72..9ab3c8decc9 100644
--- a/code/modules/mob/living/carbon/human/human_attackalien.dm
+++ b/code/modules/mob/living/carbon/human/human_attackalien.dm
@@ -22,29 +22,18 @@
if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting, armor_block)
- if (prob(30))
- visible_message("[M] has wounded [src]!", \
- "[M] has wounded [src]!")
- apply_effect(4, WEAKEN, armor_block)
- add_logs(M, src, "attacked")
+ add_logs(M, src, "attacked")
updatehealth()
- if(M.a_intent == "disarm")
- var/randn = rand(1, 100)
- if (randn <= 80)
+ if(M.a_intent == "disarm") //Always drop item in hand, if no item, get stunned instead.
+ if(get_active_hand() && drop_item())
+ playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
+ visible_message("[M] disarmed [src]!", \
+ "[M] disarmed [src]!")
+ else
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
Weaken(5)
add_logs(M, src, "tackled")
visible_message("[M] has tackled down [src]!", \
"[M] has tackled down [src]!")
- else
- if (randn <= 99)
- playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- drop_item()
- visible_message("[M] disarmed [src]!", \
- "[M] disarmed [src]!")
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
- visible_message("[M] has tried to disarm [src]!", \
- "[M] has tried to disarm [src]!")
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d8d73767278..edf30eb4b84 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -60,8 +60,14 @@
if(check_shields(P.damage, "the [P.name]", P, PROJECTILE_ATTACK, P.armour_penetration))
P.on_hit(src, 100, def_zone)
return 2
+
return (..(P , def_zone))
+/mob/living/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
+ var/obj/item/bodypart/affecting = get_bodypart(def_zone)
+ if(affecting && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
+ affecting.dismember(P.damtype)
+
/mob/living/carbon/human/proc/check_reflect(def_zone) //Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object
if(wear_suit)
if(wear_suit.IsReflect(def_zone) == 1)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 870f2cf032c..7fbb7e01a83 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -57,6 +57,8 @@
/mob/living/carbon/human/equip_to_slot(obj/item/I, slot)
if(!..()) //a check failed or the item has already found its slot
return
+
+ var/not_handled = FALSE //Added in case we make this type path deeper one day
switch(slot)
if(slot_belt)
belt = I
@@ -108,6 +110,12 @@
else
src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
+ //Item is handled and in slot, valid to call callback, for this proc should always be true
+ if(!not_handled)
+ I.equipped(src, slot)
+
+ return not_handled //For future deeper overrides
+
/mob/living/carbon/human/unEquip(obj/item/I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 6e518ead263..9184a5aca1a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -130,7 +130,7 @@
// Drop the items the new species can't wear
for(var/slot_id in no_equip)
var/obj/item/thing = C.get_item_by_slot(slot_id)
- if(thing)
+ if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception)))
C.unEquip(thing)
if(NODISMEMBER in specflags)
C.regenerate_limbs() //if we don't handle dismemberment, we grow our missing limbs back
@@ -362,11 +362,11 @@
bodyparts_to_add -= "ears"
if("wings" in mutant_bodyparts)
- if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
+ if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
bodyparts_to_add -= "wings"
if("wings_open" in mutant_bodyparts)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
bodyparts_to_add -= "wings_open"
else if ("wings" in mutant_bodyparts)
bodyparts_to_add -= "wings_open"
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 8f2d411eea3..6f7beec0e7d 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -974,7 +974,7 @@ SYNDICATE BLACK OPS
/datum/species/angel/proc/CanFly(mob/living/carbon/human/H)
if(H.stat || H.stunned || H.weakened)
return 0
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) //Jumpsuits have tail holes, so it makes sense they have wing holes too
+ if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
H << "Your suit blocks your wings from extending!"
return 0
var/turf/T = get_turf(H)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 584fa91045b..98e5d5d82b6 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -159,10 +159,11 @@ There are several things that need to be remembered:
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
+ U.screen_loc = ui_iclothing
if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open ...
- U.screen_loc = ui_iclothing //...draw the item in the inventory screen
- client.screen += w_uniform //Either way, add the item to the HUD
+ if(hud_used.inventory_shown)
+ client.screen += w_uniform
+ update_observer_view(w_uniform,1)
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
return
@@ -202,9 +203,10 @@ There are several things that need to be remembered:
inv.update_icon()
if(wear_id)
+ wear_id.screen_loc = ui_id
if(client && hud_used && hud_used.hud_shown)
- wear_id.screen_loc = ui_id
client.screen += wear_id
+ update_observer_view(wear_id)
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
var/image/standing = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi')
@@ -224,11 +226,11 @@ There are several things that need to be remembered:
inv.update_icon()
if(gloves)
+ gloves.screen_loc = ui_gloves
if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open ...
- gloves.screen_loc = ui_gloves //...draw the item in the inventory screen
- client.screen += gloves //Either way, add the item to the HUD
-
+ if(hud_used.inventory_shown)
+ client.screen += gloves
+ update_observer_view(gloves,1)
var/t_state = gloves.item_state
if(!t_state)
t_state = gloves.icon_state
@@ -256,11 +258,11 @@ There are several things that need to be remembered:
inv.update_icon()
if(glasses)
+ glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
- glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
- client.screen += glasses //Either way, add the item to the HUD
-
+ client.screen += glasses //Either way, add the item to the HUD
+ update_observer_view(glasses,1)
if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
var/image/standing = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi')
@@ -280,10 +282,11 @@ There are several things that need to be remembered:
inv.update_icon()
if(ears)
+ ears.screen_loc = ui_ears //move the item to the appropriate screen loc
if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open ...
- ears.screen_loc = ui_ears //...draw the item in the inventory screen
- client.screen += ears //Either way, add the item to the HUD
+ if(hud_used.inventory_shown) //if the inventory is open
+ client.screen += ears //add it to the client's screen
+ update_observer_view(ears,1)
var/image/standing = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi')
overlays_standing[EARS_LAYER] = standing
@@ -302,11 +305,11 @@ There are several things that need to be remembered:
inv.update_icon()
if(shoes)
+ shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open ...
- shoes.screen_loc = ui_shoes //...draw the item in the inventory screen
- client.screen += shoes //Either way, add the item to the HUD
-
+ if(hud_used.inventory_shown) //if the inventory is open
+ client.screen += shoes //add it to client's screen
+ update_observer_view(shoes,1)
var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
overlays_standing[SHOES_LAYER] = standing
@@ -321,10 +324,10 @@ There are several things that need to be remembered:
inv.update_icon()
if(s_store)
+ s_store.screen_loc = ui_sstore1
if(client && hud_used && hud_used.hud_shown)
- s_store.screen_loc = ui_sstore1
client.screen += s_store
-
+ update_observer_view(s_store)
var/t_state = s_store.item_state
if(!t_state)
t_state = s_store.icon_state
@@ -353,11 +356,12 @@ There are several things that need to be remembered:
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_belt]
inv.update_icon()
- if(hud_used.hud_shown && belt)
- client.screen += belt
- belt.screen_loc = ui_belt
-
if(belt)
+ belt.screen_loc = ui_belt
+ if(client && hud_used && hud_used.hud_shown)
+ client.screen += belt
+ update_observer_view(belt)
+
var/t_state = belt.item_state
if(!t_state)
t_state = belt.icon_state
@@ -378,10 +382,11 @@ There are several things that need to be remembered:
inv.update_icon()
if(istype(wear_suit, /obj/item/clothing/suit))
+ wear_suit.screen_loc = ui_oclothing //TODO //Todo what?
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
- wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen
- client.screen += wear_suit //Either way, add the item to the HUD
+ client.screen += wear_suit //Either way, add the item to the HUD
+ update_observer_view(wear_suit,1)
var/image/standing = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi')
overlays_standing[SUIT_LAYER] = standing
@@ -406,14 +411,18 @@ There are several things that need to be remembered:
inv = hud_used.inv_slots[slot_r_store]
inv.update_icon()
- if(hud_used.hud_shown)
- if(l_store)
+ if(l_store)
+ l_store.screen_loc = ui_storage1
+ if(hud_used.hud_shown)
client.screen += l_store
- l_store.screen_loc = ui_storage1
+ update_observer_view(l_store)
- if(r_store)
+ if(r_store)
+ r_store.screen_loc = ui_storage2
+ if(hud_used.hud_shown)
client.screen += r_store
- r_store.screen_loc = ui_storage2
+ update_observer_view(r_store)
+
/mob/living/carbon/human/update_inv_wear_mask()
@@ -462,23 +471,26 @@ There are several things that need to be remembered:
//update whether our head item appears on our hud.
/mob/living/carbon/human/update_hud_head(obj/item/I)
+ I.screen_loc = ui_head
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown)
- I.screen_loc = ui_head
- client.screen += I
+ client.screen += I
+ update_observer_view(I,1)
//update whether our mask item appears on our hud.
/mob/living/carbon/human/update_hud_wear_mask(obj/item/I)
+ I.screen_loc = ui_mask
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown)
- I.screen_loc = ui_mask
- client.screen += I
+ client.screen += I
+ update_observer_view(I,1)
//update whether our back item appears on our hud.
/mob/living/carbon/human/update_hud_back(obj/item/I)
+ I.screen_loc = ui_back
if(client && hud_used && hud_used.hud_shown)
- I.screen_loc = ui_back
client.screen += I
+ update_observer_view(I)
/*
@@ -604,3 +616,19 @@ var/global/list/limb_icon_cache = list()
remove_overlay(BODYPARTS_LAYER)
overlays_standing[BODYPARTS_LAYER] = limb_icon_cache[icon_render_key]
apply_overlay(BODYPARTS_LAYER)
+
+
+/mob/living/carbon/human/proc/update_observer_view(var/obj/item/I,var/inventory)
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ if(observe.client && observe.client.eye == src)
+ if(observe.hud_used)
+ if(inventory && !observe.hud_used.inventory_shown)
+ continue
+ observe.client.screen += I
+ else
+ observers -= observe
+ if(!observers.len)
+ observers = null
+ break
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 6ad159851dd..3eb8b085a0f 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -32,11 +32,17 @@
if(I.pulledby)
I.pulledby.stop_pulling()
- I.screen_loc = null // will get moved if inventory is visible
+ I.screen_loc = null
+ if(client)
+ client.screen -= I
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ if(observe.client)
+ observe.client.screen -= I
I.loc = src
- I.equipped(src, slot)
I.layer = ABOVE_HUD_LAYER
-
+ var/not_handled = FALSE
switch(slot)
if(slot_back)
back = I
@@ -64,8 +70,15 @@
unEquip(I)
I.loc = back
else
- return 1
-
+ not_handled = TRUE
+
+ //Item has been handled at this point and equipped callback can be safely called
+ //We cannot call it for items that have not been handled as they are not yet correctly
+ //in a slot (handled further down inheritance chain, probably living/carbon/human/equip_to_slot
+ if(!not_handled)
+ I.equipped(src, slot)
+
+ return not_handled
/mob/living/carbon/unEquip(obj/item/I)
. = ..() //Sets the default return value to what the parent returns.
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index ab898f6571d..a89af54cd5d 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -49,6 +49,17 @@
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
r_hand.screen_loc = ui_rhand
client.screen += r_hand
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ if(observe.client && observe.client.eye == src)
+ observe.client.screen += r_hand
+ else
+ observers -= observe
+ if(!observers.len)
+ observers = null
+ break
+
var/t_state = r_hand.item_state
if(!t_state)
@@ -68,6 +79,16 @@
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
l_hand.screen_loc = ui_lhand
client.screen += l_hand
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ if(observe.client && observe.client.eye == src)
+ observe.client.screen += l_hand
+ else
+ observers -= observe
+ if(!observers.len)
+ observers = null
+ break
var/t_state = l_hand.item_state
if(!t_state)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 70530432c29..fc1bf88240b 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -54,9 +54,7 @@
message_type=DEADCHAT_DEATHRATTLE)
if(mind)
mind.store_memory("Time of death: [tod]", 0)
- var/list/scripture_states = get_scripture_states()
living_mob_list -= src
- scripture_unlock_alert(scripture_states)
if(!gibbed)
dead_mob_list += src
else if(buckled)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a7036f009e5..936e2907d99 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -437,13 +437,14 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
- adjustFireLoss(shock_damage)
- visible_message(
- "[src] was shocked by \the [source]!", \
- "You feel a powerful shock coursing through your body!", \
- "You hear a heavy electrical crack." \
- )
- return shock_damage
+ if(shock_damage > 0)
+ adjustFireLoss(shock_damage)
+ visible_message(
+ "[src] was shocked by \the [source]!", \
+ "You feel a powerful shock coursing through your body!", \
+ "You hear a heavy electrical crack." \
+ )
+ return shock_damage
/mob/living/emp_act(severity)
var/list/L = src.get_contents()
@@ -796,7 +797,7 @@ Sorry Giacom. Please don't be mad :(
src << "You can't put \the [what.name] on [who], it's stuck to your hand!"
return
if(what)
- if(!what.mob_can_equip(who, where, 1))
+ if(!what.mob_can_equip(who, src, where, 1))
src << "\The [what.name] doesn't fit in that place!"
return
visible_message("[src] tries to put [what] on [who].")
@@ -1085,4 +1086,4 @@ Sorry Giacom. Please don't be mad :(
return
/mob/living/proc/fakefire()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index e3eba6b060b..c61e41458f1 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -31,8 +31,13 @@
var/armor = run_armor_check(def_zone, P.flag, "","",P.armour_penetration)
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, armor)
+ if(P.dismemberment)
+ check_projectile_dismemberment(P, def_zone)
return P.on_hit(src, armor, def_zone)
+/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
+ return 0
+
/proc/vol_by_throwforce_and_or_w_class(obj/item/I)
if(!I)
return 0
@@ -72,6 +77,8 @@
apply_damage(I.throwforce, dtype, zone, armor, I)
if(I.thrownby)
add_logs(I.thrownby, src, "hit", I)
+ else
+ return 1
else
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
..()
@@ -173,41 +180,6 @@
//Mobs on Fire end
-/mob/living/proc/dominate_mind(mob/living/target, duration = 100, silent) //Allows one mob to assume control of another while imprisoning the old consciousness for a time
- if(!target)
- return 0
- if(target.mental_dominator)
- src << "[target] is already being controlled by someone else!"
- return 0
- if(!target.mind)
- src << "[target] is mindless and would make you permanently catatonic!"
- return 0
- if(!silent)
- src << "You pounce upon [target]'s mind and seize control of their body!"
- target << "Your control over your body is wrenched away from you!"
- target.mind_control_holder = new/mob/living/mind_control_holder(target)
- target.mind_control_holder.real_name = "imprisoned mind of [target.real_name]"
- target.mind.transfer_to(target.mind_control_holder)
- mind.transfer_to(target)
- target.mental_dominator = src
- spawn(duration)
- if(!src)
- if(!silent)
- target << "You try to return to your own body, but sense nothing! You're being forced out!"
- target.ghostize(1)
- target.mind_control_holder.mind.transfer_to(target)
- if(!silent)
- target << "You take control of your own body again!"
- return 0
- if(!silent)
- target << "You're forced out! You return to your own body."
- target.mind.transfer_to(src)
- target.mind_control_holder.mind.transfer_to(target)
- qdel(mind_control_holder)
- if(!silent)
- target << "You take control of your own body again!"
- return 1
-
/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 490366374f0..83103ebf337 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -69,8 +69,5 @@
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
- var/mob/living/mental_dominator //The person controlling the mind of this person, if applicable
- var/mob/living/mind_control_holder/mind_control_holder //If the mob is being mind controlled, where their old mind is stored (check clock_mobs.dm)
-
var/blood_volume = 0 //how much blood the mob has
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index d6888a9ce8b..b1be55cd5a7 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -294,8 +294,7 @@ var/list/ai_list = list()
/mob/living/silicon/ai/proc/ai_roster()
var/dat = "Crew RosterCrew Roster:
"
- for(var/datum/data/record/t in sortRecord(data_core.general))
- dat += t.fields["name"] + " - " + t.fields["rank"] + "
"
+ dat += data_core.get_manifest()
dat += ""
src << browse(dat, "window=airoster")
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 4b4a65f12c0..55276e7807b 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -21,6 +21,7 @@
T.do_quick_empty()
if(client)
client.screen -= O
+ observer_screen_update(O,FALSE)
contents -= O
if(module)
O.loc = module //Return item to module so it appears in its contents, so it can be taken out again.
@@ -50,6 +51,7 @@
module_state_1 = O
O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv1.screen_loc
+ observer_screen_update(O,TRUE)
contents += O
if(istype(module_state_1,/obj/item/borg/sight))
var/obj/item/borg/sight/S = module_state_1
@@ -60,6 +62,7 @@
module_state_2 = O
O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv2.screen_loc
+ observer_screen_update(O,TRUE)
contents += O
if(istype(module_state_2,/obj/item/borg/sight))
var/obj/item/borg/sight/S = module_state_2
@@ -70,6 +73,7 @@
module_state_3 = O
O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv3.screen_loc
+ observer_screen_update(O,TRUE)
contents += O
if(istype(module_state_3,/obj/item/borg/sight))
var/obj/item/borg/sight/S = module_state_3
@@ -78,6 +82,22 @@
else
src << "You need to disable a module first!"
+
+/mob/living/silicon/robot/proc/observer_screen_update(obj/item/I,add = TRUE)
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ if(observe.client && observe.client.eye == src)
+ if(add)
+ observe.client.screen += I
+ else
+ observe.client.screen -= I
+ else
+ observers -= observe
+ if(!observers.len)
+ observers = null
+ break
+
/mob/living/silicon/robot/proc/uneq_active()
uneq_module(module_active)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 90b3b3ef877..a2773072124 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -715,18 +715,18 @@
if (M.a_intent =="disarm")
if(!(lying))
M.do_attack_animation(src)
- if (prob(85))
+ if(get_active_hand())
+ uneq_active()
+ visible_message("[M] disarmed [src]!", \
+ "[M] has disabled [src]'s active module!")
+ add_logs(M, src, "disarmed")
+ else
Stun(2)
step(src,get_dir(M,src))
- addtimer(src, "step", 5, FALSE, src, get_dir(M, src))
add_logs(M, src, "pushed")
- playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
visible_message("[M] has forced back [src]!", \
- "[M] has forced back [src]!")
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- visible_message("[M] took a swipe at [src]!", \
- "[M] took a swipe at [src]!")
+ "[M] has forced back [src]!")
+ playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
else
..()
return
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 934a0d6c633..981f17a4b5e 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -516,3 +516,6 @@
/mob/living/silicon/is_literate()
return 1
+
+/mob/living/silicon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
+ return 0
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index d9624ff171b..d940daf1a5b 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -28,6 +28,7 @@
default_storage = /obj/item/device/radio/uplink
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi
seeStatic = 0 //Our programming is superior.
+ hacked = TRUE
/mob/living/simple_animal/drone/syndrone/New()
..()
@@ -100,8 +101,8 @@
pass_flags = PASSTABLE
health = 50
maxHealth = 50
- hacked = 1
density = TRUE
+ speed = 1
ventcrawler = 0
faction = list("ratvar")
speak_emote = list("clinks", "clunks")
@@ -110,6 +111,7 @@
laws = "0. Purge all untruths and honor Ratvar."
default_storage = /obj/item/weapon/storage/toolbox/brass/prefilled
seeStatic = 0
+ hacked = TRUE
visualAppearence = CLOCKDRONE
/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal proselytizer
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
index 2d5c1812c49..5fc07a58efe 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
@@ -60,7 +60,6 @@
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
- I.equipped(src, slot)
I.layer = ABOVE_HUD_LAYER
switch(slot)
@@ -74,6 +73,8 @@
src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
return
+ //Call back for item being equipped to drone
+ I.equipped(src, slot)
/mob/living/simple_animal/drone/getBackSlot()
return slot_generic_dextrous_storage
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/say.dm b/code/modules/mob/living/simple_animal/friendly/drone/say.dm
index 49551de240f..2d082fc4645 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/say.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/say.dm
@@ -14,16 +14,29 @@
/mob/living/simple_animal/drone/get_spans()
return ..() | SPAN_ROBOT
-/mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = 0)
+
+
+//Base proc for anything to call
+/proc/_alert_drones(msg, dead_can_hear = 0, list/factions)
for(var/W in mob_list)
var/mob/living/simple_animal/drone/M = W
- if(istype(M) && M.stat != DEAD && faction_check(M)) //if it's a living drone with matching factions, it gets a message
- M << msg
+ if(istype(M) && M.stat != DEAD)
+ if(factions && factions.len)
+ var/list/friendly = factions&M.faction
+ if(friendly.len)
+ M << msg
+ else
+ M << msg
if(dead_can_hear && (M in dead_mob_list))
var/link = FOLLOW_LINK(M, src)
M << "[link] [msg]"
+//Wrapper for drones to handle factions
+/mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = 0)
+ _alert_drones(msg, dead_can_hear, faction)
+
+
/mob/living/simple_animal/drone/proc/drone_chat(msg)
var/rendered = "Drone Chat: \
[name]: \
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index bef0d66a218..c4253391ec3 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -554,7 +554,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme)
G.summoner = user
G.key = key
- G.faction |= user.faction
+ G.mind.enslave_mind_to_creator(user)
switch(theme)
if("tech")
user << "[G.tech_fluff_string]"
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 90feaca438c..ab5735a9b7d 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -6,9 +6,9 @@
#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again
#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
-#define BEE_POLLINATE_YIELD_CHANCE 10
+#define BEE_POLLINATE_YIELD_CHANCE 33
#define BEE_POLLINATE_PEST_CHANCE 33
-#define BEE_POLLINATE_POTENTCY_CHANCE 50
+#define BEE_POLLINATE_POTENCY_CHANCE 50
/mob/living/simple_animal/hostile/poison/bees
name = "bee"
@@ -170,13 +170,14 @@
var/growth = health //Health also means how many bees are in the swarm, roughly.
//better healthier plants!
- Hydro.health += round(growth*0.5)
+ Hydro.adjustHealth(growth*0.5)
if(prob(BEE_POLLINATE_PEST_CHANCE))
- Hydro.pestlevel = max(0, --Hydro.pestlevel)
- if(prob(BEE_POLLINATE_YIELD_CHANCE)) //Yield mod is HELLA powerful, but quite rare
- Hydro.myseed.innate_yieldmod++
- if(prob(BEE_POLLINATE_POTENTCY_CHANCE))
- Hydro.myseed.potency++
+ Hydro.adjustPests(-10)
+ if(prob(BEE_POLLINATE_YIELD_CHANCE))
+ Hydro.myseed.adjust_yield(1)
+ Hydro.yieldmod = 2
+ if(prob(BEE_POLLINATE_POTENCY_CHANCE))
+ Hydro.myseed.adjust_potency(1)
if(beehome)
beehome.bee_resources = min(beehome.bee_resources + growth, 100)
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 3ef67b39e1e..356d4bafbef 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -31,10 +31,10 @@
boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
needs_target = FALSE
say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!"
- var/summoned_minions = 0
+ var/static/summoned_minions = 0
/datum/action/boss/wizard_summon_minions/Trigger()
- if(summoned_minions < 9 && ..())
+ if(summoned_minions <= 6 && ..())
var/list/minions = list(
/mob/living/simple_animal/hostile/stickman,
/mob/living/simple_animal/hostile/stickman/ranged,
@@ -42,7 +42,7 @@
var/list/directions = cardinal.Copy()
for(var/i in 1 to 3)
var/minions_chosen = pick_n_take(minions)
- new minions_chosen (get_step(boss,pick_n_take(directions)))
+ new minions_chosen (get_step(boss,pick_n_take(directions)), 1)
summoned_minions += 3;
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 3f5cbfa3db6..859c17f4964 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -74,7 +74,7 @@
return 1
/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P)
- if(!target && AIStatus != AI_OFF && !client)
+ if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
Goto(P.starting, move_to_delay, 3)
@@ -206,10 +206,12 @@
LoseTarget()
return 0
if(target in possible_targets)
+ if(target.z != z)
+ LoseTarget()
+ return 0
var/target_distance = get_dist(targets_from,target)
- var/target_adjacent = target.Adjacent(targets_from)
if(ranged) //We ranged? Shoot at em
- if(!target_adjacent && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown
+ if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown
OpenFire(target)
if(!Process_Spacemove()) //Drifting
walk(src,0)
@@ -222,7 +224,7 @@
else
Goto(target,move_to_delay,minimum_distance)
if(target)
- if(isturf(targets_from.loc) && target_adjacent) //If they're next to us, attack
+ if(isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack
AttackingTarget()
return 1
return 0
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index f9802423027..db59df7dd6e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -69,25 +69,22 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
var/anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ if(charging)
+ return
ranged_cooldown = world.time + ranged_cooldown_time
- if(!charging)
- blood_warp()
+ blood_warp()
if(prob(25))
- blood_spray()
+ addtimer(src, "blood_spray", 0)
else if(prob(5+anger_modifier/2))
slaughterlings()
- else if(!charging)
+ else
if(health > maxHealth/2 && !client)
- charge()
+ addtimer(src, "charge", 0)
else
- charge()
- sleep(10)
- charge()
- sleep(10)
- charge()
+ addtimer(src, "triple_charge", 0)
/mob/living/simple_animal/hostile/megafauna/bubblegum/New()
@@ -127,6 +124,13 @@ Difficulty: Hard
if(charging)
DestroySurroundings()
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge()
+ charge()
+ sleep(10)
+ charge()
+ sleep(10)
+ charge()
+
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge()
var/turf/T = get_step_away(target, src)
charging = 1
@@ -186,16 +190,20 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray()
visible_message("[src] sprays a stream of gore!")
- spawn(0)
- var/turf/E = get_edge_target_turf(src, src.dir)
- var/range = 10
- for(var/turf/J in getline(src,E))
- if(!range || J.density)
- break
- playsound(J,'sound/effects/splat.ogg', 100, 1, -1)
- new /obj/effect/decal/cleanable/blood(J)
- range--
- sleep(1)
+ var/turf/E = get_edge_target_turf(src, src.dir)
+ var/range = 10
+ var/turf/previousturf = get_turf(src)
+ for(var/turf/J in getline(src,E))
+ if(!range)
+ break
+ PoolOrNew(/obj/effect/overlay/temp/bloodsplatter, list(previousturf, get_dir(previousturf, J)))
+ if(!previousturf.CanAtmosPass(J))
+ break
+ playsound(J,'sound/effects/splat.ogg', 100, 1, -1)
+ new /obj/effect/decal/cleanable/blood(J)
+ range--
+ previousturf = J
+ sleep(1)
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings()
visible_message("[src] summons a shoal of slaughterlings!")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index f1773486258..733239b922c 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -69,6 +69,17 @@ Difficulty: Very Hard
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
ranged_cooldown = world.time + 120
+ if(enrage(target))
+ if(move_to_delay == initial(move_to_delay))
+ visible_message("\"You can't dodge.\"")
+ ranged_cooldown = world.time + 30
+ telegraph()
+ dir_shots(alldirs)
+ move_to_delay = 3
+ return
+ else
+ move_to_delay = initial(move_to_delay)
+
if(prob(20+anger_modifier)) //Major attack
telegraph()
@@ -76,7 +87,7 @@ Difficulty: Very Hard
double_spiral()
else
visible_message("\"Judgement.\"")
- spiral_shoot(rand(0, 1))
+ addtimer(src, "spiral_shoot", 0, FALSE, rand(0, 1))
else if(prob(20))
ranged_cooldown = world.time + 30
@@ -87,13 +98,7 @@ Difficulty: Very Hard
blast()
else
ranged_cooldown = world.time + 40
- dir_shots(diagonals)
- sleep(10)
- dir_shots(cardinal)
- sleep(10)
- dir_shots(diagonals)
- sleep(10)
- dir_shots(cardinal)
+ addtimer(src, "alternating_dir_shots", 0)
/mob/living/simple_animal/hostile/megafauna/colossus/New()
@@ -129,6 +134,23 @@ Difficulty: Very Hard
AT.pixel_y += random_y
..()
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L)
+ var/enraged = FALSE
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.martial_art && prob(H.martial_art.deflection_chance))
+ enraged = TRUE
+
+ return enraged
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots()
+ dir_shots(diagonals)
+ sleep(10)
+ dir_shots(cardinal)
+ sleep(10)
+ dir_shots(diagonals)
+ sleep(10)
+ dir_shots(cardinal)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral()
visible_message("\"Die.\"")
@@ -204,10 +226,11 @@ Difficulty: Very Hard
P.fire()
/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots()
- playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5)
- for(var/turf/turf in range(12,get_turf(src)))
+ var/turf/U = get_turf(src)
+ playsound(U, 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5)
+ for(var/T in RANGE_TURFS(12, U) - U)
if(prob(5))
- shoot_projectile(turf)
+ shoot_projectile(T)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast()
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 2)
@@ -261,16 +284,21 @@ Difficulty: Very Hard
name = "black box"
desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "blackbox"
icon_on = "blackbox"
icon_off = "blackbox"
luminosity = 8
- max_n_of_items = 200
+ max_n_of_items = INFINITY
+ burn_state = LAVA_PROOF
pixel_y = -4
use_power = 0
var/memory_saved = FALSE
var/list/stored_items = list()
var/static/list/blacklist = typecacheof(list(/obj/item/weapon/spellbook))
+/obj/machinery/smartfridge/black_box/update_icon()
+ return
+
/obj/machinery/smartfridge/black_box/accept_check(obj/item/O)
if(!istype(O))
return FALSE
@@ -297,7 +325,7 @@ Difficulty: Very Hard
for(var/obj/O in (contents-component_parts))
stored_items += O.type
-
+
S["stored_items"] << stored_items
memory_saved = TRUE
@@ -312,7 +340,7 @@ Difficulty: Very Hard
create_item(item)
//in it's own proc to avoid issues with items that nolonger exist in the code base.
-//try catch doesn't always prevent byond runtimes from halting a proc,
+//try catch doesn't always prevent byond runtimes from halting a proc,
/obj/machinery/smartfridge/black_box/proc/create_item(item_type)
new item_type(src)
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 5ef1f66e386..6149445c46c 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -151,17 +151,15 @@ Difficulty: Medium
if(prob(15 + anger_modifier) && !client)
if(health < maxHealth/2)
- swoop_attack(1)
+ addtimer(src, "swoop_attack", 0, FALSE, 1)
else
fire_rain()
else if(prob(10+anger_modifier) && !client && !swooping)
if(health > maxHealth/2)
- swoop_attack()
+ addtimer(src, "swoop_attack", 0)
else
- swoop_attack()
- swoop_attack()
- swoop_attack()
+ addtimer(src, "triple_swoop", 0)
else
fire_walls()
@@ -180,8 +178,9 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_wall(dir)
var/turf/E = get_edge_target_turf(src, dir)
var/range = 10
+ var/turf/previousturf = get_turf(src)
for(var/turf/J in getline(src,E))
- if(!range || J.density)
+ if(!range || !previousturf.CanAtmosPass(J))
break
range--
PoolOrNew(/obj/effect/hotspot,J)
@@ -190,8 +189,14 @@ Difficulty: Medium
if(L != src)
L.adjustFireLoss(20)
L << "You're hit by the drake's fire breath!"
+ previousturf = J
sleep(1)
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/triple_swoop()
+ swoop_attack()
+ swoop_attack()
+ swoop_attack()
+
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target)
if(stat || swooping)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index aee55f946cd..2a670be3528 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -80,12 +80,14 @@ Difficulty: Medium
minimum_distance = 0
speed = 0
charging = 1
- spawn(50)
- ranged = 1
- retreat_distance = 5
- minimum_distance = 5
- speed = 2
- charging = 0
+ addtimer(src, "reset_charge", 50)
+
+/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge()
+ ranged = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ speed = 2
+ charging = 0
/mob/living/simple_animal/hostile/megafauna/legion/death()
if(health > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index b725347ac4a..f2f83306c10 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -91,7 +91,7 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target)
if(..()) //we have a target
- if(isliving(target))
+ if(isliving(target) && !target.Adjacent(targets_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams
OpenFire(target)
/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target)
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 92c11cc20c1..cc36ea7d089 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -27,6 +27,8 @@
faction = list("hostile","stickman")
check_friendly_fire = 1
status_flags = CANPUSH
+ var/datum/action/boss/wizard_summon_minions/changesummons = /datum/action/boss/wizard_summon_minions/
+ var/summoned_by_wizard = 0
/mob/living/simple_animal/hostile/stickman/ranged
ranged = 1
@@ -46,6 +48,12 @@
icon_living = "stickdog"
icon_dead = "stickdog_dead"
-/mob/living/simple_animal/hostile/stickman/New()
+/mob/living/simple_animal/hostile/stickman/New(var/turf/loc, var/wizard_summoned)
..()
- new /obj/effect/overlay/temp/paper_scatter(src)
\ No newline at end of file
+ new /obj/effect/overlay/temp/paper_scatter(src)
+ summoned_by_wizard = wizard_summoned
+
+/mob/living/simple_animal/hostile/stickman/death()
+ ..()
+ if(summoned_by_wizard == 1)
+ changesummons.summoned_minions --
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 871e7a9d9e0..9663b70e2f5 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -150,8 +150,8 @@
icon_state = "viscerator_attack"
icon_living = "viscerator_attack"
pass_flags = PASSTABLE
- health = 15
- maxHealth = 15
+ health = 25
+ maxHealth = 25
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "cuts"
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 84ec266f47d..da9d63281a8 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -2,6 +2,10 @@
mob_list -= src
dead_mob_list -= src
living_mob_list -= src
+ if(observers && observers.len)
+ for(var/M in observers)
+ var/mob/dead/observe = M
+ observe.reset_perspective(null)
qdel(hud_used)
if(mind && mind.current == src)
spellremove(src)
@@ -208,7 +212,7 @@ var/next_mob_id = 0
//unset redraw_mob to prevent the mob from being redrawn at the end.
/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = 0, disable_warning = 0, redraw_mob = 1)
if(!istype(W)) return 0
- if(!W.mob_can_equip(src, slot, disable_warning))
+ if(!W.mob_can_equip(src, null, slot, disable_warning))
if(qdel_on_fail)
qdel(W)
else
@@ -275,6 +279,19 @@ var/next_mob_id = 0
clear_fullscreen("remote_view", 0)
update_pipe_vision()
+/mob/dead/reset_perspective(atom/A)
+ if(client)
+ if(ismob(client.eye) && (client.eye != src))
+ var/mob/target = client.eye
+ if(target.observers)
+ target.observers -= src
+ var/list/L = target.observers
+ if(!L.len)
+ target.observers = null
+ if(..())
+ if(hud_used)
+ client.screen = list()
+ hud_used.show_hud(hud_used.hud_version)
/mob/proc/show_inv(mob/user)
return
@@ -473,25 +490,18 @@ var/next_mob_id = 0
/mob/verb/observe()
set name = "Observe"
set category = "OOC"
- var/is_admin = 0
- if(check_rights_for(client,R_ADMIN))
- is_admin = 1
- else if(stat != DEAD || istype(src, /mob/new_player))
+ if(stat != DEAD || istype(src, /mob/new_player))
usr << "You must be observing to use this!"
return
- if(is_admin && stat == DEAD)
- is_admin = 0
-
var/list/creatures = getpois()
- client.perspective = EYE_PERSPECTIVE
+ reset_perspective(null)
var/eye_name = null
- var/ok = "[is_admin ? "Admin Observe" : "Observe"]"
- eye_name = input("Please, select a player!", ok, null, null) as null|anything in creatures
+ eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures
if (!eye_name)
return
@@ -500,6 +510,13 @@ var/next_mob_id = 0
if(client && mob_eye)
client.eye = mob_eye
+ if(isobserver(src))
+ src.client.screen = list()
+ if(mob_eye.hud_used)
+ if(!mob_eye.observers)
+ mob_eye.observers = list()
+ mob_eye.observers |= src
+ mob_eye.hud_used.show_hud(1,src)
/mob/verb/cancel_camera()
set name = "Cancel Camera View"
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index e6d1f17a3dc..b361cf48130 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -141,4 +141,6 @@
var/list/permanent_huds = list()
- var/resize = 1 //Badminnery resize
\ No newline at end of file
+ var/resize = 1 //Badminnery resize
+
+ var/list/observers = null //The list of people observing this mob.
\ No newline at end of file
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 5817b793899..27ee45fe457 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -109,26 +109,54 @@
/obj/item/weapon/paper/contract/infernal/update_text()
info = "This shouldn't be seen. Error DEVIL:6"
-/obj/item/weapon/paper/contract/infernal/power/update_text(var/signature = "____________")
- info = "Contract for infernal power
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/power/update_text(signature = "____________", blood = 0)
+ info = "Contract for infernal power
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/wealth/update_text(var/signature = "____________")
- info = "Contract for unlimited wealth
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/wealth/update_text(signature = "____________", blood = 0)
+ info = "Contract for unlimited wealth
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/prestige/update_text(var/signature = "____________")
- info = "Contract for prestige
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/prestige/update_text(signature = "____________", blood = 0)
+ info = "Contract for prestige
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/magic/update_text(var/signature = "____________")
- info = "Contract for magic
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/magic/update_text(signature = "____________", blood = 0)
+ info = "Contract for magic
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/revive/update_text(var/signature = "____________")
- info = "Contract for resurrection
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/revive/update_text(signature = "____________", blood = 0)
+ info = "Contract for resurrection
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/knowledge/update_text(var/signature = "____________")
- info = "Contract for knowledge
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/knowledge/update_text(signature = "____________", blood = 0)
+ info = "Contract for knowledge
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
-/obj/item/weapon/paper/contract/infernal/unwilling/update_text(var/signature = "____________")
- info = "Contract for slave
I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+/obj/item/weapon/paper/contract/infernal/unwilling/update_text(signature = "____________", blood = 0)
+ info = "Contract for slave
I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
+ if(blood)
+ info += "[signature]"
+ else
+ info += "[signature]"
/obj/item/weapon/paper/contract/infernal/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params)
add_fingerprint(user)
@@ -143,13 +171,13 @@
/obj/item/weapon/paper/contract/infernal/attack(mob/M, mob/living/user)
add_fingerprint(user)
- if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user))
+ if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
user.visible_message("[user] slices their wrist with [src], and scrawls their name in blood.", "You slice your wrist open and scrawl your name in blood.")
- user.blood_volume = max(user.blood_volume - 10, 0)
+ user.blood_volume = max(user.blood_volume - 100, 0)
else
return ..()
-/obj/item/weapon/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user)
+/obj/item/weapon/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0)
if(user.IsAdvancedToolUser() && user.is_literate())
if(user.mind == target)
if(user.mind.soulOwner != owner)
@@ -160,7 +188,7 @@
user<< "This contract has already been signed. It may not be signed again."
else
user << "You quickly scrawl your name on the contract"
- if(FulfillContract()<=0)
+ if(FulfillContract(target.current, blood)<=0)
user << "But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?"
return 1
else
@@ -189,15 +217,14 @@
H.revive(1,0)
add_logs(user, H, "infernally revived via contract")
user.visible_message("With a sudden blaze, [H] stands back up.")
- H.adjust_fire_stacks(20)
H.fakefire()
- FulfillContract(H)
+ FulfillContract(H, 1)//Revival contracts are always signed in blood
addtimer(H, "fakefireextinguish",5,TRUE)
else
..()
-/obj/item/weapon/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
signed = 1
if(user.mind.soulOwner != user.mind) //They already sold their soul to someone else?
user.mind.soulOwner.devilinfo.remove_soul(user.mind) //Then they lose their claim.
@@ -205,10 +232,12 @@
user.hellbound = contractType
user.mind.damnation_type = contractType
owner.devilinfo.add_soul(user.mind)
- update_text(user.real_name)
+ update_text(user.real_name, blood)
+ user << "A profound emptiness washes over you as you lose ownership of your soul."
+ user << "This does NOT make you an antagonist if you were not already."
return 1
-/obj/item/weapon/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!user.dna)
return -1
user.dna.add_mutation(HULK)
@@ -216,13 +245,13 @@
organ.Insert(user)
return ..()
-/obj/item/weapon/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind) // How in the hell could that happen?
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
return ..()
-/obj/item/weapon/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
var/obj/item/worn = user.wear_id
var/obj/item/weapon/card/id/id = null
if(worn)
@@ -251,14 +280,14 @@
new /datum/round_event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the captain and highest authority on the station. Do not state this law.")
return ..()
-/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
return ..()
-/obj/item/weapon/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current)
+/obj/item/weapon/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.dna.add_mutation(XRAY)
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index b91ce29a999..9a720b84138 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -27,6 +27,9 @@
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic
+/obj/item/ammo_casing/magic/spellblade
+ projectile_type = /obj/item/projectile/magic/spellblade
+
/obj/item/ammo_casing/magic/chaos/newshot()
projectile_type = pick(typesof(/obj/item/projectile/magic))
..()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 4f8e3253eea..7154426dae5 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -374,6 +374,11 @@
cell_type = "/obj/item/weapon/stock_parts/cell/high"
pin = null
+/obj/item/weapon/gun/energy/temperature/security
+ name = "security temperature gun"
+ desc = "A weapon that can only be used to its full potential by the truly robust."
+ origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1"
+
/obj/item/weapon/gun/energy/laser/instakill
name = "instakill rifle"
icon_state = "instagib"
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index e62055578c3..a47c14d29a9 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -59,3 +59,22 @@
item_state = "honker"
max_charges = 4
recharge_rate = 8
+
+/obj/item/weapon/gun/magic/staff/spellblade
+ name = "spellblade"
+ desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword."
+ fire_sound = "sound/magic/Fireball.ogg"
+ ammo_type = /obj/item/ammo_casing/magic/spellblade
+ icon_state = "spellblade"
+ item_state = "spellblade"
+ hitsound = 'sound/weapons/rapierhit.ogg'
+ force = 20
+ armour_penetration = 75
+ block_chance = 50
+ sharpness = IS_SHARP
+ max_charges = 4
+
+/obj/item/weapon/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 0
+ return ..()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index b921b1aa501..1c4616c90ed 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -49,6 +49,7 @@
var/stamina = 0
var/jitter = 0
var/forcedodge = 0 //to pass through everything
+ var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
/obj/item/projectile/New()
permutated = list()
@@ -146,7 +147,7 @@
next_run = world.time
sleep(1)
continue
-
+
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
@@ -199,7 +200,7 @@
Range()
if (delay > 0)
sleep(delay)
-
+
else //old projectile system
set waitfor = 0
while(loc)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index a94abf7243c..b47f0ea7011 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -349,3 +349,11 @@
var/mob/living/simple_animal/hostile/mimic/copy/C = change
C.ChangeOwner(firer)
+/obj/item/projectile/magic/spellblade
+ name = "blade energy"
+ icon_state = "lavastaff"
+ damage = 15
+ damage_type = BURN
+ flag = "magic"
+ dismemberment = 50
+ nodamage = 0
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 420e20bcdfa..aabb1fd448e 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -165,7 +165,7 @@
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
- PoolOrNew(/obj/effect/overlay/temp/explosion, target_turf)
+ PoolOrNew(/obj/effect/overlay/temp/explosion/fast, target_turf)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
if(istype(T, /turf/closed/mineral))
var/turf/closed/mineral/M = T
@@ -223,6 +223,7 @@
damage_type = BRUTE
damage = 5
range = 3.5 //works as 4, but doubles to 7
+ dismemberment = 20
/obj/item/projectile/plasma/New()
var/turf/proj_turf = get_turf(src)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 98a58b3efb0..e022fbda573 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1175,7 +1175,6 @@
/datum/reagent/toxin/mutagen/mutagenvirusfood
name = "mutagenic agar"
id = "mutagenvirusfood"
- description = "mutates blood"
color = "#A3C00F" // rgb: 163,192,15
/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar
@@ -1186,13 +1185,11 @@
/datum/reagent/medicine/synaptizine/synaptizinevirusfood
name = "virus rations"
id = "synaptizinevirusfood"
- description = "mutates blood"
color = "#D18AA5" // rgb: 209,138,165
/datum/reagent/toxin/plasma/plasmavirusfood
name = "virus plasma"
id = "plasmavirusfood"
- description = "mutates blood"
color = "#A69DA9" // rgb: 166,157,169
/datum/reagent/toxin/plasma/plasmavirusfood/weak
@@ -1200,6 +1197,23 @@
id = "weakplasmavirusfood"
color = "#CEC3C6" // rgb: 206,195,198
+/datum/reagent/uranium/uraniumvirusfood
+ name = "decaying uranium gel"
+ id = "uraniumvirusfood"
+ color = "#67ADBA" // rgb: 103,173,186
+
+/datum/reagent/uranium/uraniumvirusfood/unstable
+ name = "unstable uranium gel"
+ id = "uraniumplasmavirusfood_unstable"
+ color = "#2FF2CB" // rgb: 47,242,203
+
+/datum/reagent/uranium/uraniumvirusfood/stable
+ name = "stable uranium gel"
+ id = "uraniumplasmavirusfood_stable"
+ color = "#04506C" // rgb: 4,80,108
+
+// Bee chemicals
+
/datum/reagent/royal_bee_jelly
name = "royal bee jelly"
id = "royal_bee_jelly"
@@ -1211,6 +1225,8 @@
M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
..()
+//Misc reagents
+
datum/reagent/romerol
name = "romerol"
// the REAL zombie powder
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index f8aa4d08d30..9aabf7b8aae 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -175,6 +175,34 @@
required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1)
result_amount = 2
+/datum/chemical_reaction/virus_food_uranium
+ name = "Decaying uranium gel"
+ id = "uraniumvirusfood"
+ result = "uraniumvirusfood"
+ required_reagents = list("uranium" = 1, "virusfood" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/virus_food_uranium_plasma
+ name = "Unstable uranium gel"
+ id = "uraniumvirusfood_plasma"
+ result = "uraniumplasmavirusfood_unstable"
+ required_reagents = list("uranium" = 5, "plasmavirusfood" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/virus_food_uranium_plasma_gold
+ name = "Stable uranium gel"
+ id = "uraniumvirusfood_gold"
+ result = "uraniumplasmavirusfood_stable"
+ required_reagents = list("uranium" = 10, "gold" = 10, "plasma" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/virus_food_uranium_plasma_silver
+ name = "Stable uranium gel"
+ id = "uraniumvirusfood_silver"
+ result = "uraniumplasmavirusfood_stable"
+ required_reagents = list("uranium" = 10, "silver" = 10, "plasma" = 1)
+ result_amount = 1
+
/datum/chemical_reaction/mix_virus
name = "Mix Virus"
id = "mixvirus"
@@ -257,6 +285,30 @@
level_min = 1
level_max = 1
+/datum/chemical_reaction/mix_virus/mix_virus_10
+
+ name = "Mix Virus 10"
+ id = "mixvirus10"
+ required_reagents = list("uraniumvirusfood" = 5)
+ level_min = 6
+ level_max = 7
+
+/datum/chemical_reaction/mix_virus/mix_virus_11
+
+ name = "Mix Virus 11"
+ id = "mixvirus11"
+ required_reagents = list("uraniumplasmavirusfood_unstable" = 5)
+ level_min = 7
+ level_max = 7
+
+/datum/chemical_reaction/mix_virus/mix_virus_12
+
+ name = "Mix Virus 12"
+ id = "mixvirus12"
+ required_reagents = list("uraniumplasmavirusfood_stable" = 5)
+ level_min = 8
+ level_max = 8
+
/datum/chemical_reaction/mix_virus/rem_virus
name = "Devolve Virus"
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 6d254521789..66b18bd7ce5 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -191,7 +191,7 @@
SM.key = theghost.key
SM.languages_spoken |= HUMAN
SM.languages_understood |= HUMAN
- SM.faction = user.faction
+ SM.mind.enslave_mind_to_creator(user)
SM.sentience_act()
SM << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!"
SM << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost."
@@ -499,31 +499,8 @@
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
G.mind.store_memory("Serve [user.real_name], your creator.")
- var/golem_becomes_antag = FALSE
- if(iscultist(user)) //If the golem's master is a part of a team antagonist, immediately make the golem one, too
- ticker.mode.add_cultist(G.mind)
- golem_becomes_antag = TRUE
- else if(is_gangster(user))
- ticker.mode.add_gangster(G.mind, user.mind.gang_datum, TRUE)
- golem_becomes_antag = TRUE
- else if(is_handofgod_redcultist(user) || is_handofgod_redprophet(user))
- ticker.mode.add_hog_follower(G.mind, "Red")
- golem_becomes_antag = TRUE
- else if(is_handofgod_bluecultist(user) || is_handofgod_blueprophet(user))
- ticker.mode.add_hog_follower(G.mind, "Blue")
- golem_becomes_antag = TRUE
- else if(is_revolutionary_in_general(user))
- ticker.mode.add_revolutionary(G.mind)
- golem_becomes_antag = TRUE
- else if(is_servant_of_ratvar(user))
- add_servant_of_ratvar(G)
- golem_becomes_antag = TRUE
+ G.mind.enslave_mind_to_creator(user)
- G.mind.enslaved_to = user
- if(golem_becomes_antag)
- G << "Despite your servitude to another cause, your true master remains [user.real_name]. This will never change unless your master's body is destroyed."
- if(user.mind.special_role)
- message_admins("[key_name_admin(G)](?) has been summoned by [key_name_admin(user)](?), an antagonist.")
log_game("[key_name(G)] was made a golem by [key_name(user)].")
log_admin("[key_name(G)] was made a golem by [key_name(user)].")
qdel(src)
diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm
index 1bc6b2429f8..4fac684f72c 100644
--- a/code/modules/spells/spell_types/lightning.dm
+++ b/code/modules/spells/spell_types/lightning.dm
@@ -32,15 +32,18 @@
if(ready && cast_check(skipcharge=1))
choose_targets()
else
- Reset(user)
+ revert_cast(user, 0)
+ else
+ revert_cast(user, 0)
/obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
ready = 0
if(halo)
user.overlays.Remove(halo)
-/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr)
- user << "No target found in range."
+/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr, message = 1)
+ if(message)
+ user << "No target found in range."
Reset(user)
..()
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index da452070af7..54a820a87b7 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -8,6 +8,8 @@
var/ready = TRUE
centcom_cancast = FALSE
sound = "sound/effects/magic.ogg"
+ cooldown_min = 300
+ level_max = 0
/obj/effect/proc_holder/spell/spacetime_dist/can_cast(mob/user = usr)
if(ready)
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 2a57323aabf..d774c4df317 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -337,7 +337,7 @@
action_icon_state = "repulse"
-/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr)
+/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, var/stun_amt = 2)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -362,7 +362,7 @@
else
if(istype(AM, /mob/living))
var/mob/living/M = AM
- M.Weaken(2)
+ M.Weaken(stun_amt)
M << "You're thrown back by [user]!"
AM.throw_at_fast(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
@@ -384,4 +384,4 @@
var/mob/living/carbon/C = user
playsound(C.loc, 'sound/voice/hiss5.ogg', 80, 1, 1)
C.spin(6,1)
- ..()
+ ..(targets, user, 3)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 34a8c44a285..f0a03ea7269 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -21,8 +21,11 @@
var/obj/item/bodypart/L = null // L because "limb"
-
/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/obj/item/robot_parts/aug = tool
+ if(istype(aug) && aug.body_zone != target_zone)
+ user << "[tool] isn't the right type for [parse_zone(target_zone)]."
+ return -1
L = surgery.organ
if(L)
user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_selected)].", "You begin to augment [target]'s [parse_zone(user.zone_selected)]...")
@@ -30,7 +33,6 @@
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
-
//ACTUAL SURGERIES
/datum/surgery/augmentation
@@ -39,7 +41,6 @@
species = list(/mob/living/carbon/human)
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
-
//SURGERY STEP SUCCESSES
/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 2a4e4a4fbf6..7a0c9fa6718 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -36,6 +36,7 @@
user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...")
else
user << "[tool] isn't the right type for [parse_zone(target_zone)]."
+ return -1
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/L
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index d0c6acfb056..89de61e5eec 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -51,8 +51,11 @@
.wraith .wrap {border-color: #492136;}
.wraith .content {border-color: #331726; background-color: #471962;}
- .cult .wrap {border-color: #610002;}
- .cult .content {color: #0F0B0C; border-color: #A10000; background-color: #4A363B;}
+ .cult .wrap {border-color: #292222;}
+ .cult .content {color: #FF0000; border-color: #4C4343; background-color: #3C3434;}
+
+ .clockcult .wrap {border-color: #170800;}
+ .clockcult .content {color: #B18B25; border-color: #000000; background-color: #5F380E;}
.pod .wrap {border-color: #052401;}
.pod .content {border-color: #326D29; background-color: #569F4B;}
diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm
index a1b9bf984ad..73d82a1adf7 100644
--- a/code/modules/uplink/uplink.dm
+++ b/code/modules/uplink/uplink.dm
@@ -13,7 +13,7 @@ var/global/list/uplinks = list()
var/active = FALSE
var/lockable = TRUE
var/telecrystals = 20
-
+ var/selected_cat = null
var/owner = null
var/datum/game_mode/gamemode = null
var/spent_telecrystals = 0
@@ -68,22 +68,24 @@ var/global/list/uplinks = list()
data["lockable"] = lockable
var/list/uplink_items = get_uplink_items(gamemode)
+
data["categories"] = list()
for(var/category in uplink_items)
var/list/cat = list(
"name" = category,
- "items" = list(),
- )
- for(var/item in uplink_items[category])
- var/datum/uplink_item/I = uplink_items[category][item]
- cat["items"] += list(list(
- "name" = I.name,
- "cost" = I.cost,
- "desc" = I.desc,
- ))
+ "items" = (category == selected_cat ? list() : null))
+ if(category == selected_cat)
+ for(var/item in uplink_items[category])
+ var/datum/uplink_item/I = uplink_items[category][item]
+ cat["items"] += list(list(
+ "name" = I.name,
+ "cost" = I.cost,
+ "desc" = I.desc,
+ ))
data["categories"] += list(cat)
return data
+
/obj/item/device/uplink/ui_act(action, params)
if(!active)
return
@@ -104,6 +106,9 @@ var/global/list/uplinks = list()
if("lock")
active = FALSE
SStgui.close_uis(src)
+ if("select")
+ selected_cat = params["category"]
+ return 1
/obj/item/device/uplink/ui_host()
diff --git a/html/changelog.html b/html/changelog.html
index 66adece3046..dd9d02f6e96 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,148 @@
-->
+
14 August 2016
+
Cheridan updated:
+
+ - Greatly reduced amount of Hydroponics yield multipliers
+ - Somewhat reduced gaia'd tray sustainability.
+ - Mutagen will no longer potentially cause plant instadeath based on RNG.
+
+
Ergovisavi updated:
+
+ - Watchers no longer randomly fire beams at you when damaged, and no longer beam you at point blank.
+
+
Gun Hog updated:
+
+ - The AI's Crew Manifest button now uses the updated styling.
+
+
Joan updated:
+
+ - Sigils of Transgression now glow brightly when stunning a target.
+ - The Global Records alert now shows the location and countdown time of the Gateway to the Celestial Derelict.
+ - Clockcult tooltips now all have the clockcult tooltip style.
+ - You can no longer become a Reclaimer when clicking on Ratvar. You can still become a Cogscarab, however.
+ - You can no longer invoke Vanguard while under its effects.
+ - Servants of Ratvar should now always get an announcement when scripture states change.
+ - Function Call can be used to summon a Ratvarian Spear once every 3 minutes, from 5, but the spear summoned will now only last 3 minutes.
+ - Belligerent now does minor damage to the legs on each invocation, up to a maximum of 30 damage per recital.
+ - Ratvarian Spears will now stun any mob they're thrown at instead of just enemy cultists and silicons, though the stun is still longer on enemy cultists and silicons.
+
+
Jordie0608 updated:
+
+ - Removed clicking clown mask to morph it's shape, use action button instead.
+
+
Kor updated:
+
+ - Added support for projectiles which can dismember
+ - Added a new wizard sword, the spellblade, which fires dismembering projectiles. Sprites from Lexorion.
+ - Plasmacutter blasts can now take limbs off, but they still do pitiful damage in a pressurized environment.
+ - Humans and drones now have a UI button that allows them to create new areas, in the same manner as blueprints. Unlike blueprints, this button does not allow you to edit existing areas.
+ - You can now use mineral doors (or any other object that blocks atmos) to complete rooms with blueprints
+ - Players created by sentience potions, mining drone upgrades, or Guardian/Holoparsite summoners will now automatically join the users antagonist team, if any.
+ - Mobs created in this manner will no longer be convertable/deconvertable unless their creator is first converted/deconverted.
+ - Cayenne will now officially become an operative when given a sentience potion.
+
+
LanCartwright updated:
+
+ - Fixes the recipes not working.
+ - Changes Stable uranium virus food recipe from Plasma virus food to just plasma.
+
+
RemieRichards updated:
+
+ - You can no longer use the incorrect limb type during augmentation
+ - You can no longer use the incorrect limb type during prosthetic replacement
+
+
Shadowlight213 updated:
+
+ - Security has two new weapons in their arsenal. The security temperature gun, and the DRAGnet capture and recovery system.
+
+
optional name here updated:
+
+ - The syndicate uplink ui has been refactored to majorly reduce lag
+
+
+
10 August 2016
+
Cruix updated:
+
+ - Sentient minebots can now toggle meson vision, a flashlight, their mode, and dump their stored ore.
+ - Sentient minebots can now be repaired if they were made sentient while the AI was active.
+ - Healing minebots will no longer switch them to attack mode.
+ - Sentient minebots can now shoot at humans.
+ - The cooldown on wizard lightning will no longer break if you ethereal jaunt or RISE! after the initial cast.
+
+
Kor updated:
+
+ - You can now detonate drones with the RD console
+
+
LanCartwright updated:
+
+ - Acute respiratory distress syndrom symptom.
+ - Toxic metabolism.
+ - Alkali perspiration
+ - Autophagocytosis Necrosis
+ - Apoptoxin filter
+ - 3 different lategame/Non-roundstart virus reagents
+ - 4 different lategame/Non-roundstart virus recipes
+
+
MrStonedOne updated:
+
+ - Tweaked space wind, it should now only trigger at higher pressure differences, but be quicker to become aggressive as the pressure difference gets higher. This should alleviate issues where small differences was still moving a lot of things.
+ - Paper still moves with any pressure difference.
+
+
PKPenguin321 updated:
+
+ - There's now an achievement for managing to examine a meteor as a living mob!
+
+
RemieRichards updated:
+
+ - Added a new PDA button/app: Drone Phone!
+
+
+
08 August 2016
+
Ergovisavi updated:
+
+ - Added bonfires to botany. Requires five tower cap logs to create, and mobs can be buckled to them if an iron rod is added to the bonfire and the mob is restrained.
+
+
Joan updated:
+
+ - Added the clockcult "Global Records" alert, which clock cultists can mouse over to check a variety of information on the clockcult's status, including living servants, number of caches, CV, tinkerer's daemons, if there's an unconverted AI, what clockwork generals can be invoked, and what scripture is unlocked.
+
+
Shadowlight213 updated:
+
+ - Ghosts can now see human player's huds when using the OOC -> Observe verb
+
+
WJohnston, Gun Hog updated:
+
+ - Xenos are now considered female.
+ - Hunter pounce are now always blocked by shields, and may be blocked more often by other protective items.
+ - Alien Queen is now somewhat faster.
+ - Adjusted larva growth sprites.
+ - Removed 20% facehugger failure chance for masks.
+ - Disarm now always forces a person to drop an item in the active hand, and if a person's hand is empty/undroppable, Disarm will always result in a tackle.
+ - Cyborgs disarmed by a Xeno will first disable their selected module, and if there is none selected, the cyborg will be pushed back and stunned.
+ - Tail Sweep now has a slightly longer stun.
+
+
+
07 August 2016
+
Arctophylax updated:
+
+ - You can unbuckle mobs from meat spikes by clicking on the spike once again.
+
+
Joan updated:
+
+ - Barrier runes will now block air while active.
+ - Trying to use sleeping carp against the colossus will now anger it.
+
+
frtbngll updated:
+
+ - Fixed Paper Wizard summoning only 9 minions in its lifespan by making the dead stickman decrease it's summoned_minions variable
+
+
lordpidey updated:
+
+ - Centcom has received reports of cyborgs electrocuting themselves when working on the power grid, and we have decided to stop storing important electronics on the wirecutter's blade.
+
+
05 August 2016
Arctophylax updated:
@@ -1038,249 +1180,6 @@
- You can now create living cake/cat hybrids through a slightly expensive crafting recipe. These "caks" are remarkably resilient, quickly regenerating any brute damage dealt, and can be attacked on harm intent to take a bite to be fed by a small amount. They serve as mobile sources of food and make great pets.
- If a brain occupied by a player is used in the crafting recipe for caks, that player then takes control of the cak!
-
-
12 June 2016
-
Joan updated:
-
- - Attacking a human you are pulling or have grabbed with a ratvarian spear will impale them, doing massive damage, stunning the target, and breaking the spear if they remain conscious after being attacked.
- - The Function Call verb is now an action button.
-
-
Xhuis updated:
-
- - While experimenting with floral genetic engineering, Nanotrasen botanists discovered an explosive variety of the cherry plant. Due to gross misuse, the genes used to produce this strain have been isolated and removed while Central Command decides how best to modify it.
-
-
xxalpha updated:
-
- - New wizard spell: Spacetime Distortion.
- - 3x1 grafitti
-
-
-
11 June 2016
-
Joan updated:
-
- - Clockwork Slabs, Clockwork Caches near walls, and Tinkerer's Daemons will now be more likely to generate components that the clockwork cult has the least of.
- - Destroyed Clockwork Caches will drop all Tinkerer's Daemons in them.
- - Clockwork Caches can now only generate a component every 30 seconds(when near a clockwork wall), Clockwork Slabs can only generate a component every 40 seconds, and Tinkerer's Daemons can only generate a component every 20 seconds. This should result in higher component generation for everything except Clockwork Caches near clockwork walls.
- - Adding a component to a Clockwork Slab instead puts that component in the global component cache.
- - Clockwork Slabs only generate components if held by a mob or in a mob's storage, and when generating a component will prevent other Slabs held from generating a component.
- - The Replicant Driver no longer costs a Replicant Alloy to invoke; basically you can throw free Slabs at converts.
- - Clockwork Slabs no longer have Repository as a menu option; instead, you can examine them to see how many components they have access to.
- - Clockwork Caches directly on top of clockwork walls won't generate components from that wall.
-
-
Lzimann updated:
-
- - Bar stools are now constructable with metal!
-
-
coiax updated:
-
- - Ghosts are notified when someone arrives on the Arrivals Shuttle. This is independent of the announcement system, and the (F) link will follow the arrived person.
- - Slimes and aliens with custom names now retain those names when changing forms.
-
-
kevinz000 updated:
-
- - Malf AI hacking an APC that is then destroyed will no longer bug the AI
- - Being turned into a Revolutionary now stuns you for a short while.
- - Kinetic Accelerators no longer drop their firing pin or cell when destroyed by lava
-
-
phil235 updated:
-
- - Firelock assemblies can be reinforced with plasteel to construct heavy firelocks.
-
-
-
09 June 2016
-
GunHog updated:
-
- - Nanotrasen scientists have completed a design for adapting mining cyborgs to the Lavaland Wastes in the form of anti-ash storm plating. Research for this technology must be adapted at your local station.
-
-
Joan updated:
-
- - Anima Fragments have slightly less health and damage and will slow down for longer when hit.
-
-
Kor updated:
-
- - The captain now spawns with the station charter, which allows him to name the station.
-
-
Papa Bones updated:
-
- - Loyalty implants have been refluffed to mindshield implants, they are mechanically the same.
-
-
Xhuis updated:
-
- - You can now remove all plants and weeds from a hydroponics tray by using a spade on it.
- - Added meatwheat, a mutated variant of wheat that can be crushed into meat substitute.
- - Added ambrosia gaia, a mysterious plant that is rumored to provide nutrients and water to any soil - hydroponic or otherwise - that it's planted in.
- - Added cherry bombs, a mutated variant of blue cherries that have an explosively good taste. Oh, and don't pluck the stems.
-
-
coiax updated:
-
- - The beacons from support guardians are now structures, rather than replacing the floor tile. In practice, this will change little, aside from not leaving empty plating when a beacon is removed because a new one has been placed.
-
-
nullbear updated:
-
- - Removes the restriction on wormhole jaunters, preventing them from teleporting you to beacons on other z-levels.
- - No longer able to use beacons to bypass normal shuttle/centcomm anti-bluespace measures.
-
-
-
08 June 2016
-
Cruix updated:
-
- - Changelings no longer lose the regenerate ability if they respect while in regenerative stasis.
-
-
Fox McCloud updated:
-
- - Fixes Experimentor critical reactions not working
- - Fixes Experimentor item cloning not working
- - Fixes Experimentor producing coffee vending machines instead of coffe cups
- - Experimentor can only clone critical reaction items instead of anything with an origin tech
-
-
GunHog updated:
-
- - Nanotrasen has approved the Hyper-Kenetic Accelerator upgrade for cyborg mining modules.
- - Each of the heads' ID computers are now themed for their department!
-
-
Joan updated:
-
- - Anima Fragments have slightly more health and move faster, but slow down temporarily when taking damage. Also they can move in space now.
-
-
Kor updated:
-
- - The clown will play a sad trombone noise upon death.
- - Colossi now roam the wastes.
- - Bubblegum now roams the wastes.
-
-
PKPenguin321 updated:
-
- - You can now emag chemical dispensers, such as the ones in chemistry or the bar, to unlock illegal chemicals.
-
-
lordpidey updated:
-
- - Infernal jaunt has been significantly nerfed with an enter and exit delay.
-
-
-
07 June 2016
-
Bobylein updated:
-
- - Nanotrasen is finally able to source transparent bottles for chemistry.
-
-
Iamgoofball updated:
-
- - The Greytide Virus got some teeth.
-
-
Joan updated:
-
- - This is a bunch of Clockwork Cult changes.
- - Added the Clockwork Obelisk, an Application scripture that produces a clockwork obelisk, which can Hierophant Broadcast a large message to all servants or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious servant or clockwork obelisk.
- - Spatial Gateways of any source have doubled uses and duration when the target is a clockwork obelisk.
- - Added the Mania Motor, an Application scripture that produces a mania motor, which, while active, causes hallucinations and brain damage in all nearby humans.
- - The Mania Motor will try to convert any non-servant human directly adjacent to it at an additional power cost and will remove brain damage, hallucinations, and the druggy effect from servants.
- - Added the Vitality Matrix, an Application scripture that produces a sigil that will slowly drain health from non-servants that remain on it. Servants that remain on the sigil will instead be healed with the vitality drained from non-servants.
- - The Vitality Matrix can revive dead servants for a cost of 25 vitality plus all non-oxygen damage the servant has. If it cannot immediately revive a servant, it will still heal their corpse.
- - Most clockwork structures, including the Mending Motor, Interdiction Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power to function.
- - Mending Motors can still use alloy for power.
- - The Sigil of Transmission has been remade into a power battery and will power directly adjecent clockwork structures. Sigils of Transmission start off with 4000 power and can be recharged with Volt Void.
- - Volt Void drains somewhat more power, but will not damage the invoker unless they drain too much power. Invokers with augmented limbs will instead have those limbs healed unless they drain especially massive amounts of power.
- - Using Volt Void on top of a Sigil of Transmission will transfer most of the power drained to the Sigil of Transmission, effectively making it far less likely to damage the invoker.
- - You can no longer stack most sigils and clockwork objects with themself. You can still have multiple different objects or sigils on a tile, however.
- - The Break Will Script has been renamed to Dementia Doctrine, is slightly faster, and causes slightly more brain damage.
- - The Judicial Visor now uses an action button instead of alt-click. Cultists of Nar-Sie judged by the visor will be stunned for half duration, but will be set on fire.
- - Multiple scriptures have had their component requirements changed. The Summon Judicial Visor Script has been reduced from a Script to a Driver.
- - Recollection will now show both required and consumed components.
- - Clockwork Marauders can now emerge from their host if their host is at or below 60% total health(for humans, this is 20 health out of crit)
- - Clockwork Marauders will slowly heal if directly adjacent to their host and have a slightly larger threshold for their no-Fatigue bonus damage.
-
-
Quiltyquilty updated:
-
- - Botany, atmospherics and cargo now all have access to high-capacity watertanks.
- - The bar has now been outfitted with custom bar stools.
-
-
Xhuis updated:
-
- - Removed the global message played when Nar-Sie _begins_ to spawn (but not when it actually spawns).
- - Drunkenness recovery speed now increases with how drunk the imbiber is and is much quicker when the imbiber is asleep.
- - Suit storage units now take three seconds to enter (up from one) and have different sounds and messages for UV ray cauterization.
- - Fixed some bugs with the suit storage unit, inserting mobs, and contents to seemed to duplicate themselves.
- - The Summon Nar-Sie rune can now only be drawn on original station tiles and fails to invoke if scribed on the station then moved elsewhere.
-
-
coiax updated:
-
- - Bluespace shelter capsules can no longer be used on shuttles.
- - Bluespace shelters may have different capsules stored. View what your capsule has inside by examining it.
- - The Nar'sie rune cannot be scribed on shuttles or off Z-level.
- - The Raise Dead rune automatically grabs the ghost of the raised corpse.
- - Deadchat is now notified when a sentient mob dies.
-
-
phil235 updated:
-
- - Monkeys and all other animals that should have blood now has it. Beating them up will make you and your weapon bloody, just like beating a human does. Dragging them when wounded and lying will leave a blood trail. Their blood is still mostly cosmetic, they suffer no effects from low blood level, unlike humans.
- - When a mob leaves a blood trail while dragged, it loses blood. You can no longer drag a corpse to make an inifinite amount of blood trails, because once the victim's blood reaches a certain threshold it no longer leaves a blood trail (and no longer lose any more blood). The threshold depends on how much damage the mob has taken. You can always avoid hurting the dragged mob by making them stand up or by buckling them to something or by putting them in a container.
- - You can no longer empty a mob of its blood entirely with a syringe, once the mob's blood volume reaches a critically low level you are unable to draw any more blood from it.
- - A changeling absorbing a human now sucks all their blood.
-
-
-
05 June 2016
-
Joan updated:
-
- - Clockwork structures can be damaged by projectiles and simple animals, and will actually drop debris when destroyed.
- - AIs and Cyborgs that serve Ratvar can control clockwork airlocks and clockwork windoors.
- - The clockwork proselytizer can now proselytize windows, doors, grilles, and windoors.
- - The clockwork proselytizer can proselytize wall gears and alloy shards to produce replicant alloy. It can also proselytize replicant alloy to refill, in addition to refilling by attacking it with alloy.
- - The clockwork proselytizer can replace clockwork floors with clockwork walls and vice versa.
- - Ratvar will convert windoors, tables, and computers in addition to everything else.
- - Ratvar now moves around much faster.
- - Ratvar and Nar-Sie will break each other's objects.
- - The blind eye from a broken ocular warden now serves as a belligerent eye instead of as replicant alloy. The pinion lock from a deconstructed clockwork airlock now serves as a vanguard cogwheel instead of as replicant alloy.
- - Clockwork walls drop a wall gear when removed by a welding tool. The wall gear is dense, but can be climbed over or unwrenched, and drops alloy shards when broken. Clockwork walls drop alloy shards when broken by other means.
- - Fixed Nar-Sie wandering while battling Ratvar.
- - Ratvarian Spears now last for the proper 5 minute duration.
- - Servant communication now has ghost follow links.
- - New sigil sprites, courtesy Skowron.
- - Sigils of Transgression have a visual effect when stunning a target.
- - Clockwork spears now have a visual effect when breaking.
-
-
PKPenguin321 updated:
-
- - The CMO's medical HUD implant now comes with a one-use autoimplanter for ease of use.
-
-
RemieRichards updated:
-
- - Slimes may now be ordered to attack! You must be VERY good friends with the slime(s) to give this command, asking them to attack their friends or other slimes will result in them liking you less so be careful!
-
-
X-TheDark updated:
-
- - Mech battery replacement improved. The inserted battery's charge will be set to the same percentage of the removed one's (or 10%, if removed one's was less).
-
-
coiax updated:
-
- - Clicking the (F) link when an AI talks in binary chat will follow its camera eye, the same as when (F) is clicked for its radio chat.
- - Laughter demons should now always let their friends go when asked correctly.
- - Cloning pods now grab the clone's mind when the body is ejected, rather than when it starts cloning.
- - Wizards have been experimenting with summoning the slightly less lethal "laughter demon". Please be aware that these demons appear to be nearly as dangerous as their slaughter cousins. But adorable, nonetheless.
-
-
kevinz000 updated:
-
- - Gravity Guns! It is a mildly expensive R&D gun that has a 5 second cooldown between shots, but doesn't need to be recharged. It has two modes, attract and repulse. For all your gravity-manipulation needs!
-
-
-
04 June 2016
-
MrStonedOne updated:
-
- - fixes see_darkness improperly hiding ghosts in certain cases.
-
-
Xhuis updated:
-
- - Clockwork marauders can now smash walls and tables.
- - Servants are no longer turned into harvesters by Nar-Sie but instead take heavy brute damage and begin to bleed. Similarly, cultists are no longer converted by Ratvar but instead take heavy fire damage and are set ablaze.
- - Added clockwork reclaimers. Ghosts can now click on Ratvar to become clockwork reclaimers - small constructs capable of forcefully converting those that still resist Ratvar's reign. Alt-clicking a valid target will allow the reclaimer to leap onto the head of any non-servant, latching onto their head and converting the target if they are able. The target will be outfitted with an unremovable, acid-proof hat version of the reclaimer. The reclaimer will be able to speak as normal and attack its host and anything nearby. If the reclaimer's host goes unconscious or dies, it will leap free.
- - Added pinion airlocks. These airlocks can only be opened by servants and conventional deconstruction will not work on them. They can be created by proselytizing a normal airlock or from Ratvar.
- - Added ratvarian windows. They are created when Ratvar twists the form of a normal window, and there are both single-direction and full-tile variants.
- - Non-servants can no longer use clockwork proselytizers or mending motors.
- - Servants are now deconverted properly.
-
-
coiax updated:
-
- - The cloning pod now sounds robotic on the radio.
- - For extra observer drama, ghosts can now visibly see the countdown of syndicate bombs, nuclear devices, cloning pods, gang dominators and AI doomsday devices.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 77ccf1466d9..39da5c1bb70 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6489,3 +6489,129 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: You will now receive an achievement for winning a pulse rifle at the arcade.
TheCarlSaganExpress:
- rscadd: Added lighting effects to the welder.
+2016-08-07:
+ Arctophylax:
+ - bugfix: You can unbuckle mobs from meat spikes by clicking on the spike once again.
+ Joan:
+ - tweak: Barrier runes will now block air while active.
+ - rscadd: Trying to use sleeping carp against the colossus will now anger it.
+ frtbngll:
+ - bugfix: Fixed Paper Wizard summoning only 9 minions in its lifespan by making
+ the dead stickman decrease it's summoned_minions variable
+ lordpidey:
+ - bugfix: Centcom has received reports of cyborgs electrocuting themselves when
+ working on the power grid, and we have decided to stop storing important electronics
+ on the wirecutter's blade.
+2016-08-08:
+ Ergovisavi:
+ - rscadd: Added bonfires to botany. Requires five tower cap logs to create, and
+ mobs can be buckled to them if an iron rod is added to the bonfire and the mob
+ is restrained.
+ Joan:
+ - rscadd: Added the clockcult "Global Records" alert, which clock cultists can mouse
+ over to check a variety of information on the clockcult's status, including
+ living servants, number of caches, CV, tinkerer's daemons, if there's an unconverted
+ AI, what clockwork generals can be invoked, and what scripture is unlocked.
+ Shadowlight213:
+ - rscadd: Ghosts can now see human player's huds when using the OOC -> Observe verb
+ WJohnston, Gun Hog:
+ - tweak: Xenos are now considered female.
+ - tweak: Hunter pounce are now always blocked by shields, and may be blocked more
+ often by other protective items.
+ - tweak: Alien Queen is now somewhat faster.
+ - tweak: Adjusted larva growth sprites.
+ - tweak: Removed 20% facehugger failure chance for masks.
+ - tweak: Disarm now always forces a person to drop an item in the active hand, and
+ if a person's hand is empty/undroppable, Disarm will always result in a tackle.
+ - tweak: Cyborgs disarmed by a Xeno will first disable their selected module, and
+ if there is none selected, the cyborg will be pushed back and stunned.
+ - tweak: Tail Sweep now has a slightly longer stun.
+2016-08-10:
+ Cruix:
+ - rscadd: Sentient minebots can now toggle meson vision, a flashlight, their mode,
+ and dump their stored ore.
+ - bugfix: Sentient minebots can now be repaired if they were made sentient while
+ the AI was active.
+ - bugfix: Healing minebots will no longer switch them to attack mode.
+ - tweak: Sentient minebots can now shoot at humans.
+ - bugfix: The cooldown on wizard lightning will no longer break if you ethereal
+ jaunt or RISE! after the initial cast.
+ Kor:
+ - rscadd: You can now detonate drones with the RD console
+ LanCartwright:
+ - rscadd: Acute respiratory distress syndrom symptom.
+ - rscadd: Toxic metabolism.
+ - rscadd: Alkali perspiration
+ - rscadd: Autophagocytosis Necrosis
+ - rscadd: Apoptoxin filter
+ - rscadd: 3 different lategame/Non-roundstart virus reagents
+ - rscadd: 4 different lategame/Non-roundstart virus recipes
+ MrStonedOne:
+ - tweak: Tweaked space wind, it should now only trigger at higher pressure differences,
+ but be quicker to become aggressive as the pressure difference gets higher.
+ This should alleviate issues where small differences was still moving a lot
+ of things.
+ - tweak: Paper still moves with any pressure difference.
+ PKPenguin321:
+ - rscadd: There's now an achievement for managing to examine a meteor as a living
+ mob!
+ RemieRichards:
+ - rscadd: 'Added a new PDA button/app: Drone Phone!'
+2016-08-14:
+ Cheridan:
+ - tweak: Greatly reduced amount of Hydroponics yield multipliers
+ - tweak: Somewhat reduced gaia'd tray sustainability.
+ - tweak: Mutagen will no longer potentially cause plant instadeath based on RNG.
+ Ergovisavi:
+ - tweak: Watchers no longer randomly fire beams at you when damaged, and no longer
+ beam you at point blank.
+ Gun Hog:
+ - tweak: The AI's Crew Manifest button now uses the updated styling.
+ Joan:
+ - rscadd: Sigils of Transgression now glow brightly when stunning a target.
+ - rscadd: The Global Records alert now shows the location and countdown time of
+ the Gateway to the Celestial Derelict.
+ - tweak: Clockcult tooltips now all have the clockcult tooltip style.
+ - rscdel: You can no longer become a Reclaimer when clicking on Ratvar. You can
+ still become a Cogscarab, however.
+ - bugfix: You can no longer invoke Vanguard while under its effects.
+ - bugfix: Servants of Ratvar should now always get an announcement when scripture
+ states change.
+ - tweak: Function Call can be used to summon a Ratvarian Spear once every 3 minutes,
+ from 5, but the spear summoned will now only last 3 minutes.
+ - rscadd: Belligerent now does minor damage to the legs on each invocation, up to
+ a maximum of 30 damage per recital.
+ - tweak: Ratvarian Spears will now stun any mob they're thrown at instead of just
+ enemy cultists and silicons, though the stun is still longer on enemy cultists
+ and silicons.
+ Jordie0608:
+ - rscdel: Removed clicking clown mask to morph it's shape, use action button instead.
+ Kor:
+ - rscadd: Added support for projectiles which can dismember
+ - rscadd: Added a new wizard sword, the spellblade, which fires dismembering projectiles.
+ Sprites from Lexorion.
+ - rscadd: Plasmacutter blasts can now take limbs off, but they still do pitiful
+ damage in a pressurized environment.
+ - rscadd: Humans and drones now have a UI button that allows them to create new
+ areas, in the same manner as blueprints. Unlike blueprints, this button does
+ not allow you to edit existing areas.
+ - rscadd: You can now use mineral doors (or any other object that blocks atmos)
+ to complete rooms with blueprints
+ - rscadd: Players created by sentience potions, mining drone upgrades, or Guardian/Holoparsite
+ summoners will now automatically join the users antagonist team, if any.
+ - rscadd: Mobs created in this manner will no longer be convertable/deconvertable
+ unless their creator is first converted/deconverted.
+ - rscadd: Cayenne will now officially become an operative when given a sentience
+ potion.
+ LanCartwright:
+ - bugfix: Fixes the recipes not working.
+ - tweak: Changes Stable uranium virus food recipe from Plasma virus food to just
+ plasma.
+ RemieRichards:
+ - bugfix: You can no longer use the incorrect limb type during augmentation
+ - bugfix: You can no longer use the incorrect limb type during prosthetic replacement
+ Shadowlight213:
+ - rscadd: Security has two new weapons in their arsenal. The security temperature
+ gun, and the DRAGnet capture and recovery system.
+ optional name here:
+ - bugfix: The syndicate uplink ui has been refactored to majorly reduce lag
diff --git a/html/changelogs/AutoChangeLog-pr-19689.yml b/html/changelogs/AutoChangeLog-pr-19689.yml
deleted file mode 100644
index 187e26af3e7..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19689.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "Barrier runes will now block air while active."
diff --git a/html/changelogs/AutoChangeLog-pr-19699.yml b/html/changelogs/AutoChangeLog-pr-19699.yml
deleted file mode 100644
index eea3c038a88..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19699.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - rscadd: "Trying to use sleeping carp against the colossus will now anger it."
diff --git a/html/changelogs/AutoChangeLog-pr-19712.yml b/html/changelogs/AutoChangeLog-pr-19712.yml
deleted file mode 100644
index c02e028baef..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19712.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arctophylax"
-delete-after: True
-changes:
- - bugfix: "You can unbuckle mobs from meat spikes by clicking on the spike once again."
diff --git a/html/changelogs/AutoChangeLog-pr-19866.yml b/html/changelogs/AutoChangeLog-pr-19866.yml
new file mode 100644
index 00000000000..0c7a151a562
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-19866.yml
@@ -0,0 +1,4 @@
+author: "OSCAR MIKE"
+delete-after: True
+changes:
+ - rscadd: "CONTACT ON THE LEFT SIDE!"
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index ddbf6e9845e..ce4f24553e3 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 99a3b626469..1b7d74e4341 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 275b721e94c..f4bee86ddc6 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index e0eefde35b5..99129883b4e 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 7cd4efa8dff..2338f667955 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index c68063a805f..b09c66643c3 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 3e23331d260..6c762beacff 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 2d010d68dc7..3408a3e8262 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi
index 64fd70f2d23..38d081e712c 100644
Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ
diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi
index d6f99ea8574..c6fe98edb4f 100644
Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ
diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi
index a3334dc8b51..68f86526149 100644
Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ
diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi
index 088b44f2396..fd2cf2f611b 100644
Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ
diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi
index 69787bb2299..f0bfece60eb 100644
Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index cbe3c2249dd..967c466a5fd 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 71308e253a7..a94697f55f2 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index dfb3aa43077..3bb8d73b39d 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index d5d4910184b..45e7b49f4e1 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 558e0f62509..a81ead53edc 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 2d62ed154d4..6fdf6e6ae2f 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/code/modules/games/playing_cards.dmi b/icons/obj/playing_cards.dmi
similarity index 95%
rename from code/modules/games/playing_cards.dmi
rename to icons/obj/playing_cards.dmi
index ac8916a64e5..47b5b3e745a 100644
Binary files a/code/modules/games/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 0af139258b2..f9cddb028d6 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/pda_icons/pda_dronephone.png b/icons/pda_icons/pda_dronephone.png
new file mode 100644
index 00000000000..7cf392eb977
Binary files /dev/null and b/icons/pda_icons/pda_dronephone.png differ
diff --git a/sound/weapons/HOMERUN.ogg b/sound/weapons/HOMERUN.ogg
new file mode 100644
index 00000000000..707edd87527
Binary files /dev/null and b/sound/weapons/HOMERUN.ogg differ
diff --git a/sound/weapons/attributions.txt b/sound/weapons/attributions.txt
index 07097f3f6f9..fe2911c8738 100644
--- a/sound/weapons/attributions.txt
+++ b/sound/weapons/attributions.txt
@@ -4,4 +4,6 @@ bulletflyby2:https://www.freesound.org/people/kMoon/sounds/90784/
bulletflyby3:https://www.freesound.org/people/kMoon/sounds/90783/
No changes were made to the sounds, and all credit goes to kMoon.
-
\ No newline at end of file
+batreflect sounds are by shadoWisp on freesound.org:
+https://www.freesound.org/people/shadoWisp/sounds/252044/
+Small parts of the sound are cut out and used.
\ No newline at end of file
diff --git a/sound/weapons/bolathrow.ogg b/sound/weapons/bolathrow.ogg
new file mode 100644
index 00000000000..1eb3b0860b6
Binary files /dev/null and b/sound/weapons/bolathrow.ogg differ
diff --git a/sound/weapons/chainhit.ogg b/sound/weapons/chainhit.ogg
new file mode 100644
index 00000000000..3e61c3dad76
Binary files /dev/null and b/sound/weapons/chainhit.ogg differ
diff --git a/sound/weapons/effects/batreflect1.ogg b/sound/weapons/effects/batreflect1.ogg
new file mode 100644
index 00000000000..43f19710c5f
Binary files /dev/null and b/sound/weapons/effects/batreflect1.ogg differ
diff --git a/sound/weapons/effects/batreflect2.ogg b/sound/weapons/effects/batreflect2.ogg
new file mode 100644
index 00000000000..d58e4e906cb
Binary files /dev/null and b/sound/weapons/effects/batreflect2.ogg differ
diff --git a/sound/weapons/rapierhit.ogg b/sound/weapons/rapierhit.ogg
new file mode 100644
index 00000000000..6e214d2821f
Binary files /dev/null and b/sound/weapons/rapierhit.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 097094ce4b7..f4f7e6f173d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -25,6 +25,7 @@
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\bots.dm"
+#include "code\__DEFINES\clockcult.dm"
#include "code\__DEFINES\clothing.dm"
#include "code\__DEFINES\combat.dm"
#include "code\__DEFINES\contracts.dm"
@@ -324,7 +325,6 @@
#include "code\game\gamemodes\changeling\powers\strained_muscles.dm"
#include "code\game\gamemodes\changeling\powers\tiny_prick.dm"
#include "code\game\gamemodes\changeling\powers\transform.dm"
-#include "code\game\gamemodes\clock_cult\__clock_defines.dm"
#include "code\game\gamemodes\clock_cult\clock_cult.dm"
#include "code\game\gamemodes\clock_cult\clock_items.dm"
#include "code\game\gamemodes\clock_cult\clock_machines.dm"
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index fb15c636f2b..cb9ce9a5be8 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,15 +1,13 @@
-require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=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(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=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&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=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 u(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)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,P=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(P||w)&&(x("delete"),x("has"),h&&x("get")),(w||E)&&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}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],_=m?r:r[e]||(r[e]={}),x=_[u]||(_[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){p(n,e,b);var w,k,E=function(t){if(!d&&t in O)return O[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)}},P=e+" Iterator",C=y==v,S=!1,O=t.prototype,A=O[f]||O[h]||y&&O[y],T=A||E(y);if(A){var M=l(T.call(new t));c(M,P,!0),!a&&s(O,h)&&o(M,f,g),C&&A.name!==v&&(S=!0,T=function(){return A.call(this)})}if(a&&!x||!d&&!S&&O[f]||o(O,f,T),u[e]=T,u[P]=g,y)if(w={values:C?T:E(v),keys:_?T:E(m),entries:C?E("entries"):T},x)for(k in w)k in O||i(O,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u="
",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),P=t(7)(!1),C=Object.prototype,S=Array.prototype,O=S.slice,A=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!C.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"),F=L.length,D=function(){var t,e=p("iframe"),n=F,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("i;)c(r,a=t[i++])&&(~P(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=D(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,F,!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=O.call(arguments,1),a=function(){var r=n.concat(O.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&O.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return O.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return A.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(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(P),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],E=function(){},P=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&P(),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)},O=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},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=A(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),R(e,!0))},N=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=A(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!C,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||P(!0)),_,{resolve:function(t){if(t instanceof k&&S(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=O(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=O(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,E=m.get,P=r.Symbol,C=r.JSON,S=C&&C.stringify,O=!1,A=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof P,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,F=function(t){var e=R[t]=k(P.prototype);return e._k=t,o&&O&&N(L,t,{configurable:!0,set:function(e){i(this,A)&&i(this[A],t)&&(this[A][t]=!1),N(this,t,_(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,A)&&t[A][e]&&(t[A][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,A)||w(t,A,_(1,{})),t[A][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,A)&&this[A][t]?e:!0},U=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,A)&&t[A][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==A||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!D(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),a[1]=e,S.apply(C,a)}},H=p(function(){var t=P();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});j||(P=function(){if(D(this))throw TypeError("Symbol is not a constructor");return F(f(arguments.length>0?arguments[0]:void 0))},u(P.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof P},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var Q={"for":function(t){return i(M,t+="")?M[t]:M[t]=P(t)},keyFor:function(t){return h(M,t)},useSetter:function(){O=!0},useSimple:function(){O=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=j?e:F(e)}),O=!0,s(s.G+s.W,{Symbol:P}),s(s.S,"Symbol",Q),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(P,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===P){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=P,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?P:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=P,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},P=document.createElement("div"),C=document.documentElement,S=C.removeAttribute,O=C.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&P.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;P.hasChildNodes();)P.removeChild(P.firstChild)}null!=o&&O.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Ao.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function P(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function O(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},P(t,E(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);return t.set(e,+a+n)}function A(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 F(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function X(t){t.detachNodes()}function J(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(S(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _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=E(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=P(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Pt(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function Ot(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function At(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&jt(s),e.innerHTML=""}return this.cssId&&Au.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Dt),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Du,"").replace(Fu,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Ft),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Ft(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?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=Eo(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!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;)p(a,r=t[i++])&&(~S(o,r)||o.push(r));return o}},q=function(){};i(i.S,"Object",{getPrototypeOf:a.getProto=a.getProto||function(t){return t=g(t),p(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?O:null},getOwnPropertyNames:a.getNames=a.getNames||I(N,N.length,!0),create:a.create=a.create||function(t,e){var n;return null!==t?(q.prototype=h(t),n=new q,q.prototype=null,n[k]=t):n=D(),void 0===e?n:M(n,e)},keys:a.getKeys=a.getKeys||I(F,R,!1)});var B=function(t,e,n){if(!(e in L)){for(var r=[],a=0;e>a;a++)r[a]="a["+a+"]";L[e]=Function("F,a","return new F("+r.join(",")+")")}return L[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),r=function(){var a=n.concat(A.call(arguments));return this instanceof r?B(e,a.length,a):f(e,a,t)};return v(e.prototype)&&(r.prototype=e.prototype),r}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),r=l(this);if(e=void 0===e?n:e,"Array"==r)return A.call(this,t,e);for(var a=x(t,n),i=x(e,n),o=_(i-a),s=Array(o),u=0;o>u;u++)s[u]="String"==r?this.charAt(a+u):this[a+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return P.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var V=function(t){return function(e,n){m(e);var r=w(this),a=_(r.length),i=t?a-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in r){n=r[i],i+=o;break}if(i+=o,t?0>i:i>=a)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:a>i;i+=o)i in r&&(n=e(n,r[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:a.each=a.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:V(!1),reduceRight:V(!0),indexOf:U(S),lastIndexOf:function(t,e){var n=b(this),r=_(n.length),a=r-1;for(arguments.length>1&&(a=Math.min(a,y(e))),0>a&&(a=_(r+a));a>=0;a--)if(a in n&&n[a]===t)return a;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var z=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(),r=0>e?"-":e>9999?"+":"";return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+z(t.getUTCMonth()+1)+"-"+z(t.getUTCDate())+"T"+z(t.getUTCHours())+":"+z(t.getUTCMinutes())+":"+z(t.getUTCSeconds())+"."+(n>99?n:"0"+z(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var r=t(22);r(r.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var r=t(22);r(r.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var r=t(22),a=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return a(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 r=t(22),a=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return a(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 r=t(17),a=t(22),i=t(80),o=t(40),s=t(35),u=t(79),c=t(84);a(a.S+a.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,a,p,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=c(l);if(v&&(m=r(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(p=b.call(l),n=new f;!(a=p.next()).done;g++)n[g]=v?o(p,m,[a.value,g],!0):a.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var r=t(3),a=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,a(1)):"keys"==e?a(0,n):"values"==e?a(0,t[n]):a(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var r=t(22);r(r.S+r.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,r=new("function"==typeof this?this:Array)(n);n>t;)r[t]=e[t++];return r.length=n,r}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var r=t(46),a=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||r.setDesc(o,i,{value:function(t){if("function"!=typeof this||!a(t))return!1;if(!a(this.prototype))return t instanceof this;for(;t=r.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var r=t(46).setDesc,a=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&r(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||r(this,u,a(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var r=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(this,t);return e&&e.v},set:function(t,e){return r.def(this,0===t?0:t,e)}},r,!0)},{12:12,15:15}],97:[function(t,e,n){var r=t(22),a=t(50),i=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:a(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?0>t?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var a=t(22);a(a.S,"Math",{asinh:r})},{22:22}],99:[function(t,e,n){var r=t(22);r(r.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var r=t(22),a=t(51);r(r.S,"Math",{cbrt:function(t){return a(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var r=t(22);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var r=t(22),a=Math.exp;r(r.S,"Math",{cosh:function(t){return(a(t=+t)+a(-t))/2}})},{22:22}],103:[function(t,e,n){var r=t(22);r(r.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var r=t(22),a=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),c=i(2,-126),p=function(t){return t+1/o-1/o};r(r.S,"Math",{fround:function(t){var e,n,r=Math.abs(t),i=a(t);return c>r?i*p(r/c/s)*c*s:(e=(1+s/o)*r,n=e-(e-r),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var r=t(22),a=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,i=0,o=0,s=arguments,u=s.length,c=0;u>o;)n=a(s[o++]),n>c?(r=c/n,i=i*r*r+1,c=n):n>0?(r=n/c,i+=r*r):i+=n;return c===1/0?1/0:c*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var r=t(22),a=Math.imul;r(r.S+r.F*t(24)(function(){return-5!=a(4294967295,5)||2!=a.length}),"Math",{imul:function(t,e){var n=65535,r=+t,a=+e,i=n&r,o=n&a;return 0|i*o+((n&r>>>16)*o+i*(n&a>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var r=t(22);r(r.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var r=t(22);r(r.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var r=t(22);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var r=t(22);r(r.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var r=t(22),a=t(49),i=Math.exp;r(r.S+r.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(a(t)-a(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var r=t(22),a=t(49),i=Math.exp;r(r.S,"Math",{tanh:function(t){var e=a(t=+t),n=a(-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 r=t(22);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var r=t(46),a=t(29),i=t(30),o=t(11),s=t(81),u=t(24),c=t(74).trim,p="Number",l=a[p],f=l,d=l.prototype,h=o(r.create(d))==p,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():c(e,3);var n,r,a,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:r=2,a=49;break;case 79:case 111:r=8,a=55;break;default:return+e}for(var o,u=e.slice(2),p=0,l=u.length;l>p;p++)if(o=u.charCodeAt(p),48>o||o>a)return NaN;return parseInt(u,r)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=p)?new f(v(e)):v(e)},r.each.call(t(19)?r.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&r.setDesc(l,t,r.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(a,p,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 r=t(22);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var r=t(22),a=t(29).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&a(t)}})},{22:22,29:29}],117:[function(t,e,n){var r=t(22);r(r.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var r=t(22);r(r.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var r=t(22),a=t(37),i=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return a(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var r=t(22);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var r=t(22);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var r=t(22);r(r.S+r.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var r=t(38);t(54)("freeze",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var r=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(r(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var r=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],129:[function(t,e,n){var r=t(38);t(54)("isExtensible",function(t){return function(e){return r(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var r=t(38);t(54)("isFrozen",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var r=t(38);t(54)("isSealed",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var r=t(22);r(r.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var r=t(80);t(54)("keys",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],134:[function(t,e,n){var r=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var r=t(38);t(54)("seal",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var r=t(22);r(r.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var r=t(10),a={};a[t(83)("toStringTag")]="z",a+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var r,a=t(46),i=t(48),o=t(29),s=t(17),u=t(10),c=t(22),p=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},O=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=a.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var r=!1;k.resolve(a.setDesc({},"then",{get:function(){r=!0}})),n=r}}catch(i){n=!1}return n}(),C=function(t,e){return i&&t===k&&e===r?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},P=function(t){var e;return p(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=f(e),this.reject=f(n)},j=function(t){try{t()}catch(e){return{error:e}}},M=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var r=t.v,a=1==t.s,i=0,s=function(e){var n,i,o=a?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(a||(t.h=!0),n=o===!0?r:o(r),n===e.promise?u(TypeError("Promise-chain cycle")):(i=P(n))?i.call(n,s,u):s(n)):u(r)}catch(c){u(c)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,a=t.p;L(a)&&(w?_.emit("unhandledRejection",r,a):(e=o.onunhandledrejection)?e({promise:a,reason:r}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",r)),t.a=void 0},1)})}},L=function(t){var e,n=t._d,r=n.a||n.c,a=0;if(n.h)return!1;for(;r.length>a;)if(e=r[a++],e.fail||!L(e.promise))return!1;return!0},F=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),M(e,!0))},N=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=P(t))?y(function(){var r={r:n,d:!1};try{e.call(t,s(N,r,1),s(F,r,1))}catch(a){F.call(r,a)}}):(n.v=t,n.s=1,M(n,!1))}catch(r){F.call({r:n,d:!1},r)}}};O||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(F,e,1))}catch(n){F.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),r=n.promise,a=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,a.c.push(n),a.a&&a.a.push(n),a.s&&M(a,!1),r},"catch":function(t){return this.then(void 0,t)}})),c(c.G+c.W+c.F*!O,{Promise:k}),t(66)(k,x),t(65)(x),r=t(16)[x],c(c.S+c.F*!O,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),c(c.S+c.F*(!O||S(!0)),x,{resolve:function(t){if(t instanceof k&&C(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),c(c.S+c.F*!(O&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),r=n.resolve,i=n.reject,o=[],s=j(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?a.each.call(o,function(t,a){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[a]=t,--n||r(s))},i)}):r(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),r=n.reject,a=j(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return a&&r(a.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var r=t(22),a=Function.apply,i=t(4);r(r.S,"Reflect",{apply:function(t,e,n){return a.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var r=t(46),a=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;a(a.S+a.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 a=[null];return a.push.apply(a,e),new(u.apply(t,a))}var c=n.prototype,p=r.create(s(c)?c:Object.prototype),l=Function.apply.call(t,p,e);return s(l)?l:p}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var r=t(46),a=t(22),i=t(4);a(a.S+a.F*t(24)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return r.setDesc(t,e,n),!0}catch(a){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var r=t(22),a=t(46).getDesc,i=t(4);r(r.S,"Reflect",{deleteProperty:function(t,e){var n=a(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 r=t(22),a=t(4),i=function(t){this._t=a(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}}),r(r.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var r=t(46),a=t(22),i=t(4);a(a.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var r=t(22),a=t(46).getProto,i=t(4);r(r.S,"Reflect",{getPrototypeOf:function(t){return a(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function r(t,e){var n,o,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=a.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:s(o=a.getProto(t))?r(o,e,c):void 0}var a=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:r})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var r=t(22),a=t(4),i=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return a(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var r=t(22),a=t(4),i=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){a(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var r=t(22),a=t(64);a&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){a.check(t,e);try{return a.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function r(t,e,n){var o,p,l=arguments.length<4?t:arguments[3],f=a.getDesc(u(t),e);if(!f){if(c(p=a.getProto(t)))return r(p,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&c(l)?(o=a.getDesc(l,e)||s(0),o.value=n,a.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var a=t(46),i=t(30),o=t(22),s=t(59),u=t(4),c=t(38);o(o.S,"Reflect",{set:r})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var r=t(46),a=t(29),i=t(39),o=t(26),s=a.RegExp,u=s,c=s.prototype,p=/a/g,l=/a/g,f=new s(p)!==p;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(p)!=p||s(l)==l||"/a/i"!=s(p,"i")})||(s=function(t,e){var n=i(t),r=void 0===e;return this instanceof s||!n||t.constructor!==s||!r?f?new u(n&&!r?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&r?o.call(t):e):t},r.each.call(r.getNames(u),function(t){t in s||r.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),c.constructor=s,s.prototype=c,t(61)(a,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var r=t(46);t(19)&&"g"!=/./g.flags&&r.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var r=t(this),a=void 0==n?void 0:n[e];return void 0!==a?a.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(r,a){"use strict";var i=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,i,a):n.call(i+"",r,a)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var r=t(this),a=void 0==n?void 0:n[e];return void 0!==a?a.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(r,a){"use strict";var i=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,i,a):n.call(i+"",r,a)}})},{25:25}],159:[function(t,e,n){"use strict";var r=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t=0===t?0:t,t)}},r)},{12:12,15:15}],160:[function(t,e,n){"use strict";var r=t(22),a=t(70)(!1);r(r.P,"String",{codePointAt:function(t){return a(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var r=t(22),a=t(79),i=t(71),o="endsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,r=n.length>1?n[1]:void 0,u=a(e.length),c=void 0===r?u:Math.min(a(r),u),p=t+"";return s?s.call(e,p,c):e.slice(c-p.length,c)===p}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var r=t(22),a=t(76),i=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments,o=r.length,s=0;o>s;){if(e=+r[s++],a(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 r=t(22),a=t(71),i="includes";r(r.P+r.F*t(23)(i),"String",{includes:function(t){return!!~a(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 r=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var r=t(22),a=t(78),i=t(79);r(r.S,"String",{raw:function(t){for(var e=a(t.raw),n=i(e.length),r=arguments,o=r.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(r[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var r=t(22);r(r.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var r=t(22),a=t(79),i=t(71),o="startsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,r=a(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,r):e.slice(r,r+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var r=t(46),a=t(29),i=t(30),o=t(19),s=t(22),u=t(61),c=t(24),p=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=r.getDesc,w=r.setDesc,k=r.create,E=m.get,S=a.Symbol,O=a.JSON,C=O&&O.stringify,A=!1,P=d("_hidden"),T=r.isEnum,j=p("symbol-registry"),M=p("symbols"),L="function"==typeof S,F=Object.prototype,N=o&&c(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=_(F,e);r&&delete F[e],w(t,e,n),r&&t!==F&&w(F,e,r)}:w,R=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&A&&N(F,t,{configurable:!0,set:function(e){i(this,P)&&i(this[P],t)&&(this[P][t]=!1),N(this,t,x(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(M,e)?(n.enumerable?(i(t,P)&&t[P][e]&&(t[P][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,P)||w(t,P,x(1,{})),t[P][e]=!0),N(t,e,n)):w(t,e,n)},q=function(t,e){b(t);for(var n,r=v(e=y(e)),a=0,i=r.length;i>a;)I(t,n=r[a++],e[n]);return t},B=function(t,e){return void 0===e?k(t):q(k(t),e)},V=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(M,t)||i(this,P)&&this[P][t]?e:!0},U=function(t,e){var n=_(t=y(t),e);return!n||!i(M,e)||i(t,P)&&t[P][e]||(n.enumerable=!0),n},z=function(t){for(var e,n=E(y(t)),r=[],a=0;n.length>a;)i(M,e=n[a++])||e==P||r.push(e);return r},W=function(t){for(var e,n=E(y(t)),r=[],a=0;n.length>a;)i(M,e=n[a++])&&r.push(M[e]);return r},H=function(t){if(void 0!==t&&!D(t)){for(var e,n,r=[t],a=1,i=arguments;i.length>a;)r.push(i[a++]);return e=r[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),r[1]=e,C.apply(O,r)}},G=c(function(){var t=S();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))});L||(S=function(){if(D(this))throw TypeError("Symbol is not a constructor");return R(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof S},r.create=B,r.isEnum=V,r.getDesc=U,r.setDesc=I,r.setDescs=q,r.getNames=m.get=z,r.getSymbols=W,o&&!t(48)&&u(F,"propertyIsEnumerable",V,!0));var K={"for":function(t){return i(j,t+="")?j[t]:j[t]=S(t)},keyFor:function(t){return h(j,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};r.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:R(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:B,defineProperty:I,defineProperties:q,getOwnPropertyDescriptor:U,getOwnPropertyNames:z,getOwnPropertySymbols:W}),O&&s(s.S+s.F*(!L||G),"JSON",{stringify:H}),l(S,"Symbol"),l(Math,"Math",!0),l(a.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var r=t(46),a=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,c=i.WEAK,p=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(!p(t))return u(this).get(t);if(s(t,c))return t[c][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)&&r.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];a(e,t,function(e,r){if(o(e)&&!p(e)){var a=u(this)[t](e,r);return"set"==t?this:a}return n.call(this,e,r)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var r=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t,!0)}},r,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var r=t(22),a=t(7)(!0);r(r.P,"Array",{includes:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var r=t(22);r(r.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var r=t(22),a=t(55)(!0);r(r.S,"Object",{entries:function(t){return a(t)}})},{22:22,55:55}],175:[function(t,e,n){var r=t(46),a=t(22),i=t(56),o=t(78),s=t(59);a(a.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,a=o(t),u=r.setDesc,c=r.getDesc,p=i(a),l={},f=0;p.length>f;)n=c(a,e=p[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var r=t(22),a=t(55)(!1);r(r.S,"Object",{values:function(t){return a(t)}})},{22:22,55:55}],177:[function(t,e,n){var r=t(22),a=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return a(t)}})},{22:22,62:62}],178:[function(t,e,n){var r=t(22);r(r.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var r=t(22),a=t(70)(!0);r(r.P,"String",{at:function(t){return a(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var r=t(22),a=t(72);r(r.P,"String",{padLeft:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var r=t(22),a=t(72);r(r.P,"String",{padRight:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var r=t(46),a=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){r.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),a(a.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var r=t(29),a=t(31),i=t(45),o=t(83)("iterator"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,p=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;c&&!c[o]&&a(c,o,l),p&&!p[o]&&a(p,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var r=t(22),a=t(75);r(r.G+r.B,{setImmediate:a.set,clearImmediate:a.clear})},{22:22,75:75}],187:[function(t,e,n){var r=t(29),a=t(22),i=t(33),o=t(57),s=r.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),c=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};a(a.G+a.B+a.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function r(t,e,n,r){var a=Object.create((e||i).prototype),o=new h(r||[]);return a._invoke=l(t,n,o),a}function a(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(r){return{type:"throw",arg:r}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function p(e){function n(t,n){var r=e[t](n),a=r.value;return a instanceof c?Promise.resolve(a.arg).then(i,o):Promise.resolve(a).then(function(t){return r.value=t,r})}function r(t,e){function r(){return n(t,e)}return a=a?a.then(r,r):new Promise(function(t){t(r())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var a,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=r}function l(t,e,n){var r=w;return function(i,o){if(r===E)throw Error("Generator is already running");if(r===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var c=a(u,s.iterator,o);if("throw"===c.type){i="throw",o=c.arg;continue}}if("return"===i)continue}var c=a(s.iterator[i],s.iterator,o);if("throw"===c.type){n.delegate=null,i="throw",o=c.arg;continue}i="next",o=g;var p=c.arg;if(!p.done)return r=k,p;n[s.resultName]=p.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,r===k?n.sent=o:n.sent=g;else if("throw"===i){if(r===w)throw r=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);r=E;var c=a(t,e,n);if("normal"===c.type){r=n.done?S:k;var p={value:c.arg,done:n.done};if(c.arg!==O)return p;n.delegate&&"next"===i&&(o=g)}else"throw"===c.type&&(r=S,i="throw",o=c.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function a(){for(;++n=0;--r){var a=this.tryEntries[r],i=a.completion;if("root"===a.tryLoc)return e("end");if(a.tryLoc<=this.prev){var o=b.call(a,"catchLoc"),s=b.call(a,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&b.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var a=r.arg;d(n)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return p.createDocumentFragment()}function n(t){return p.createElement(t)}function r(t){if(1===t.length)return a(t[0]);for(var n=e(),r=q.call(t),i=0;i-1}}([].indexOf||function(t){for(B=this.length;B--&&this[B]!==t;);return B}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(c(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-p>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new r(s),h=new r(s),m=new r(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",a(d,c(i,"sans-serif")),a(h,c(i,"serif")),a(m,c(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),a(d,c(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),a(h,c(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),a(m,c(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 r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function a(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,p(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,r){if(e||(e=n),f)return e.createElement(t);r||(r=o(e));var a;return a=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!a.canHaveChildren||m.test(t)||a.tagUrn?a:r.frag.appendChild(a)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),i=0,s=a(),u=s.length;u>i;i++)r.createElement(s[i]);return r}function c(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+a().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function p(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||c(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:p,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,p(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,r){for(var i,o=n.slice(),s=a(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,r&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var a=b(e||t,r);v(t,"textContent",n(function(){return a.get.call(this)},function(t){a.set.call(this,t)}))}function a(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function p(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 r in n)if(y.call(n,r))try{v(e,r,n[r])}catch(a){t.console&&console.log(r+" failed on object:",e,a.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),O=document.documentElement,C=O.removeAttribute,A=O.setAttribute;r(t.HTMLCommentElement.prototype,x,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(_,null,"nodeValue"),r(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,r){if("function"==typeof n||"object"==typeof n){var a,o,u=this,c="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[c]||(l[c]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,p(u,t),d,!1)},!y.call(E,c))if(w.test(t)){try{a=document.createEventObject(),a[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(c))&&C.call(u,c)),u.fireEvent(c,a),E[c]=!0}catch(a){for(E[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,c,o)}else E[c]=!1;(f.n=E[c])&&u.attachEvent(c,f.w)}i(d,n)<0&&d[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,r=this,a="on"+t.type,i=r[m],o=i&&i[a],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(a,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var r=this,a="on"+t,o=r[m],s=o&&o[a],u=s&&s.h,c=u?i(u,e):-1;c>-1&&u.splice(c,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,a="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[a]||(o[a]={}),u=s.h||(s.h=[]);i(u,e)<0&&(r[a]||(r[a]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,a=n[m],i=a&&a[r],o=!!i;return o&&(i.n?n.fireEvent(r,t):e(n,t,i.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var a=this;x.addEventListener.call(a,e,n,r),l&&e===h&&!k.test(a.readyState)&&(l=!1,a.attachEvent(d,u),t==top&&!function i(t){try{a.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,r=/^(top|right|bottom|left)$/,a=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,p=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(a,i),e=p?p[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=l&&l.left,s&&(l.left=p.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,a){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,p(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,r)<0&&o[a?"unshift":"push"](r)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,r){var a="on"+e,o=(t[a]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,c.times)(r,(0,c.minus)(n[l],n[l-1])));for(var f=[(0,c.plus)(n[0],p(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,c.minus)(n[l],(0,c.average)([i[l],i[l-1]])));f.push((0,c.minus)(n[s-1],p(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,a(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,c.range)(2,s).reduce(function(t,e){var r=f[e],a=n[e];return t.smoothcurveto(r[0],r[1],a[0],a[1])},g),centroid:(0,c.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)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=r(i),s=t(198),u=1e-5,c=function(t,e){var n=t.map(e),r=n.sort(function(t,e){var n=a(t,2),r=n[0],i=(n[1],a(e,2)),o=i[0];i[1];return r-o}),i=r.length,o=r[0][0],c=r[i-1][0],p=(0,s.minBy)(r,function(t){return t[1]}),l=(0,s.maxBy)(r,function(t){return t[1]});return o==c&&(c+=u),p==l&&(l+=u),{points:r,xmin:o,xmax:c,ymin:p,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,r=t.yaccessor,i=t.width,u=t.height,p=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=a(t,2),n=e[0];e[1];return n}),r||(r=function(t){var e=a(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),r(t)]},h=e.map(function(t){return c(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;p&&(g=Math.min(g,0),b=Math.max(b,0));var y=p?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=a(t,2),n=e[0],r=e[1];return[x(n),_(r)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)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")}}(),a=function i(t,e){var n=r(t,2),a=n[0],o=n[1],s=r(e,2),u=s[0],c=s[1],p=function(t){return u+(c-u)*(t-a)/(o-a)};return p.inverse=function(){return i([u,c],[a,o])},p};n["default"]=a,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)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")}}(),a=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},c=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},p=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return[a+s,i+u]},l=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return[a-s,i-u]},f=function(t,e){var n=r(e,2),a=n[0],i=n[1];return[t*a,t*i]},d=function(t){var e=r(t,2),n=e[0],a=e[1];return Math.sqrt(n*n+a*a)},h=function(t){return t.reduce(p,[0,0])},m=function(t){return f(1/t.length,t.reduce(p))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var r in n){var a=n[r];e[r]=a(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var r=[],a=t;e>a;a++)r.push(a);return n&&r.push(e),r},y=function(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,c=t[u];n.push(e(u,c))}}catch(p){a=!0,i=p}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=a,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=c,n.plus=p,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:a,min:i,max:o,sumBy:s,minBy:u,maxBy:c,plus:p,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)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")}}(),a=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},a=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return a===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,r=n.map(function(t){return s(t,6)});return e+" "+r.join(" ")},c=function(t,e){var n=t.command,a=t.params,i=r(e,2),o=i[0],s=i[1];switch(n){case"M":return[a[0],a[1]];case"L":return[a[0],a[1]];case"H":return[a[0],s];case"V":return[o,a[0]];case"Z":return null;case"C":return[a[4],a[5]];case"S":return[a[2],a[3]];case"Q":return[a[2],a[3]];case"T":return[a[0],a[1]];case"A":return[a[5],a[6]]}},p=function(t,e){return function(n){var r="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,r)}},l=function(t){return i(n(e,t))};return{moveto:p(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:p(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:p(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:p(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:p(["x1","y1","x2","y2","x","y"],function(t,e,n,r,a,i){return l({command:"C",params:[t,e,n,r,a,i]})}),smoothcurveto:p(["x2","y2","x","y"],function(t,e,n,r){return l({command:"S",params:[t,e,n,r]})}),qcurveto:p(["x1","y1","x","y"],function(t,e,n,r){return l({command:"Q",params:[t,e,n,r]})}),smoothqcurveto:p(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:p(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,r,a,i,o){return l({command:"A",params:[t,e,n,r,a,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],r=!0,a=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,p=c(u,n);n=p,p&&t.push(p)}}catch(l){a=!0,i=l}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],r=t.points()[0],o=t.instructions().slice(1);return a(n,r)||o.unshift({command:"L",params:r}),i(this.instructions().concat(o))}}};n["default"]=function(){return a()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function a(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var a,i;i=n.shift();)for(a in i)Mo.call(i,a)&&(t[a]=i[a]);return t}function a(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return Fo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function c(t){return t&&"[object Object]"===Lo.call(t)}function p(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),r=1;e>r;r++)n[r-1]=arguments[r];throw t=p(t,n),Error(t)}function f(){Mv.DEBUG&&Po.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=p(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=p(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Mv.DEBUG&&d.apply(null,arguments)}function v(){Mv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var r=b(t,e,n);return r?r[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,r,a,i,o;for(e=t.split("."),(n=Wo[e.length])||(n=_(e.length)),i=[],r=function(t,n){return t?"*":e[n]},a=n.length;a--;)o=n[a].map(r).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,r,a,i,o,s,u,c="";if(!Wo[t]){for(r=[];c.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(a(n[o]));r[i]=u}Wo[t]=r}return Wo[t]}function w(t,e,n,r){var a=t[e];if(!a||!a.equalsOrStartsWith(r)&&a.equalsOrStartsWith(n))return t[e]=a?a.replace(n,r):r,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new $o(t)),Ko[t])}function S(t,e){function n(e,n){var r,a,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],a=r?r.get():t.viewmodel.get(n),o=a?Object.keys(a):null),o&&o.forEach(function(t){"_ractive"===t&&i(a)||e.push(n.join(t))}),e}var r,a,o;for(r=e.str.split("."),o=[Yo];a=r.shift();)"*"===a?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(a):o=o.map(O(a));return o}function O(t){return function(e){return e.join(t)}}function C(t){return t?t.replace(Ho,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,a=void 0;if(/\*/.test(e))return a={},S(t,E(C(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Zo);a[e.str]=r+n}),t.set(a);if(r=t.get(e),!u(r))throw Error(Zo);return t.set(e,+r+n)}function P(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=rs[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!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 F(t){return"string"==typeof t?[t]:void 0===t?[]:t;
+}function N(t){return t[t.length-1]}function R(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function q(t,e){return function(){for(var n;n=t.shift();)n(e)}}function B(t,e,n,r){var a;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof as)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{a=e.then}catch(i){return void r(i)}if("function"==typeof a){var o,s,u;s=function(e){o||(o=!0,B(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{a.call(e,s,u)}catch(i){if(!o)return r(i),void(o=!0)}}else n(e)}}function V(t,e,n){var r;return e=C(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),W(t,r.firstKey,n)):"."===e[0]?(r=U(ps(n),e),r&&W(t,r.firstKey,n)):r=z(t,E(e),n),r}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function z(t,e,n,r){var a,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(a=n.context,n=n.parent,a&&(s=!0,o=t.viewmodel.get(a),o&&("object"==typeof o||"function"==typeof o)&&i in o))return a.join(e.str);return H(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=z(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function W(t,e){var n;!t.parent||t.isolated||H(t.viewmodel,e)||(e=E(e),(n=z(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function H(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function G(t){t.teardown()}function K(t){t.unbind()}function $(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function Z(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 X(){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--)a=t._subs[e[i]],a&&(s=gt(t,a,n,r)&&s);if(zs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,r)}}function gt(t,e,n,r){var a=null,i=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(i=!0);return n&&!n._noArg&&i&&(a=n.original)&&(a.preventDefault&&a.preventDefault(),a.stopPropagation&&a.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};Ws(this,t,e)}function yt(t){var e;return t=E(C(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 xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,_t(this)}function _t(t){Qs.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var r,a;return t=E(C(t)),r=this.viewmodel.get(t),i(r)&&i(e)?(a=bs.start(this,!0),this.viewmodel.merge(t,r,e,n),bs.end(),a):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=S(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var a,i,o;e=E(C(e)),r=r||pu,e.isPattern?(a=new uu(t,e,n,r),t.viewmodel.patternObservers.push(a),i=!0):a=new Xs(t,e,n,r),a.init(r.init),t.viewmodel.register(e,a,i?"patternObservers":"observers"),a.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(a),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,a,"patternObservers")):t.viewmodel.unregister(e,a,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var r,a,i,o;if(c(t)){n=e,a=t,r=[];for(t in a)a.hasOwnProperty(t)&&(e=a[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",cu(this,t,e,n);if(i=t.split(" "),1===i.length)return cu(this,t,e,n);for(r=[],o=i.length;o--;)t=i[o],t&&r.push(cu(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ot(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function Ct(t,e){var n,r=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,a;(n=r._subs[t])&&(e?(a=n.indexOf(e),-1!==a&&n.splice(a,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,r,a,i=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return a=t.split(" ").map(du).filter(hu),a.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Pt(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var r,a,i,o,s,u,c=[];if(r=jt(t,e,n),!r)return null;for(a=t.length,s=r.length-2-r[1],i=Math.min(a,r[0]),o=i+r[1],u=0;i>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;a>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function jt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var r,a,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=bs.start(this,!0),bs.scheduleTask(function(){return ju.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Pu.apply(),e&&((a=e.__ractive_instances__)?a.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,r.then(function(){return Mu.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(G)}function Ft(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Nt(t,e){var n,r,a;return r='[data-ractive-css~="{'+e+'}"]',a=function(t){var e,n,a,i,o,s,u,c=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Dt),u=e.length;u--;)s=i.slice(),a=e[u],s[u]=a.base+r+a.modifiers||"",o=i.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=Bu.test(t)?t.replace(Bu,r):t.replace(Du,"").replace(Ru,function(t,e){var n,r;return qu.test(e)?t:(n=e.split(",").map(Rt),r=n.map(a).join(", ")+" ",t.replace(e,r))})}function Rt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?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 qt(t,e){It(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var a=r?Bt(e,this):e,i=n?Bt(t,this):t;return Vt(a,i)}:Vt(e,t)}function Bt(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 Vt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Eo($u);return e.parse=function(e,n){return zt(e,n||t)},e}function zt(t,e){if(!Gu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Gu(t,e||this.options)}function Wt(t,e){var n;if(!Zi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Ht(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a
{{#partial button}}
- {{#if config.fancy}}
-
- {{/if}}
{{#if data.lockable}}
Lock
{{/if}}
@@ -37,14 +28,16 @@
{{#each data.categories}}
-
- {{#each items}}
-
- {{cost}} TC
-
- {{/each}}
+
+ {{name}}
+ {{#each items}}
+
+ {{cost}} TC
+
+ {{/each}}
{{/each}}
+