diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx index daa4f837..4bbb2bb4 100644 --- a/client/src/components/animations.jsx +++ b/client/src/components/animations.jsx @@ -18,6 +18,7 @@ const Stun = require('./anims/stun'); const Heal = require('./anims/heal'); const Hex = require('./anims/hex'); const Strike = require('./anims/strike'); +const Parry = require('./anims/parry'); const Chaos = require('./anims/chaos'); const invert = require('./anims/invert'); const Slay = require('./anims/slay'); @@ -112,6 +113,7 @@ function animations(props) { case 'Heal': return ; case 'Hex': return ; case 'Haste': return ; + case 'Parry': return ; case 'Invert': return invert(construct.id); case 'Siphon': return ; case 'SiphonTick': return ; diff --git a/client/src/components/anims/bash.jsx b/client/src/components/anims/bash.jsx index 80a17bff..f9accc83 100644 --- a/client/src/components/anims/bash.jsx +++ b/client/src/components/anims/bash.jsx @@ -40,8 +40,7 @@ class Bash extends Component { targets: ['#bash'], opacity: [ { value: 1, delay: TIMES.TARGET_FADE_IN_DELAY, duration: TIMES.TARGET_FADE_IN_DURATION }, - // this is badly behaved, nfi why - { value: 0, delay: TIMES.FADE_DELAY_MS / 2, duration: TIMES.FADE_OUT_DURATION }, + { value: 0, delay: TIMES.TARGET_MAIN_DURATION - 500, duration: TIMES.FADE_OUT_DURATION }, ], easing: 'easeInOutSine', })); diff --git a/client/src/components/anims/decay.jsx b/client/src/components/anims/decay.jsx index 0ef79d4d..e4a9166c 100644 --- a/client/src/components/anims/decay.jsx +++ b/client/src/components/anims/decay.jsx @@ -14,7 +14,7 @@ class Decay extends Component { return ( @@ -43,7 +43,7 @@ class Decay extends Component { targets: ['#decay'], opacity: [ { value: 1, delay: TIMES.TARGET_FADE_IN_DELAY, duration: TIMES.TARGET_FADE_IN_DURATION }, - { value: 0, delay: TIMES.TARGET_FADE_OUT_DELAY - TIMES.FADE_DURATION_MS, duration: TIMES.FADE_OUT_DURATION }, + { value: 0, delay: TIMES.TARGET_DURATION_MS - 1000, duration: TIMES.FADE_OUT_DURATION }, ], easing: 'easeInOutSine', })); diff --git a/client/src/components/anims/parry.jsx b/client/src/components/anims/parry.jsx new file mode 100644 index 00000000..1ea1f29e --- /dev/null +++ b/client/src/components/anims/parry.jsx @@ -0,0 +1,83 @@ +const preact = require('preact'); +const { Component } = require('preact'); +const anime = require('animejs').default; + +const { TIMES } = require('../../constants'); + +class Parry extends Component { + constructor() { + super(); + this.animations = []; + } + + render({ team }) { + return ( + + + + + + + + + + ); + } + + componentDidMount() { + this.animations.push(anime({ + targets: ['#parry'], + opacity: [ + { value: 1, delay: TIMES.TARGET_FADE_IN_DELAY, duration: TIMES.TARGET_FADE_IN_DURATION }, + { value: 0, delay: TIMES.TARGET_FADE_OUT_DELAY, duration: TIMES.FADE_OUT_DURATION }, + ], + easing: 'easeInOutSine', + })); + + this.animations.push(anime({ + targets: ['#parry'], + rotateX: 180, + delay: TIMES.TARGET_FADE_IN_DELAY * 3, + duration: TIMES.TARGET_DURATION_MS / 2, + easing: 'easeOutSine', + })); + + this.animations.push(anime({ + targets: ['#parryFilter feTurbulence', ' #parryFilter feDisplacementMap'], + baseFrequency: 2, + scale: 10, + numOctaves: 5, + easing: 'easeOutSine', + + delay: TIMES.TARGET_FADE_IN_DELAY, + duration: TIMES.RESOLUTION_TOTAL_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 = Parry;