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;