diff --git a/client/assets/styles/game.css b/client/assets/styles/game.css index 65f975f4..7f1e4d97 100644 --- a/client/assets/styles/game.css +++ b/client/assets/styles/game.css @@ -29,7 +29,11 @@ } .opponent .combat-text { - top: 40%; + top: 75%; +} + +.opponent .combat-anim { + top: 25%; } .opponent .game-construct { @@ -199,7 +203,6 @@ } .combat-text { - fill: whitesmoke; font-size: 2em; font-family: 'Jura'; position: absolute; @@ -211,6 +214,18 @@ height: 7em; } +.combat-anim { + font-size: 2em; + font-family: 'Jura'; + position: absolute; + object-fit: contain; + top: 15%; +} + +.combat-anim svg { + height: 7em; +} + .game-construct.active-skill { filter: drop-shadow(0 0 0.2em silver); } diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx index c7f82e94..8f314687 100644 --- a/client/src/components/animations.jsx +++ b/client/src/components/animations.jsx @@ -8,7 +8,9 @@ const Strike = require('./anims/strike'); const Chaos = require('./anims/chaos'); const Slay = require('./anims/slay'); const Siphon = require('./anims/siphon'); -const Test = require('./anims/test'); +const SiphonTick = require('./anims/siphon.tick'); + +// const Test = require('./anims/test'); const { removeTier } = require('../utils'); @@ -41,7 +43,7 @@ function animations(props) { // Block Base // Buff Base // Debuff Base - default: return text; + default: return false; } } else if (stage === 'END_SKILL') { const skill = removeTier(text); @@ -53,24 +55,37 @@ function animations(props) { case 'Slay': return ; case 'Heal': return ; case 'Siphon': return ; - default: return text; + case 'SiphonTick': return ; + default: return false; } } - return text; + return false; }; if (combatText) { const combatAnim = anim(combatText); - return
- {combatAnim} -
; + if (combatAnim) { + return ( +
+ {combatAnim} +
+ ); + } + return ( +
+ {combatText} +
+ ); } -/* return ( + + /* + return (
); -*/ + */ + return (
 
); } diff --git a/client/src/components/anims/chaos.jsx b/client/src/components/anims/chaos.jsx index ae5db9e7..4045d4fe 100644 --- a/client/src/components/anims/chaos.jsx +++ b/client/src/components/anims/chaos.jsx @@ -89,7 +89,7 @@ class AttackCharge extends Component { translateY: 0, translateX: 0, loop: false, - duration: (duration * 2 / 3), + duration: (duration * 1 / 2), easing: 'easeInQuad', }); anime({ diff --git a/client/src/components/anims/siphon.tick.jsx b/client/src/components/anims/siphon.tick.jsx new file mode 100644 index 00000000..8361c5c9 --- /dev/null +++ b/client/src/components/anims/siphon.tick.jsx @@ -0,0 +1,110 @@ +const preact = require('preact'); +const { Component } = require('preact'); +const anime = require('animejs').default; + +const { TIMES } = require('../../constants'); + +const duration = TIMES.START_SKILL; + + +function projectile(x, y, radius, colour) { + return ( + + ); +} + +class SiphonTick extends Component { + constructor(props) { + super(); + this.team = props.team; + // this.colour = props.colour; + this.colour = '#3498db'; + const points = new Array(15).fill(0); + this.charges = points.map(() => projectile(150, 150, 7, '#1FF01F')); + } + + render() { + return ( + + + + + + + + + + + + + + + + + + + {this.charges} + + ); + } + + componentDidMount() { + if (!this.props.team) { + anime.set('.skill-anim', { + rotate: Math.random() * 180 + 90, + }); + } else { + anime.set('.skill-anim', { + rotate: Math.random() * 180 + 270, + }); + } + + anime.set('#projectile', { + cx: 150, + cy: 150, + }); + + anime.set('#siphon', { + r: '80', + stroke: '#3498db', + }); + + anime({ + targets: '#siphon', + keyframes: [ + { r: '50', stroke: '#3498db' }, + { r: '20', stroke: '#3498db' }, + { r: '0', stroke: '#3498db' }, + ], + duration: duration * 2 / 3, + easing: 'easeInCubic', + }); + + const projectiles = document.querySelectorAll('#projectile'); + projectiles.forEach(proj => { + anime({ + targets: proj, + cx: Math.random() * 250 + 25, + cy: Math.random() * 200 - 100, + delay: (Math.random() * duration * 1 / 2), + duration, + easing: 'easeInQuad', + }); + }); + } +} + +module.exports = SiphonTick; diff --git a/client/src/components/anims/test.jsx b/client/src/components/anims/test.jsx index fe8fb5b2..aa48423e 100644 --- a/client/src/components/anims/test.jsx +++ b/client/src/components/anims/test.jsx @@ -15,27 +15,21 @@ function projectile(x, y, radius, colour) { cy={y} r={radius} fill="url(#grad1)" - stroke-width="2" + stroke-width="0.1" stroke={colour} id="projectile" /> ); } -function arc() { - return ( - - ); -} - class AttackCharge extends Component { constructor(props) { super(); this.team = props.team; // this.colour = props.colour; - this.colour = '#c5a443'; - const points = new Array(30).fill(0); - this.charges = points.map(() => projectile(150, 420, 7, '#1FF01F')); + this.colour = '#3498db'; + const points = new Array(15).fill(0); + this.charges = points.map(() => projectile(150, 150, 7, '#1FF01F')); } render() { @@ -49,78 +43,69 @@ class AttackCharge extends Component { - {arc()} + + + + + + + + + + + + + + {this.charges} ); } componentDidMount() { -/* if (!this.props.team) { + if (!this.props.team) { anime.set('.skill-anim', { - rotate: Math.random() * 180 + 90, + rotate: Math.random() * 45 + 90, }); } else { anime.set('.skill-anim', { - rotate: Math.random() * 180 + 270, + rotate: Math.random() * 45 + 270, }); } - anime.set('.skill-anim', { - translateY: -400, - translateX: 0, + + anime.set('#projectile', { + cx: 150, + cy: 150, }); - anime.set('#explosion feDisplacementMap', { - scale: 100, + + anime.set('#siphon', { + r: '80', + stroke: '#3498db', }); anime({ - targets: '.skill-anim', - translateY: 0, - translateX: 0, - loop: false, - duration: (duration * 1 / 2), - easing: 'easeInQuad', - }); - anime({ - targets: '#explosion feDisplacementMap', - scale: 10000, - loop: false, - delay: (duration * 1 / 2), - duration: (duration * 1 / 2), - easing: 'easeInQuad', - }); - - anime({ - targets: '#sword', - fill: '#1FF01F', - stroke: '#1FF01F', - delay: (duration * 3 / 4), + targets: '#siphon', + keyframes: [ + { r: '50', stroke: '#3498db' }, + { r: '20', stroke: '#3498db' }, + { r: '0', stroke: '#3498db' }, + ], + duration: duration * 2 / 3, + easing: 'easeInCubic', }); + const projectiles = document.querySelectorAll('#projectile'); projectiles.forEach(proj => { anime({ targets: proj, cx: Math.random() * 250 + 25, cy: Math.random() * 200 - 100, - delay: (duration * 1 / 3), - duration: (duration * 2 / 3), + delay: (Math.random() * duration * 1 / 2), + duration, easing: 'easeInQuad', }); }); -*/ - const siphon = document.querySelectorAll('#siphon'); - anime({ - targets: siphon, - keyframes: [ - { r: '110', stroke: '#1FF01F' }, - { r: '80', stroke: '#1FF01F' }, - { r: '50', stroke: '#3498db' }, - { r: '20', stroke: '#3498db' }, - ], - duration, - easing: 'easeInCubic', - loop: true, - }); + } }