diff --git a/multi/index.js b/multi/index.js index 76708a7..91e9f39 100644 --- a/multi/index.js +++ b/multi/index.js @@ -97,28 +97,15 @@ class MultiGame { room.updated = new Date(); var round = room.rounds[room.currentRound]; - - clearTimeout(round.timeoutHandler); - round.timeout = round.timeout - (new Date() - round.timeoutStarted); - if (round.timeout > MultiGame.ROUND_TIMEOUT_DIVIDER * MultiGame.ROUND_TIMEOUT_MINIMUM) { - round.timeout = round.timeout / MultiGame.ROUND_TIMEOUT_DIVIDER; - } else if (round.timeout > MultiGame.ROUND_TIMEOUT_MINIMUM) { - round.timeout = MultiGame.ROUND_TIMEOUT_MINIMUM; - } - round.timeoutStarted = new Date(); - var self = this; - round.timeoutHandler = setTimeout(function () { - self._endRoundTimeout(room, round); - }, round.timeout + MultiGame.ROUND_TIMEOUT_OFFSET); - var member = room.members.get(token); var allResults = this._collectResultsInRound(room, round); - this._broadcastTimeout(room, round); this._broadcastGuess(room, member.userName, guessPosition, distance, score); round.results.set(token, { guessPosition: guessPosition, distance: distance, score: score }); + this._setNewTimeout(room, round); + return allResults; } @@ -139,7 +126,7 @@ class MultiGame { round.timeoutStarted = new Date(); var self = this; round.timeoutHandler = setTimeout(function () { - self._endRoundTimeout(room, round); + self._endRound(room, round); }, round.timeout + MultiGame.ROUND_TIMEOUT_OFFSET); var data = {}; @@ -152,16 +139,35 @@ class MultiGame { }); } - _endRoundTimeout(room, round) { + _setNewTimeout(room, round) { clearTimeout(round.timeoutHandler); + if (room.members.size === round.results.size) { + round.timeout = 0; + round.timeoutStarted = new Date(); + + this._endRound(room, round); + } else { + round.timeout = round.timeout - (new Date() - round.timeoutStarted); + if (round.timeout > MultiGame.ROUND_TIMEOUT_DIVIDER * MultiGame.ROUND_TIMEOUT_MINIMUM) { + round.timeout = round.timeout / MultiGame.ROUND_TIMEOUT_DIVIDER; + } else if (round.timeout > MultiGame.ROUND_TIMEOUT_MINIMUM) { + round.timeout = MultiGame.ROUND_TIMEOUT_MINIMUM; + } + round.timeoutStarted = new Date(); + var self = this; + round.timeoutHandler = setTimeout(function () { + self._endRound(room, round); + }, round.timeout + MultiGame.ROUND_TIMEOUT_OFFSET); + + this._broadcastTimeout(room, round); + } + } + + _endRound(room, round) { var data = { position: round.place.position, allResults: this._collectResultsInRound(room, round) }; var self = this; - room.members.forEach(function (member, token) { - if (round.results.has(token)) { - return; - } - + room.members.forEach(function (member) { self._sendToMember(member, 'end_round', data); }); } diff --git a/public/static/js/game.js b/public/static/js/game.js index 37fc295..43d44f9 100644 --- a/public/static/js/game.js +++ b/public/static/js/game.js @@ -17,6 +17,7 @@ adaptGuess: false, googleLink: null, + readyToContinue: false, timeoutEnd: null, countdownHandler: null, @@ -121,6 +122,7 @@ } if (data.place) { + Game.readyToContinue = false; Game.panoId = data.place.panoId; Game.pov = data.place.pov; @@ -156,6 +158,7 @@ Game.reset(); } + Game.readyToContinue = false; Game.panoId = data.place.panoId; Game.pov = data.place.pov; @@ -180,6 +183,18 @@ }, endRound: function (data) { + Game.readyToContinue = true; + Game.startCountdown(0); + + if (Game.rounds[Game.rounds.length - 1].guessPosition || Game.rounds[Game.rounds.length - 1].position) { + if (Game.multi.owner) { + document.getElementById('continueButton').disabled = false; + document.getElementById('startNewGameButton').disabled = false; + } + + return; + } + // TODO: refactor - it is necessary for mobile if (window.getComputedStyle(document.getElementById('guess')).visibility === 'hidden') { document.getElementById('showGuessButton').click(); @@ -189,10 +204,6 @@ document.getElementById('panoCover').style.visibility = 'visible'; Game.showResults(data.position, null, { distance: NaN, score: 0 }, data.allResults); - - if (!Game.multi.owner) { - document.getElementById('continueButton').style.display = 'none'; - } } }, @@ -463,6 +474,14 @@ if (Game.rounds.length === Game.NUMBER_OF_ROUNDS) { document.getElementById('continueButton').style.display = 'none'; document.getElementById('showSummaryButton').style.display = 'block'; + } else if (roomId) { + if (Game.multi.owner) { + if (!Game.readyToContinue) { + document.getElementById('continueButton').disabled = true; + } + } else { + document.getElementById('continueButton').style.display = 'none'; + } } }, @@ -496,10 +515,6 @@ if (this.response.place) { Game.panoId = this.response.place.panoId; Game.pov = this.response.place.pov; - } else { - if (!Game.multi.owner) { - document.getElementById('continueButton').style.display = 'none'; - } } }, data); }, @@ -625,6 +640,9 @@ if (!roomId || Game.multi.owner) { document.getElementById('startNewGameButton').style.display = 'block'; + if (!Game.readyToContinue) { + document.getElementById('startNewGameButton').disabled = true; + } } var resultBounds = new google.maps.LatLngBounds(); @@ -694,6 +712,10 @@ clearInterval(Game.countdownHandler); } + if (timeout <= 0) { + return; + } + Game.timeoutEnd = new Date(new Date().getTime() + timeout); Game.countdownElement = document.getElementById('countdown'); Game.countdownTimeElement = document.getElementById('countdownTime'); @@ -758,7 +780,7 @@ }); Game.map.addListener('click', function (e) { - if (Game.rounds[Game.rounds.length - 1].guessPosition) { + if (Game.rounds[Game.rounds.length - 1].guessPosition || Game.rounds[Game.rounds.length - 1].position) { return; } @@ -826,7 +848,7 @@ document.getElementById('continueButton').onclick = function () { if (roomId) { - if (!Game.multi.owner) { + if (!Game.multi.owner || !Game.readyToContinue) { return; }