play and pause button, more improved lobby view

This commit is contained in:
Alec
2021-12-01 15:07:24 -05:00
parent 7f86aa22aa
commit 27dfd55cda
14 changed files with 222 additions and 130 deletions

View File

@@ -35,8 +35,8 @@ export const globals = {
PRODUCTION: "production" PRODUCTION: "production"
}, },
USER_TYPE_ICONS: { USER_TYPE_ICONS: {
PLAYER: ' \uD83C\uDFAE', player: ' \uD83C\uDFAE',
MODERATOR: ' \uD83D\uDC51', moderator: ' \uD83D\uDC51',
TEMP_MOD: ' \uD83C\uDFAE\uD83D\uDC51' 'player / temp mod': ' \uD83C\uDFAE\uD83D\uDC51'
} }
}; };

View File

@@ -0,0 +1,8 @@
<svg width="263" height="271" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Layer 1</title>
<ellipse stroke="#d7d7d7" ry="131" rx="126" id="svg_5" fill="none" cy="135.237498" cx="131.999999" stroke-opacity="null" stroke-width="8"/>
<rect stroke="#d7d7d7" id="svg_1" height="123.000006" width="41" y="73.737494" x="77.5" stroke-width="0" fill="#d7d7d7"/>
<rect stroke="#d7d7d7" id="svg_3" height="123.000006" width="41" y="73.737494" x="144.5" stroke-width="0" fill="#d7d7d7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,7 @@
<svg width="263" height="271" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Layer 1</title>
<ellipse stroke="#d7d7d7" ry="131" rx="126" id="svg_5" cy="135.237498" cx="129.999999" fill-opacity="null" stroke-opacity="null" stroke-width="8" fill="none"/>
<path transform="rotate(90.18392181396484 140.08586120605474,135.38354492187497) " stroke="#7d0b0b" id="svg_7" d="m86.585877,180.883554l53.499995,-91.000007l53.499995,91.000007l-106.99999,0z" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#d7d7d7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 541 B

View File

