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); }); }