From 0aed7cfe73b0a1e4d756ea3bb4b176bd84d01c1c Mon Sep 17 00:00:00 2001 From: ntr Date: Wed, 23 Oct 2019 13:01:53 +1100 Subject: [PATCH 1/3] remove old scoreboard and fadein faceoff text --- client/assets/styles/colours.less | 9 + client/assets/styles/instance.less | 32 +++- client/src/components/faceoff.jsx | 23 +-- client/src/components/instance.component.jsx | 4 +- client/src/components/scoreboard.jsx | 52 ------ client/src/components/vertical.thresholds.js | 172 ------------------- 6 files changed, 48 insertions(+), 244 deletions(-) delete mode 100644 client/src/components/scoreboard.jsx delete mode 100644 client/src/components/vertical.thresholds.js diff --git a/client/assets/styles/colours.less b/client/assets/styles/colours.less index b6362c6b..79088b7c 100644 --- a/client/assets/styles/colours.less +++ b/client/assets/styles/colours.less @@ -131,6 +131,15 @@ svg { } } +@keyframes co-text { + from { + color: @black; + } + to { + color: @gray-exists; + } +} + button { &.blue { border-color: @blue; diff --git a/client/assets/styles/instance.less b/client/assets/styles/instance.less index 44857870..9990b400 100644 --- a/client/assets/styles/instance.less +++ b/client/assets/styles/instance.less @@ -438,9 +438,35 @@ .faceoff-text { grid-area: text; - text-align: center; - align-self: center; - height: auto; + font-size: 200%; + text-transform: uppercase; + letter-spacing: 1em; + + color: @black; + animation: faceoff 4s linear 0s 2 alternate; + + &.winner { + color: @yellow; + animation: win 2s linear 0s 1; + } +} + +@keyframes faceoff { + from { + color: @black; + } + to { + color: @white; + } +} + +@keyframes win { + from { + color: @black; + } + to { + color: @yellow; + } } /* Mobile Nav*/ diff --git a/client/src/components/faceoff.jsx b/client/src/components/faceoff.jsx index c589a60c..d6a068fd 100644 --- a/client/src/components/faceoff.jsx +++ b/client/src/components/faceoff.jsx @@ -81,26 +81,19 @@ function Faceoff(props) { } function faceoffText() { if (!instance.winner) { - const zero = Date.parse(instance.phase_start); - const now = Date.now(); - const end = Date.parse(instance.phase_end); - const timerPct = instance.phase_end - ? ((now - zero) / (end - zero) * 100) - : 100; - const fight = timerPct > 10 ?

FIGHT

: null; return ( -
-

{otherTeam.name}

-

vs

-

{playerTeam.name}

- {fight} +
+
{otherTeam.name}
+
vs
+
{playerTeam.name}
); } - const winner = instance.winner === playerTeam.id ? playerTeam.name : otherTeam.name; + const winner = instance.winner === playerTeam.id ? playerTeam : otherTeam; return ( -
-

{winner} wins

+
+
{winner.name}
+
win
) diff --git a/client/src/components/instance.component.jsx b/client/src/components/instance.component.jsx index 3d935752..44df54e7 100644 --- a/client/src/components/instance.component.jsx +++ b/client/src/components/instance.component.jsx @@ -62,9 +62,9 @@ class Instance extends Component { if (!instance) return false; - if (instance.phase !== 'InProgress') { + // if (instance.phase !== 'InProgress') { return ; - } + // } function instanceClick(e) { e.stopPropagation(); diff --git a/client/src/components/scoreboard.jsx b/client/src/components/scoreboard.jsx deleted file mode 100644 index ee2e9e1d..00000000 --- a/client/src/components/scoreboard.jsx +++ /dev/null @@ -1,52 +0,0 @@ -const preact = require('preact'); -const { connect } = require('preact-redux'); - -const addState = connect( - function receiveState(state) { - const { - ws, - instance - } = state; - - return { instance }; - }, -); - -function ScoreBoard(args) { - const { - instance, - } = args; - - const players = instance.players.map((p, i) => { - if (instance.phase === 'Finished') { - const winner = p.wins > instance.max_rounds / 2; - return - {p.name} - {p.wins} / {p.losses} - {winner ? 'winner' : ''} - - } - - const text = instance.phase === 'Finished' - ? p.wins > instance.rounds / 2 && 'Winner' - : ''; - - return - {p.name} - {p.wins} / {p.losses} - {p.ready ? 'ready' : ''} - - }); - - return ( - - - {players} - -
- ); -} - -module.exports = addState(ScoreBoard); diff --git a/client/src/components/vertical.thresholds.js b/client/src/components/vertical.thresholds.js deleted file mode 100644 index ab079170..00000000 --- a/client/src/components/vertical.thresholds.js +++ /dev/null @@ -1,172 +0,0 @@ -const preact = require('preact'); -const range = require('lodash/range'); - -const { INFO } = require('./../constants'); -const { convertItem } = require('../utils'); -const shapes = require('./shapes'); - -const ScoreBoard = require('./scoreboard'); - -function InfoComponent(args) { - const { - itemInfo, - combiner, - player, - instance, - } = args; - - args.info = 'PowerRG'; - const { info } = args; - - function Info() { - if (!info) return false; - const fullInfo = itemInfo.items.find(i => i.item === info) || INFO[info]; - if (!fullInfo) return false; - const isSkill = fullInfo.skill; - const isSpec = fullInfo.spec; - - if (isSkill) { - return ( -
-

{fullInfo.item}

-
{fullInfo.description}
-
- ); - } - - if (isSpec) { - let red = 0; - let blue = 0; - let green = 0; - player.constructs.forEach(construct => { - red += construct.colours.red; - blue += construct.colours.blue; - green += construct.colours.green; - }); - const teamColours = { red, blue, green }; - - const colourReqs = fullInfo.values.bonuses || []; - - const thresholds = colourReqs.map((bonus, i) => { - const colours = ['red', 'green', 'blue']; - const colourGoals = colours.map(c => { - const colourReq = bonus.req[c]; - if (colourReqs === 0) return false; - - const start = i === 0 - ? 0 - : colourReqs[i - 1].req[c]; - - const dots = range(start, colourReq).map(j => { - const unmet = teamColours[c] < j + 1; - - const reqClass = unmet - ? 'unmet' - : ''; - - return ( -
- {shapes.square([c])} -
- ); - }); - - return ( -
- {dots} -
- ); - }); - - const reqsMet = colours.every(c => teamColours[c] >= bonus.req[c]); - - const reqClass = reqsMet - ? '' - : 'unmet'; - - return ( -
-
- {colourGoals} -
-
- + {bonus.bonus} -
-
-
- ); - }); - - return ( -
-

{info}

-
{fullInfo.description}
-
- {thresholds} -
-
- ); - } - - return ( -
-

{fullInfo.item}

-
{fullInfo.description}
-
- ); - } - - function Combos() { - if (!player) return false; - - // show recipe for what's in combiner - if (combiner.some(u => u !== null)) { - const filteredCombos = itemInfo.combos - .filter(combo => combiner.every(u => u === null - || combo.components.includes(player.vbox.bound[u]))); - if (filteredCombos.length > 6) return false; - return ( - - - {filteredCombos.map((c, i) => - - - {c.components.map((u, j) => )} - - )} - -
{convertItem(c.item)}{convertItem(u)}
- ); - } - - if (!info) return false; - const vboxCombos = itemInfo.combos.filter(c => c.components.includes(info)); - if (vboxCombos.length > 6) return false; - return ( - - - {vboxCombos.map((c, i) => - - - {c.components.map((u, j) => )} - - )} - -
{convertItem(c.item)}{convertItem(u)}
- ); - } - - const scoreboard = instance.phase === 'Lobby' || info - ? null - : ; - - return ( -
- {scoreboard} - - -
- ); -} - -module.exports = InfoComponent; From 9b1cb34e7b89c0fdd1f659dc67f9b8cfe9d971b4 Mon Sep 17 00:00:00 2001 From: ntr Date: Wed, 23 Oct 2019 13:09:56 +1100 Subject: [PATCH 2/3] bold winner text --- client/assets/styles/instance.less | 13 ++++--------- client/assets/styles/player.less | 5 +++++ client/src/components/faceoff.jsx | 6 ++++-- client/src/components/player.box.jsx | 6 ++++-- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/client/assets/styles/instance.less b/client/assets/styles/instance.less index 9990b400..62f4c760 100644 --- a/client/assets/styles/instance.less +++ b/client/assets/styles/instance.less @@ -419,14 +419,9 @@ margin-top: 1em; } - .opponent-name { - margin-bottom: 1em; - grid-area: oppname; - } - - .player-name { - margin-top: 1em; - grid-area: playername; + .winner { + color: @yellow; + font-weight: bold; } .team { @@ -441,12 +436,12 @@ font-size: 200%; text-transform: uppercase; letter-spacing: 1em; + font-weight: bold; color: @black; animation: faceoff 4s linear 0s 2 alternate; &.winner { - color: @yellow; animation: win 2s linear 0s 1; } } diff --git a/client/assets/styles/player.less b/client/assets/styles/player.less index 6bcf804b..616ba46f 100644 --- a/client/assets/styles/player.less +++ b/client/assets/styles/player.less @@ -46,6 +46,11 @@ grid-area: msg; color: @white; } + + &.winner { + color: @yellow; + font-weight: bold; + } } .chat { diff --git a/client/src/components/faceoff.jsx b/client/src/components/faceoff.jsx index d6a068fd..723c985b 100644 --- a/client/src/components/faceoff.jsx +++ b/client/src/components/faceoff.jsx @@ -58,7 +58,8 @@ function Faceoff(props) { const constructs = team.constructs.map((c, i) => ); - const classes = `team player ${team.ready ? 'ready' : ''}` + const winner = instance.winner === team.id; + const classes = `team player ${winner ? 'winner' : team.ready ? 'ready' : ''}` return (
{constructs} @@ -71,7 +72,8 @@ function Faceoff(props) { const constructs = team.constructs.map((c, i) => ); - const classes = `team opponent ${team.ready ? 'ready' : ''}` + const winner = instance.winner === team.id; + const classes = `team opponent ${winner ? 'winner' : team.ready ? 'ready' : ''}` return (
diff --git a/client/src/components/player.box.jsx b/client/src/components/player.box.jsx index ec0527e5..29ee6532 100644 --- a/client/src/components/player.box.jsx +++ b/client/src/components/player.box.jsx @@ -67,9 +67,11 @@ function Scoreboard(args) { return ''; }; + const winner = player.score === 'Win'; + if (!isPlayer) { return ( -
+
{scoreText()}
{player.name}
@@ -80,7 +82,7 @@ function Scoreboard(args) { } return ( -
+
{chat || '\u00A0'}
{scoreText()}
{player.name}
From 06b987e87785fd56173e9698ad0233daf9c26bbd Mon Sep 17 00:00:00 2001 From: ntr Date: Wed, 23 Oct 2019 16:11:04 +1100 Subject: [PATCH 3/3] big play rework --- client/assets/assets/molecules/726.svg | 1 - client/assets/mnni.svg | 2557 ++++++++++++++++++ client/assets/styles/controls.less | 31 - client/assets/styles/instance.less | 4 +- client/assets/styles/menu.less | 34 +- client/assets/styles/styles.less | 6 +- client/src/components/faceoff.jsx | 2 +- client/src/components/instance.component.jsx | 6 +- client/src/components/instance.ctrl.jsx | 4 +- client/src/components/mnni.jsx | 63 + client/src/components/play.ctrl.jsx | 145 +- client/src/components/play.jsx | 165 +- client/src/components/shop.jsx | 2 +- client/src/socket.jsx | 2 +- 14 files changed, 2817 insertions(+), 205 deletions(-) delete mode 100644 client/assets/assets/molecules/726.svg create mode 100644 client/assets/mnni.svg create mode 100644 client/src/components/mnni.jsx diff --git a/client/assets/assets/molecules/726.svg b/client/assets/assets/molecules/726.svg deleted file mode 100644 index 3d18b0c0..00000000 --- a/client/assets/assets/molecules/726.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/assets/mnni.svg b/client/assets/mnni.svg new file mode 100644 index 00000000..3b4b744b --- /dev/null +++ b/client/assets/mnni.svg @@ -0,0 +1,2557 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/client/assets/styles/controls.less b/client/assets/styles/controls.less index c154e044..b465938d 100644 --- a/client/assets/styles/controls.less +++ b/client/assets/styles/controls.less @@ -50,31 +50,6 @@ aside { } } - // button.ready:enabled { - // &:hover { - // color: forestgreen; - // border-color: forestgreen; - // } - - // &:active, &:focus, &.enabled { - // background: forestgreen; - // color: black; - // border-color: forestgreen; - // } - // } - - button.ready:enabled { - color: forestgreen; - border-color: forestgreen; - - &:hover { - background: forestgreen; - color: black; - border-color: forestgreen; - } - } - - .timer-container { grid-area: timer; @@ -144,12 +119,6 @@ aside { } } -.play-ctrl { - .controls { - grid-template-rows: 1fr 1fr 1fr 3fr 1fr; - } -} - .abandon:not([disabled]) { &:hover { color: @red; diff --git a/client/assets/styles/instance.less b/client/assets/styles/instance.less index 62f4c760..461f8eb0 100644 --- a/client/assets/styles/instance.less +++ b/client/assets/styles/instance.less @@ -439,10 +439,10 @@ font-weight: bold; color: @black; - animation: faceoff 4s linear 0s 2 alternate; + animation: faceoff 4s ease-in-out 0s 2 alternate; &.winner { - animation: win 2s linear 0s 1; + animation: win 2s ease-in-out 0s 1; } } diff --git a/client/assets/styles/menu.less b/client/assets/styles/menu.less index cbe04a86..0fbb7f90 100644 --- a/client/assets/styles/menu.less +++ b/client/assets/styles/menu.less @@ -109,13 +109,40 @@ section { letter-spacing: 0.25em; text-transform: uppercase; display: grid; - grid-template-columns: repeat(4, 1fr); + // grid-template-columns: repeat(4, 1fr); + grid-template-columns: 1fr 1fr; grid-gap: 1em; flex-flow: row wrap; align-items: flex-end; button { border-radius: 0.25em; + // height: 3em; } + + &.play { + grid-template-columns: repeat(2, 1fr); + align-items: flex-start; + + &.rejoin { + grid-template-columns: 1fr; + } + + button.ready:enabled { + color: forestgreen; + border-color: forestgreen; + + &:hover { + background: forestgreen; + color: black; + border-color: forestgreen; + } + } + } + } + + .panes { + display: grid; + grid-template-columns: repeat(2, 1fr); } figure { @@ -189,7 +216,12 @@ section { .list { grid-template-columns: 1fr 1fr; + + &.play { + grid-template-columns: 1fr; + } } + } .menu .team { diff --git a/client/assets/styles/styles.less b/client/assets/styles/styles.less index 2d3af757..e8188302 100644 --- a/client/assets/styles/styles.less +++ b/client/assets/styles/styles.less @@ -281,7 +281,7 @@ ul { } li { - margin-bottom: 0.5em; + margin-bottom: 0; } .logo { @@ -299,6 +299,10 @@ li { background-position: center; } +.mnni { + background-image: url("./../mnni.svg"); +} + .avatar { grid-area: avatar; object-fit: contain; diff --git a/client/src/components/faceoff.jsx b/client/src/components/faceoff.jsx index 723c985b..251f10e6 100644 --- a/client/src/components/faceoff.jsx +++ b/client/src/components/faceoff.jsx @@ -95,7 +95,7 @@ function Faceoff(props) { return (
{winner.name}
-
win
+
wins
) diff --git a/client/src/components/instance.component.jsx b/client/src/components/instance.component.jsx index 44df54e7..abd2e9da 100644 --- a/client/src/components/instance.component.jsx +++ b/client/src/components/instance.component.jsx @@ -62,9 +62,9 @@ class Instance extends Component { if (!instance) return false; - // if (instance.phase !== 'InProgress') { + if (instance.phase !== 'InProgress') { return ; - // } + } function instanceClick(e) { e.stopPropagation(); @@ -95,7 +95,6 @@ class Instance extends Component { bindSwipes() { const instance = document.getElementById('instance'); if (!instance) { - console.log('no instance, binding in 50'); return setTimeout(this.bindSwipes, 50); } if (this.h) this.h.destroy(); @@ -116,7 +115,6 @@ class Instance extends Component { setNavInstance((navInstance + 1) % 4); }); - console.log('hammer gestures bound'); return true; } } diff --git a/client/src/components/instance.ctrl.jsx b/client/src/components/instance.ctrl.jsx index b025d239..6ec4bdaf 100644 --- a/client/src/components/instance.ctrl.jsx +++ b/client/src/components/instance.ctrl.jsx @@ -43,11 +43,11 @@ function Controls(args) { const zero = Date.parse(instance.phase_start); const now = Date.now(); const end = Date.parse(instance.phase_end); - const timerPct = instance.phase_end + const timerPct = instance.phase !== 'Finished' && instance.phase_end ? ((now - zero) / (end - zero) * 100) : 100; - const displayColour = !instance.phase_end + const displayColour = !instance.phase_end || instance.phase === 'Finished' ? '#222' : player.ready ? 'forestgreen' diff --git a/client/src/components/mnni.jsx b/client/src/components/mnni.jsx new file mode 100644 index 00000000..f1506dfc --- /dev/null +++ b/client/src/components/mnni.jsx @@ -0,0 +1,63 @@ +const { Component } = require('preact'); +const preact = require('preact'); +// const { connect } = require('preact-redux'); + +const idleAnimation = require('./anims/idle'); +const wiggle = require('./anims/wiggle'); + +class MnniAvatatr extends Component { + constructor() { + super(); + // The animation ids are a check to ensure that animations are not repeated + // When a new account animation is communicated with state it will have a corresponding Id + // which is a count of how many resoluttions have passed + this.animations = []; + this.resetAnimations = this.resetAnimations.bind(this); + } + + render() { + const { account, mtxActive } = this.props; + return ( +
+
+ ); + } + + onClick() { + if (this.props.mtxActive) { + return this.props.sendMtxAccountApply(); + } + return this.animations.push(wiggle('mnni', this.idle)); + } + + componentDidMount() { + this.idle = idleAnimation('mnni'); + return this.animations.push(this.idle); + } + + resetAnimations() { + for (let i = this.animations.length - 1; i >= 0; i--) { + this.animations[i].reset(); + } + } + + componentWillUnmount() { + this.resetAnimations(); + } +} + +function Mnni(args) { + return ( +
+ +
hi!
+
MNNI
+
 
+
+ ); +} + +module.exports = Mnni; diff --git a/client/src/components/play.ctrl.jsx b/client/src/components/play.ctrl.jsx index 8bdeab21..39f11fc0 100644 --- a/client/src/components/play.ctrl.jsx +++ b/client/src/components/play.ctrl.jsx @@ -1,155 +1,26 @@ const preact = require('preact'); -const { connect } = require('preact-redux'); - -const { errorToast, infoToast } = require('../utils'); +// const { connect } = require('preact-redux'); const AccountBox = require('./account.box'); - -const addState = connect( - function receiveState(state) { - const { - ws, - instances, - invite, - } = state; - - function sendInstanceState(id) { - ws.sendInstanceState(id); - } - - function sendInstancePractice() { - ws.sendInstancePractice(); - } - - function sendInstanceQueue() { - ws.sendInstanceQueue(); - } - - function sendInstanceInvite() { - ws.sendInstanceInvite(); - } - - return { - instances, - invite, - - sendInstanceState, - sendInstanceQueue, - sendInstancePractice, - sendInstanceInvite, - }; - } -); +const Mnni = require('./mnni'); function JoinButtons(args) { - const { - instances, - invite, - - sendInstanceState, - sendInstanceQueue, - sendInstancePractice, - sendInstanceInvite, - } = args; - - const discordBtn = ( - - ); - - if (instances.length) { - return ( - - ); - } - - const inviteBtn = () => { - if (!invite) { - return ( - - ); - } - - function copyClick(e) { - const link = `${document.location.origin}#join=${invite}`; - const textArea = document.createElement('textarea', { id: '#clipboard' }); - textArea.value = link; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - - try { - document.execCommand('copy'); - infoToast('Invite link copied to clipboard.'); - } catch (err) { - console.error('link copy error', err); - errorToast('Invite link copy error.'); - } - - document.body.removeChild(textArea); - return true; - } - - return ( - - ); - }; - return ( ); } -module.exports = addState(JoinButtons); +module.exports = JoinButtons; diff --git a/client/src/components/play.jsx b/client/src/components/play.jsx index 6d846016..dc7a1720 100644 --- a/client/src/components/play.jsx +++ b/client/src/components/play.jsx @@ -2,6 +2,7 @@ const preact = require('preact'); const { connect } = require('preact-redux'); +const { errorToast, infoToast } = require('../utils'); const actions = require('./../actions'); const VERSION = process.env.npm_package_version; @@ -11,10 +12,35 @@ const addState = connect( const { ws, account, + instances, + invite, } = state; + function sendInstanceState(id) { + ws.sendInstanceState(id); + } + + function sendInstancePractice() { + ws.sendInstancePractice(); + } + + function sendInstanceQueue() { + ws.sendInstanceQueue(); + } + + function sendInstanceInvite() { + ws.sendInstanceInvite(); + } + return { account, + instances, + invite, + + sendInstanceState, + sendInstanceQueue, + sendInstancePractice, + sendInstanceInvite, }; }, @@ -36,13 +62,69 @@ const addState = connect( } ); - function Play(args) { const { account, + instances, + invite, + + sendInstanceState, + sendInstanceQueue, + sendInstancePractice, + sendInstanceInvite, + setNav, } = args; - + + const inviteBtn = () => { + if (!invite) { + return ( +
+ +
Invite a Friend
+
+ + ); + } + + function copyClick(e) { + const link = `${document.location.origin}#join=${invite}`; + const textArea = document.createElement('textarea', { id: '#clipboard' }); + textArea.value = link; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + document.execCommand('copy'); + infoToast('Invite link copied to clipboard.'); + } catch (err) { + console.error('link copy error', err); + errorToast('Invite link copy error.'); + } + + document.body.removeChild(textArea); + return true; + } + + return ( +
+ +
Invite Generated
+
+ ); + }; + const subscription = account.subscribed ? +
Matchmaking
+ + {inviteBtn()} +
+ +
Practice MNML
+
+
+ +
Join the Community
+
+
+ ); + + return ( +
+
+ +
Resume playing
+
+
+ ); + } + return (
-

v{VERSION}

-

- Join our discord server to find opponents and talk to the devs.
- Message @ntr or @mashy on discord. Invite link on the right control panel.
- We will also give you some credits to try the mtx.
-

-

- If you enjoy the game you can support the development: -

    -
  • Invite people to play pvp games and grow the community.
  • -
  • Subscribe or purchase credits.
  • -
- glhf -

+

v{VERSION}

+ {list()}

¤ {account.balance}

@@ -84,15 +199,19 @@ function Play(args) { role="link"> Get Credits -
+
+
+ Join our Discord server to find opponents and talk to the devs.
+ Message @ntr or @mashy for some credits to get started.

-

- Click LEARN to practice the game without time controls.
- Select INVITE then click COPY LINK to create a game invitation for a friend.
- Select PVP to queue for a game against other players.
-

-

If you can't find a match through pvp queue, ask around on discord.

+
+ If you enjoy the game you can support the development: +
    +
  • Invite people to play pvp games and grow the community.
  • +
  • Subscribe or purchase credits.
  • +
+
); diff --git a/client/src/components/shop.jsx b/client/src/components/shop.jsx index 16883b22..08a79fad 100644 --- a/client/src/components/shop.jsx +++ b/client/src/components/shop.jsx @@ -41,7 +41,7 @@ function Shop(args) { Subscriptions grant extra benefits:
  • ¤150 per month
  • -
  • Account icons
  • +
  • Account img
  • Chat wheel

diff --git a/client/src/socket.jsx b/client/src/socket.jsx index 5fed2f29..adad1a66 100644 --- a/client/src/socket.jsx +++ b/client/src/socket.jsx @@ -259,7 +259,7 @@ function createSocket(events) { QueueRequested: () => events.notify('pvp queue request received'), QueueJoined: () => events.notify('you have joined the pvp queue'), - InviteRequested: () => events.notify('pvp queue request received'), + InviteRequested: () => events.notify('pvp invite request received'), Invite: code => events.setInvite(code), InstanceChat: chat => events.setInstanceChat(chat), ChatWheel: wheel => events.setChatWheel(wheel),