@@ -10,33 +10,25 @@ export class GameStateRenderer {
renderLobbyPlayers() { renderLobbyPlayers() {
document.querySelectorAll('.lobby-player').forEach((el) => el.remove()) document.querySelectorAll('.lobby-player').forEach((el) => el.remove())
let lobbyPlayersContainer = document.getElementById("lobby-players"); let lobbyPlayersContainer = document.getElementById("lobby-players");
if (this.gameState.userType !== globals.USER_TYPES.MODERATOR) { if (this.gameState.client.userType === globals.USER_TYPES.PLAYER) {
let modEl = document.createElement("div"); lobbyPlayersContainer.appendChild(renderLobbyPerson(this.gameState.moderator.name, this.gameState.moderator.userType))
modEl.innerText = this.gameState.moderator.name;
modEl.classList.add('lobby-player');
lobbyPlayersContainer.appendChild(modEl);
} }
for (let person of this.gameState.people) { for (let person of this.gameState.people) {
let personEl = document.createElement("div"); lobbyPlayersContainer.appendChild(renderLobbyPerson(person.name,person.userType))
personEl.innerText = person.name;
personEl.classList.add('lobby-player');
lobbyPlayersContainer.appendChild(personEl);
} }
let playerCount; let playerCount = this.gameState.people.filter((person) => person.userType === globals.USER_TYPES.PLAYER).length;
if (this.gameState.userType === globals.USER_TYPES.MODERATOR) { if (this.gameState.moderator.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) {
playerCount = this.gameState.people.length; playerCount += 1;
} else { }
playerCount = 1 + this.gameState.people.length; if (this.gameState.client.userType === globals.USER_TYPES.PLAYER) {
playerCount += 1;
} }
document.querySelector("label[for='lobby-players']").innerText = document.querySelector("label[for='lobby-players']").innerText =
"Other People ( " + playerCount + " )"; "Other People (" + playerCount + "/" + getGameSize(this.gameState.deck) + " Players)";
} }
renderLobbyHeader() { renderLobbyHeader() {
let existingTitle = document.querySelector('#game-link h1'); removeExistingTitle();
if (existingTitle) {
existingTitle.remove();
}
let title = document.createElement("h1"); let title = document.createElement("h1");
title.innerText = "Lobby"; title.innerText = "Lobby";
document.getElementById("game-title").appendChild(title); document.getElementById("game-title").appendChild(title);
@@ -62,9 +54,9 @@ export class GameStateRenderer {
} }
renderGameHeader() { renderGameHeader() {
removeExistingTitle();
// let title = document.createElement("h1"); // let title = document.createElement("h1");
// title.innerText = "Game"; // title.innerText = "Game";
// document.querySelector('#game-title h1')?.remove();
// document.getElementById("game-title").appendChild(title); // document.getElementById("game-title").appendChild(title);
} }
@@ -99,13 +91,18 @@ export class GameStateRenderer {
} }
} }
function renderLobbyPlayer(name, userType) { function renderLobbyPerson(name, userType) {
let el = document.createElement("div"); let el = document.createElement("div");
el.innerHTML = "" let personNameEl = document.createElement("div");
clientEl.innerText = client.name + ' (you)'; let personTypeEl = document.createElement("div");
clientEl.classList.add('lobby-player'); personNameEl.innerText = name;
clientEl.classList.add('lobby-player-client'); personTypeEl.innerText = userType + globals.USER_TYPE_ICONS[userType];
container.prepend(clientEl); el.classList.add('lobby-player');
el.appendChild(personNameEl);
el.appendChild(personTypeEl);
return el;
} }
function getGameSize(cards) { function getGameSize(cards) {
@@ -116,3 +113,10 @@ function getGameSize(cards) {
return quantity; return quantity;
} }
function removeExistingTitle() {
let existingTitle = document.querySelector('#game-title h1');
if (existingTitle) {
existingTitle.remove();
}
}

View File

@@ -1,24 +1,34 @@
import {globals} from "../config/globals.js"; import {globals} from "../config/globals.js";
export class GameTimerManager { export class GameTimerManager {
constructor() { constructor(gameState, socket) {
this.gameState = gameState;
this.playListener = () => {
socket.emit(globals.COMMANDS.RESUME_TIMER, this.gameState.accessCode);
}
this.pauseListener = () => {
socket.emit(globals.COMMANDS.PAUSE_TIMER, this.gameState.accessCode);
}
} }
startGameTimer (hours, minutes, tickRate, soundManager, timerWorker) { // startGameTimer (hours, minutes, tickRate, soundManager, timerWorker) {
if (window.Worker) { // if (window.Worker) {
timerWorker.onmessage = function (e) { // timerWorker.onmessage = function (e) {
if (e.data.hasOwnProperty('timeRemainingInMilliseconds') && e.data.timeRemainingInMilliseconds > 0) { // if (e.data.hasOwnProperty('timeRemainingInMilliseconds') && e.data.timeRemainingInMilliseconds > 0) {
document.getElementById('game-timer').innerText = e.data.displayTime; // document.getElementById('game-timer').innerText = e.data.displayTime;
} // }
}; // };
const totalTime = convertFromHoursToMilliseconds(hours) + convertFromMinutesToMilliseconds(minutes); // const totalTime = convertFromHoursToMilliseconds(hours) + convertFromMinutesToMilliseconds(minutes);
timerWorker.postMessage({ totalTime: totalTime, tickInterval: tickRate }); // timerWorker.postMessage({ totalTime: totalTime, tickInterval: tickRate });
} // }
} // }
resumeGameTimer(totalTime, tickRate, soundManager, timerWorker) { resumeGameTimer(totalTime, tickRate, soundManager, timerWorker) {
if (window.Worker) { if (window.Worker) {
if (this.gameState.client.userType !== globals.USER_TYPES.PLAYER) {
this.swapToPauseButton();
}
let timer = document.getElementById('game-timer'); let timer = document.getElementById('game-timer');
timer.classList.remove('paused'); timer.classList.remove('paused');
timer.innerText = totalTime < 60000 timer.innerText = totalTime < 60000
@@ -35,6 +45,10 @@ export class GameTimerManager {
pauseGameTimer(timerWorker, timeRemaining) { pauseGameTimer(timerWorker, timeRemaining) {
if (window.Worker) { if (window.Worker) {
if (this.gameState.client.userType !== globals.USER_TYPES.PLAYER) {
this.swapToPlayButton();
}
timerWorker.postMessage('stop'); timerWorker.postMessage('stop');
let timer = document.getElementById('game-timer'); let timer = document.getElementById('game-timer');
timer.innerText = timeRemaining < 60000 timer.innerText = timeRemaining < 60000
@@ -45,6 +59,10 @@ export class GameTimerManager {
} }
displayPausedTime(time) { displayPausedTime(time) {
if (this.gameState.client.userType !== globals.USER_TYPES.PLAYER) {
this.swapToPlayButton();
}
let timer = document.getElementById('game-timer'); let timer = document.getElementById('game-timer');
timer.innerText = time < 60000 timer.innerText = time < 60000
? returnHumanReadableTime(time, true) ? returnHumanReadableTime(time, true)
@@ -53,17 +71,17 @@ export class GameTimerManager {
} }
attachTimerSocketListeners(socket, timerWorker, gameStateRenderer) { attachTimerSocketListeners(socket, timerWorker, gameStateRenderer) {
if (!socket.hasListeners(globals.EVENTS.START_TIMER)) { // if (!socket.hasListeners(globals.EVENTS.START_TIMER)) {
socket.on(globals.EVENTS.START_TIMER, () => { // socket.on(globals.EVENTS.START_TIMER, () => {
this.startGameTimer( // this.startGameTimer(
gameStateRenderer.gameState.timerParams.hours, // gameStateRenderer.gameState.timerParams.hours,
gameStateRenderer.gameState.timerParams.minutes, // gameStateRenderer.gameState.timerParams.minutes,
globals.CLOCK_TICK_INTERVAL_MILLIS, // globals.CLOCK_TICK_INTERVAL_MILLIS,
null, // null,
timerWorker // timerWorker
) // )
}); // });
} // }
if(!socket.hasListeners(globals.COMMANDS.PAUSE_TIMER)) { if(!socket.hasListeners(globals.COMMANDS.PAUSE_TIMER)) {
socket.on(globals.COMMANDS.PAUSE_TIMER, (timeRemaining) => { socket.on(globals.COMMANDS.PAUSE_TIMER, (timeRemaining) => {
@@ -88,6 +106,32 @@ export class GameTimerManager {
}); });
} }
} }
swapToPlayButton() {
let currentBtn = document.querySelector('#play-pause img');
if (currentBtn) {
currentBtn.removeEventListener('click', this.pauseListener);
currentBtn.remove();
}
let playBtn = document.createElement('img');
playBtn.setAttribute('src', '../images/play-button.svg');
playBtn.addEventListener('click', this.playListener);
document.getElementById('play-pause').appendChild(playBtn);
}
swapToPauseButton() {
let currentBtn = document.querySelector('#play-pause img');
if (currentBtn) {
currentBtn.removeEventListener('click', this.playListener);
currentBtn.remove();
}
let pauseBtn = document.createElement('img');
pauseBtn.setAttribute('src', '../images/pause-button.svg');
pauseBtn.addEventListener('click', this.pauseListener);
document.getElementById('play-pause').appendChild(pauseBtn);
}
} }

View File

@@ -22,7 +22,6 @@ export const templates = {
"<button id='start-game-button'>Start Game</button>" + "<button id='start-game-button'>Start Game</button>" +
"</div>", "</div>",
GAME: GAME:
"<div id='person-name'></div>" +
"<div id='game-header'>" + "<div id='game-header'>" +
"<div>" + "<div>" +
"<label for='game-timer'>Time Remaining</label>" + "<label for='game-timer'>Time Remaining</label>" +
@@ -43,16 +42,15 @@ export const templates = {
"<p>(click again to hide)</p>" + "<p>(click again to hide)</p>" +
"</div>", "</div>",
MODERATOR_GAME_VIEW: MODERATOR_GAME_VIEW:
"<div id='person-name'></div>" +
"<h2 class='user-type user-type-moderator'>Moderator</h2>" +
"<div id='game-header'>" + "<div id='game-header'>" +
"<div class='timer-container-moderator'>" + "<div class='timer-container-moderator'>" +
"<div>" +
"<label for='game-timer'>Time Remaining</label>" + "<label for='game-timer'>Time Remaining</label>" +
"<div id='game-timer'></div>" + "<div id='game-timer'></div>" +
"</div>" + "</div>" +
"<div id='play-pause'>" + "<div id='play-pause'>" +
"<button id='pause-button'>Pause</button>" +
"<button id='play-button'>Play</button>" + "</div>" +
"</div>" + "</div>" +
"<div>" + "<div>" +
"<label for='alive-count'>Players Left</label>" + "<label for='alive-count'>Players Left</label>" +

View File

@@ -35,10 +35,10 @@ function prepareGamePage(environment, socket, timerWorker) {
let gameStateRenderer = new GameStateRenderer(gameState); let gameStateRenderer = new GameStateRenderer(gameState);
let gameTimerManager; let gameTimerManager;
if (gameState.timerParams) { if (gameState.timerParams) {
gameTimerManager = new GameTimerManager(); gameTimerManager = new GameTimerManager(gameState, socket);
} }
setClientSocketHandlers(gameStateRenderer, socket, timerWorker, gameTimerManager); setClientSocketHandlers(gameStateRenderer, socket, timerWorker, gameTimerManager);
displayClientInfo(gameState.client.name, gameState.userType); displayClientInfo(gameState.client.name, gameState.client.userType);
processGameState(gameState, userId, socket, gameStateRenderer); processGameState(gameState, userId, socket, gameStateRenderer);
} }
}); });
@@ -56,8 +56,8 @@ function processGameState (gameState, userId, socket, gameStateRenderer) {
if ( if (
gameState.isFull gameState.isFull
&& ( && (
gameState.userType === globals.USER_TYPES.MODERATOR gameState.client.userType === globals.USER_TYPES.MODERATOR
|| gameState.userType === globals.USER_TYPES.TEMPORARY_MODERATOR || gameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR
) )
) { ) {
displayStartGamePromptForModerators(gameStateRenderer, socket); displayStartGamePromptForModerators(gameStateRenderer, socket);
@@ -67,21 +67,14 @@ function processGameState (gameState, userId, socket, gameStateRenderer) {
document.querySelector("#start-game-prompt")?.remove(); document.querySelector("#start-game-prompt")?.remove();
gameStateRenderer.gameState = gameState; gameStateRenderer.gameState = gameState;
gameStateRenderer.renderGameHeader(); gameStateRenderer.renderGameHeader();
if (gameState.userType === globals.USER_TYPES.PLAYER || gameState.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { if (gameState.client.userType === globals.USER_TYPES.PLAYER || gameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) {
document.getElementById("game-state-container").innerHTML = templates.GAME; document.getElementById("game-state-container").innerHTML = templates.GAME;
gameStateRenderer.renderPlayerRole(); gameStateRenderer.renderPlayerRole();
} else if (gameState.userType === globals.USER_TYPES.MODERATOR) { } else if (gameState.client.userType === globals.USER_TYPES.MODERATOR) {
document.getElementById("game-state-container").innerHTML = templates.MODERATOR_GAME_VIEW; document.getElementById("game-state-container").innerHTML = templates.MODERATOR_GAME_VIEW;
gameStateRenderer.renderModeratorView(); gameStateRenderer.renderModeratorView();
console.log(gameState);
console.log(gameState.accessCode);
document.getElementById("pause-button").addEventListener('click', () => {
socket.emit(globals.COMMANDS.PAUSE_TIMER, gameState.accessCode);
});
document.getElementById("play-button").addEventListener('click', () => {
socket.emit(globals.COMMANDS.RESUME_TIMER, gameState.accessCode);
})
} }
socket.emit(globals.COMMANDS.GET_TIME_REMAINING, gameState.accessCode);
break; break;
default: default:
break; break;
@@ -91,14 +84,7 @@ function processGameState (gameState, userId, socket, gameStateRenderer) {
function displayClientInfo(name, userType) { function displayClientInfo(name, userType) {
document.getElementById("client-name").innerText = name; document.getElementById("client-name").innerText = name;
document.getElementById("client-user-type").innerText = userType; document.getElementById("client-user-type").innerText = userType;
document.getElementById("client-user-type").innerText += globals.USER_TYPE_ICONS[userType];
if (userType === globals.USER_TYPES.MODERATOR) {
document.getElementById("client-user-type").innerText += globals.USER_TYPE_ICONS.MODERATOR;
} else if (userType === globals.USER_TYPES.PLAYER) {
document.getElementById("client-user-type").innerText += globals.USER_TYPE_ICONS.PLAYER;
} else if (userType === globals.USER_TYPES.TEMPORARY_MODERATOR) {
document.getElementById("client-user-type").innerText += globals.USER_TYPE_ICONS.TEMP_MOD;
}
} }
function setClientSocketHandlers(gameStateRenderer, socket, timerWorker, gameTimerManager) { function setClientSocketHandlers(gameStateRenderer, socket, timerWorker, gameTimerManager) {
@@ -110,8 +96,8 @@ function setClientSocketHandlers(gameStateRenderer, socket, timerWorker, gameTim
if ( if (
gameIsFull gameIsFull
&& ( && (
gameStateRenderer.gameState.userType === globals.USER_TYPES.MODERATOR gameStateRenderer.gameState.client.userType === globals.USER_TYPES.MODERATOR
|| gameStateRenderer.gameState.userType === globals.USER_TYPES.TEMPORARY_MODERATOR || gameStateRenderer.gameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR
) )
) { ) {
displayStartGamePromptForModerators(gameStateRenderer, socket); displayStartGamePromptForModerators(gameStateRenderer, socket);

View File

@@ -57,7 +57,7 @@ h3 {
label { label {
color: #d7d7d7; color: #d7d7d7;
font-family: 'signika-negative', sans-serif; font-family: 'signika-negative', sans-serif;
font-size: 18px; font-size: 20px;
font-weight: normal; font-weight: normal;
} }

View File

@@ -1,4 +1,8 @@
.lobby-player, #moderator { .lobby-player, #moderator {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
background-color: black; background-color: black;
color: whitesmoke; color: whitesmoke;
padding: 10px; padding: 10px;
@@ -14,6 +18,10 @@
border: 2px solid #21ba45; border: 2px solid #21ba45;
} }
.lobby-player div:nth-child(2) {
color: #21ba45;
}
#moderator.moderator-client { #moderator.moderator-client {
border: 2px solid lightgray; border: 2px solid lightgray;
} }
@@ -182,7 +190,8 @@ h1 {
} }
#client-container { #client-container {
max-width: 30em; max-width: 35em;
margin-top: 2em;
} }
#client { #client {
@@ -198,7 +207,7 @@ h1 {
#client-name { #client-name {
color: whitesmoke; color: whitesmoke;
font-family: 'diavlo', sans-serif; font-family: 'diavlo', sans-serif;
font-size: 37px; font-size: 30px;
} }
#client-user-type { #client-user-type {
@@ -219,13 +228,6 @@ label[for='moderator'] {
font-size: 30px; font-size: 30px;
} }
label[for='lobby-players'] {
font-family: 'diavlo', sans-serif;
color: #21ba45;
filter: drop-shadow(2px 2px 4px black);
font-size: 30px;
}
#start-game-prompt { #start-game-prompt {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -268,10 +270,46 @@ label[for='lobby-players'] {
border: 2px solid #1c8a36; border: 2px solid #1c8a36;
} }
#play-pause {
display: flex;
align-items: center;
}
#play-pause img {
cursor: pointer;
user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
width: 60px;
}
#play-pause img:hover {
filter: brightness(0.5);
}
#play-pause img:active {
transform: scale(0.95);
}
.paused { .paused {
animation: pulse 0.75s linear infinite alternate; animation: pulse 0.75s linear infinite alternate;
} }
#game-header {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-evenly;
}
.timer-container-moderator {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
}
@keyframes pulse { @keyframes pulse {
from { from {
color: rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.1);

View File

@@ -7,7 +7,8 @@ const globals = {
GET_ENVIRONMENT: 'getEnvironment', GET_ENVIRONMENT: 'getEnvironment',
START_GAME: 'startGame', START_GAME: 'startGame',
PAUSE_TIMER: 'pauseTimer', PAUSE_TIMER: 'pauseTimer',
RESUME_TIMER: 'resumeTimer' RESUME_TIMER: 'resumeTimer',
GET_TIME_REMAINING: 'getTimeRemaining'
}, },
STATUS: { STATUS: {
LOBBY: "lobby", LOBBY: "lobby",

View File

@@ -60,7 +60,7 @@ class ActiveGameRunner {
minutes: game.timerParams.minutes minutes: game.timerParams.minutes
}); });
game.startTime = new Date().toJSON(); game.startTime = new Date().toJSON();
namespace.in(game.accessCode).emit(globals.GAME_PROCESS_COMMANDS.START_TIMER); //namespace.in(game.accessCode).emit(globals.GAME_PROCESS_COMMANDS.START_TIMER);
} }
} }

View File

@@ -39,6 +39,7 @@ class GameManager {
game.status = globals.STATUS.IN_PROGRESS; game.status = globals.STATUS.IN_PROGRESS;
namespace.in(accessCode).emit(globals.EVENTS.SYNC_GAME_STATE); namespace.in(accessCode).emit(globals.EVENTS.SYNC_GAME_STATE);
if (game.hasTimer) { if (game.hasTimer) {
game.timerParams.paused = true;
this.activeGameRunner.runGame(game, namespace); this.activeGameRunner.runGame(game, namespace);
} }
} }
@@ -58,7 +59,7 @@ class GameManager {
}); });
} }
} }
}) });
socket.on(globals.CLIENT_COMMANDS.RESUME_TIMER, (accessCode) => { socket.on(globals.CLIENT_COMMANDS.RESUME_TIMER, (accessCode) => {
this.logger.trace(accessCode); this.logger.trace(accessCode);
@@ -74,7 +75,22 @@ class GameManager {
}); });
} }
} }
}) });
socket.on(globals.CLIENT_COMMANDS.GET_TIME_REMAINING, (accessCode) => {
let game = this.activeGameRunner.activeGames[accessCode];
if (game) {
let thread = this.activeGameRunner.timerThreads[accessCode];
if (thread) {
thread.send({
command: globals.GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
accessCode: accessCode,
socketId: socket.id,
logLevel: this.logger.logLevel
});
}
}
});
} }
@@ -250,7 +266,7 @@ function handleRequestForGameState(namespace, logger, gameRunner, accessCode, pe
game.isFull = isFull; game.isFull = isFull;
socket.to(accessCode).emit( socket.to(accessCode).emit(
globals.EVENTS.PLAYER_JOINED, globals.EVENTS.PLAYER_JOINED,
{name: unassignedPerson.name}, {name: unassignedPerson.name, userType: unassignedPerson.userType},
isFull isFull
); );
} else { } else {

View File

@@ -2,19 +2,17 @@ const globals = require("../config/globals")
const GameStateCurator = { const GameStateCurator = {
getGameStateFromPerspectiveOfPerson: (game, person, gameRunner, socket, logger) => { getGameStateFromPerspectiveOfPerson: (game, person, gameRunner, socket, logger) => {
if (game.timerParams && game.status === globals.STATUS.IN_PROGRESS) {
getTimeRemaining(game.accessCode, gameRunner, socket, logger)
}
return getGameStateBasedOnPermissions(game, person, gameRunner); return getGameStateBasedOnPermissions(game, person, gameRunner);
} }
} }
function getGameStateBasedOnPermissions(game, person, gameRunner) { function getGameStateBasedOnPermissions(game, person, gameRunner) {
let client = game.status === globals.STATUS.LOBBY // people won't be able to know their role until past the lobby stage. let client = game.status === globals.STATUS.LOBBY // people won't be able to know their role until past the lobby stage.
? { name: person.name, id: person.id } ? { name: person.name, id: person.id, userType: person.userType }
: { : {
name: person.name, name: person.name,
id: person.id, id: person.id,
userType: person.userType,
gameRole: person.gameRole, gameRole: person.gameRole,
gameRoleDescription: person.gameRoleDescription, gameRoleDescription: person.gameRoleDescription,
alignment: person.alignment alignment: person.alignment
@@ -25,12 +23,12 @@ function getGameStateBasedOnPermissions(game, person, gameRunner) {
accessCode: game.accessCode, accessCode: game.accessCode,
status: game.status, status: game.status,
moderator: mapPerson(game.moderator), moderator: mapPerson(game.moderator),
userType: globals.USER_TYPES.PLAYER,
client: client, client: client,
deck: game.deck, deck: game.deck,
people: game.people people: game.people
.filter((person) => { .filter((person) => {
return person.assigned === true && person.id !== client.id && person.userType !== globals.USER_TYPES.MODERATOR return person.assigned === true && person.id !== client.id
&& (person.userType !== globals.USER_TYPES.MODERATOR && person.userType !== globals.USER_TYPES.TEMPORARY_MODERATOR)
}) })
.map((filteredPerson) => ({ name: filteredPerson.name, userType: filteredPerson.userType })), .map((filteredPerson) => ({ name: filteredPerson.name, userType: filteredPerson.userType })),
timerParams: game.timerParams, timerParams: game.timerParams,
@@ -41,7 +39,6 @@ function getGameStateBasedOnPermissions(game, person, gameRunner) {
accessCode: game.accessCode, accessCode: game.accessCode,
status: game.status, status: game.status,
moderator: mapPerson(game.moderator), moderator: mapPerson(game.moderator),
userType: globals.USER_TYPES.MODERATOR,
client: client, client: client,
deck: game.deck, deck: game.deck,
people: mapPeopleForModerator(game.people, client), people: mapPeopleForModerator(game.people, client),
@@ -53,7 +50,6 @@ function getGameStateBasedOnPermissions(game, person, gameRunner) {
accessCode: game.accessCode, accessCode: game.accessCode,
status: game.status, status: game.status,
moderator: mapPerson(game.moderator), moderator: mapPerson(game.moderator),
userType: globals.USER_TYPES.TEMPORARY_MODERATOR,
client: client, client: client,
deck: game.deck, deck: game.deck,
people: mapPeopleForTempModerator(game.people, client), people: mapPeopleForTempModerator(game.people, client),
@@ -72,6 +68,7 @@ function mapPeopleForModerator(people, client) {
}) })
.map((person) => ({ .map((person) => ({
name: person.name, name: person.name,
userType: person.userType,
gameRole: person.gameRole, gameRole: person.gameRole,
gameRoleDescription: person.gameRoleDescription, gameRoleDescription: person.gameRoleDescription,
alignment: person.alignment alignment: person.alignment
@@ -85,23 +82,12 @@ function mapPeopleForTempModerator(people, client) {
}) })
.map((person) => ({ .map((person) => ({
name: person.name, name: person.name,
userType: person.userType
})); }));
} }
function mapPerson(person) { function mapPerson(person) {
return { name: person.name }; return { name: person.name, userType: person.userType };
}
function getTimeRemaining(accessCode, gameRunner, socket, logger) {
let thread = gameRunner.timerThreads[accessCode];
if (thread) {
thread.send({
command: globals.GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
accessCode: accessCode,
socketId: socket.id,
logLevel: logger.logLevel
});
}
} }
module.exports = GameStateCurator; module.exports = GameStateCurator;

View File

@@ -36,7 +36,7 @@ class ServerTimer {
this.totalTime = null; this.totalTime = null;
} }
runTimer () { runTimer (pausedInitially=true) {
let total = convertFromHoursToMilliseconds(this.hours) + convertFromMinutesToMilliseconds(this.minutes); let total = convertFromHoursToMilliseconds(this.hours) + convertFromMinutesToMilliseconds(this.minutes);
this.totalTime = total; this.totalTime = total;
this.currentTimeInMillis = total; this.currentTimeInMillis = total;
@@ -47,18 +47,22 @@ class ServerTimer {
this.timesUpResolver = resolve; this.timesUpResolver = resolve;
}); });
const instance = this; const instance = this;
if (!pausedInitially) {
this.ticking = setTimeout(function () { this.ticking = setTimeout(function () {
stepFn( stepFn(
instance, instance,
expected expected
); );
}, this.tickInterval); }, this.tickInterval);
}
return this.timesUpPromise; return this.timesUpPromise;
} }
stopTimer() { stopTimer() {
if (this.ticking) {
clearTimeout(this.ticking); clearTimeout(this.ticking);
}
let now = Date.now(); let now = Date.now();
this.logger.debug( this.logger.debug(
'ELAPSED (PAUSE): ' + (now - this.start) + 'ms (~' 'ELAPSED (PAUSE): ' + (now - this.start) + 'ms (~'