diff --git a/client/src/animations.test.jsx b/client/src/animations.test.jsx index e78ccce1..aa33e5c3 100644 --- a/client/src/animations.test.jsx +++ b/client/src/animations.test.jsx @@ -65,19 +65,19 @@ const SKILLS = [ 'Buff', 'Chaos', 'Counter', - // 'CounterAttack', + 'CounterAttack', 'Curse', 'Debuff', 'Decay', 'DecayTick', 'Electrify', 'Electrocute', - // 'ElectrocuteTick', + 'ElectrocuteTick', 'Haste', - // 'HasteStrike', + 'HasteStrike', 'Heal', 'Hybrid', - // 'HybridBlast', + 'HybridBlast', 'Intercept', 'Invert', 'Link', @@ -89,12 +89,12 @@ const SKILLS = [ 'Ruin', 'Silence', 'Siphon', - // 'SiphonTick', + 'SiphonTick', 'Slay', 'Sleep', 'Strike', 'Stun', 'Sustain', 'Triage', - // 'TriageTick', + 'TriageTick', ]; diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx index 485dcacd..1342ec0a 100644 --- a/client/src/components/animations.jsx +++ b/client/src/components/animations.jsx @@ -5,6 +5,7 @@ const { connect } = require('preact-redux'); const Amplify = require('./anims/amplify'); const Attack = require('./anims/attack'); const Absorb = require('./anims/absorb'); +const Absorption = require('./anims/absorption'); const Bash = require('./anims/bash'); const Blast = require('./anims/blast'); const Block = require('./anims/block'); @@ -113,6 +114,7 @@ class ConstructAnimation extends Component { // case 'Banish': return setAvatarAnimation(true, true, resolution.id, construct.id, 'banish', null); case 'Bash': return ; case 'Absorb': return ; + case 'Absorption': return ; case 'Sleep': return ; case 'Break': return ; case 'Ruin': return ; diff --git a/client/src/components/anims/absorption.jsx b/client/src/components/anims/absorption.jsx new file mode 100644 index 00000000..0a023843 --- /dev/null +++ b/client/src/components/anims/absorption.jsx @@ -0,0 +1,80 @@ +const preact = require('preact'); +const { Component } = require('preact'); +const anime = require('animejs').default; + +const { TIMES } = require('../../constants'); + +class Absorb extends Component { + constructor() { + super(); + this.animations = []; + } + + render() { + return ( + + + + + + + + + + + + + + + + ); + } + + componentDidMount() { + this.animations.push(anime({ + targets: ['#absorb'], + opacity: [ + { value: 1, duration: TIMES.TARGET_DURATION_MS * 0.2 }, + { value: 0, delay: TIMES.TARGET_DURATION_MS * 0.6, duration: TIMES.TARGET_DURATION_MS * 0.2 }, + ], + easing: 'easeInOutSine', + })); + + this.animations.push(anime({ + targets: ['#absorb polygon'], + points: '64 68.64 8.574 100 63.446 67.68 64 4 64.554 67.68 119.426 100', + easing: 'easeOutExpo', + duration: TIMES.TARGET_DURATION_MS, + })); + + this.animations.push(anime({ + targets: ['#absorb polygon.white'], + strokeWidth: [2, 1], + easing: 'easeInOutSine', + direction: 'alternate', + duration: TIMES.TARGET_DURATION_MS, + })); + } + + // 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 = Absorb;