diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx
index 47e7a667..4ecfc4a4 100644
--- a/client/src/components/animations.jsx
+++ b/client/src/components/animations.jsx
@@ -23,11 +23,12 @@ const Strike = require('./anims/strike');
const Parry = require('./anims/parry');
const Purify = require('./anims/purify');
const Recharge = require('./anims/recharge');
-const Reflect = require('./anims/reflect');
+const Refl = require('./anims/reflect');
const Chaos = require('./anims/chaos');
const Invert = require('./anims/invert');
const Slay = require('./anims/slay');
const Intercept = require('./anims/intercept');
+const Sleep = require('./anims/sleep');
const Triage = require('./anims/triage');
const TriageTick = require('./anims/triage.tick');
const Siphon = require('./anims/siphon');
@@ -138,7 +139,7 @@ function animations(props) {
case 'Banish': return ;
case 'Bash': return ;
case 'Hex': return ;
- case 'Sleep': return false;
+ case 'Sleep': return ;
case 'Throw': return false;
case 'Ruin': return false;
@@ -151,7 +152,7 @@ function animations(props) {
case 'Parry': return ;
case 'Purify': return ;
case 'Recharge': return ;
- case 'Reflect': return ;
+ case 'Reflect': return ;
default: return false;
}
diff --git a/client/src/components/anims/sleep.jsx b/client/src/components/anims/sleep.jsx
new file mode 100644
index 00000000..d25c7268
--- /dev/null
+++ b/client/src/components/anims/sleep.jsx
@@ -0,0 +1,142 @@
+const preact = require('preact');
+const { Component } = require('preact');
+const anime = require('animejs').default;
+
+const { TIMES, COLOURS } = require('../../constants');
+const { randomPoints } = require('../../utils');
+
+// logarithmic spiral lifted from
+// https://upload.wikimedia.org/wikipedia/commons/5/5b/Logarithmic_spiral_(1).svg
+
+function projectile(x, y, radius, colour) {
+ return (
+
+ );
+}
+
+class Sleep extends Component {
+ constructor() {
+ super();
+ this.animations = [];
+ const points = randomPoints(30, 30, { x: -250, y: -150, width: 600, height: 600 });
+ this.charges = points.map(coord => projectile(coord[0], coord[1], 15, COLOURS.GREEN));
+ }
+
+ render() {
+ const path = 'M0,100 C100,100 100,100 200,100';
+
+ return (
+
+ );
+ }
+
+ componentDidMount() {
+ anime.set('#sleep', {
+ translateY: 75,
+ });
+
+ this.animations.push(anime({
+ targets: ['#sleep'],
+ opacity: [
+ { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS * 0.2 },
+ ],
+ easing: 'easeInOutSine',
+ }));
+
+ this.animations.push(anime({
+ targets: ['#sleep'],
+ rotate: 180,
+ easing: 'linear',
+ loop: true,
+ delay: TIMES.TARGET_DELAY_MS,
+ duration: TIMES.TARGET_DURATION_MS + TIMES.POST_SKILL_DURATION_MS,
+ }));
+
+ this.animations.push(anime({
+ targets: ['#stun'],
+ opacity: [
+ { value: 0, delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.8, duration: TIMES.TARGET_DURATION_MS * 0.2 },
+ ],
+ easing: 'easeInOutSine',
+ }));
+
+/* this.animations.push(anime({
+ targets: ['#heal'],
+ opacity: [
+ { value: 1, delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.7, duration: TIMES.TARGET_DURATION_MS * 0.3 },
+ { value: 0, delay: TIMES.POST_SKILL_DURATION_MS * 0.6, duration: TIMES.POST_SKILL_DURATION_MS * 0.4 },
+ ],
+ easing: 'easeInOutSine',
+ }));
+*/
+
+ this.animations.push(anime({
+ targets: ['#charges'],
+ opacity: 1,
+ delay: anime.stagger(TIMES.TARGET_DURATION_MS * 0.015, { start: TIMES.TARGET_DELAY_MS }),
+ easing: 'easeInOutSine',
+ }));
+
+
+ this.animations.push(anime({
+ targets: ['#charges'],
+ cx: 0,
+ cy: 0,
+ delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS + TIMES.POST_SKILL_DURATION_MS * 0.75,
+ duration: TIMES.POST_SKILL_DURATION_MS * 0.25,
+ easing: 'easeInOutSine',
+ }));
+
+ }
+
+ // this is necessary because
+ // skipping / timing / unmounting race conditions
+ // can cause the animations to cut short, this will ensure the values are reset
+ // because preact will recycle all these components
+ componentWillUnmount() {
+ for (let i = this.animations.length - 1; i >= 0; i--) {
+ this.animations[i].reset();
+ }
+ }
+}
+
+module.exports = Sleep;
diff --git a/client/src/utils.jsx b/client/src/utils.jsx
index 698ad096..0e3b4d2d 100644
--- a/client/src/utils.jsx
+++ b/client/src/utils.jsx
@@ -334,6 +334,8 @@ const removeTier = skill => {
if (skill.includes('SiphonTick')) return 'SiphonTick';
if (skill.includes('TriageTick')) return 'TriageTick';
+ if (skill.includes('DecayTick')) return 'DecayTick';
+ if (skill.includes('ElectrocuteTick')) return 'ElectrocuteTick';
if (skill.includes('Strike')) return 'Strike';
if (skill.includes('Heal')) return 'Heal';
@@ -359,6 +361,7 @@ const removeTier = skill => {
if (skill.includes('Parry')) return 'Parry';
if (skill.includes('Purify')) return 'Purify';
if (skill.includes('Electrify')) return 'Electrify';
+ if (skill.includes('Electrocute')) return 'Electrocute';
if (skill.includes('Clutch')) return 'Clutch';
if (skill.includes('Reflect')) return 'Reflect';
if (skill.includes('Recharge')) return 'Recharge';