mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
play and pause button, more improved lobby view
This commit is contained in:
@@ -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'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
8
client/images/pause-button.svg
Normal file
8
client/images/pause-button.svg
Normal 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 |
7
client/images/play-button.svg
Normal file
7
client/images/play-button.svg
Normal 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 |
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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>" +
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 (~'
|
||||||
|
|||||||
Reference in New Issue
Block a user