diff --git a/client/src/components/anims/electrify.jsx b/client/src/components/anims/electrify.jsx
index 18c676ee..37ac198d 100644
--- a/client/src/components/anims/electrify.jsx
+++ b/client/src/components/anims/electrify.jsx
@@ -22,7 +22,7 @@ class Electrify extends Component {
version="1.1"
id="electrify"
xmlns="http://www.w3.org/2000/svg"
- viewBox="0 0 128 128">
+ viewBox="0 0 500 500">
@@ -34,13 +34,15 @@ class Electrify extends Component {
);
@@ -56,24 +58,30 @@ class Electrify extends Component {
easing: 'easeInOutSine',
}));
- const path = () => `M10,64
- L10,${anime.random(34, 94)}
- L20,${anime.random(34, 94)}
- L30,${anime.random(34, 94)}
- L40,${anime.random(34, 94)}
- L50,${anime.random(34, 94)}
- L60,${anime.random(34, 94)}
- L70,${anime.random(34, 94)}
- L80,${anime.random(34, 94)}
- L90,${anime.random(34, 94)}
- L100,${anime.random(34, 94)}
- L110,64
- `;
+ const path = () => {
+ const startX = anime.random(420, 440);
+ const startY = anime.random(180, 200);
+ return `
+ M ${startX},${startY}
+ L ${anime.random(387, 407)},${anime.random(300, 320)}
+ L ${anime.random(300, 320)},${anime.random(387, 407)}
+ L ${anime.random(180, 200)},${anime.random(420, 440)}
+ L ${anime.random(60, 80)},${anime.random(387, 407)}
+ L ${anime.random(-27, 7)},${anime.random(300, 320)}
+ L ${anime.random(-20, -40)},${anime.random(180, 200)}
+ L ${anime.random(-27, 7)},${anime.random(60, 80)}
+ L ${anime.random(60, 80)},${anime.random(-27, 7)}
+ L ${anime.random(180, 200)},${anime.random(-20, -40)}
+ L ${anime.random(300, 320)},${anime.random(-27, 7)}
+ L ${anime.random(387, 407)},${anime.random(60, 80)}
+ L ${startX},${startY}
+ `;
+ };
this.animations.push(anime({
targets: ['#electrify path'],
d: times(10, path),
- easing: 'easeOutExpo',
+ easing: 'easeInOutSine',
loop: true,
duration: TIMES.TARGET_MAIN_DURATION / 5,
}));
diff --git a/client/src/components/anims/electrocute.jsx b/client/src/components/anims/electrocute.jsx
new file mode 100644
index 00000000..4bf24bd8
--- /dev/null
+++ b/client/src/components/anims/electrocute.jsx
@@ -0,0 +1,102 @@
+const preact = require('preact');
+const { Component } = require('preact');
+const times = require('lodash/times')
+
+const anime = require('animejs').default;
+
+const { TIMES } = require('../../constants');
+
+// shamelessly lifted from teh anime docs
+// https://animejs.com/documentation/#svgAttr
+
+class Electrify extends Component {
+ constructor() {
+ super();
+ this.animations = [];
+ }
+
+ render() {
+ return (
+
+ );
+ }
+
+ componentDidMount() {
+ this.animations.push(anime({
+ targets: ['#electrify'],
+ 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',
+ }));
+
+ const path = () => `M10,64
+ L10,${anime.random(34, 94)}
+ L20,${anime.random(34, 94)}
+ L30,${anime.random(34, 94)}
+ L40,${anime.random(34, 94)}
+ L50,${anime.random(34, 94)}
+ L60,${anime.random(34, 94)}
+ L70,${anime.random(34, 94)}
+ L80,${anime.random(34, 94)}
+ L90,${anime.random(34, 94)}
+ L100,${anime.random(34, 94)}
+ L110,64
+ `;
+
+ this.animations.push(anime({
+ targets: ['#electrify path'],
+ d: times(10, path),
+ easing: 'easeInOutSine',
+ loop: true,
+ duration: TIMES.TARGET_MAIN_DURATION / 5,
+ }));
+
+ this.animations.push(anime({
+ targets: ['#electrify path.white'],
+ strokeWidth: [2, 1],
+ easing: 'easeInOutSine',
+ direction: 'alternate',
+ loop: true,
+ duration: TIMES.TARGET_MAIN_DURATION,
+ }));
+ }
+
+ // 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 = Electrify;