Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion client/src/config/globals.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ export const STATUS = {

export const ALIGNMENT = {
GOOD: 'good',
EVIL: 'evil'
EVIL: 'evil',
INDEPENDENT: 'independent'
};

export const MESSAGES = {
Expand Down
8 changes: 6 additions & 2 deletions client/src/modules/front_end_components/HTMLFragments.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,15 @@ export const HTMLFragments = {
<label id='players-alive-label'></label>
<div id="spectator-count" tabindex="0"></div>
<div id='game-player-list'>
<div class='evil-players'>
<div id="independent-players" class='independent-players' style="display: none;">
<label class='independent'>Team Independent</label>
<div id='player-list-moderator-team-independent'></div>
</div>
<div id="evil-players" class='evil-players' style="display: none;">
<label class='evil'>Team Evil</label>
<div id='player-list-moderator-team-evil'></div>
</div>
<div class='good-players'>
<div id="good-players" class='good-players' style="display: none;">
<label class='good'>Team Good</label>
<div id='player-list-moderator-team-good'></div>
</div>
Expand Down
12 changes: 6 additions & 6 deletions client/src/modules/game_creation/DeckStateManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ export class DeckStateManager {
}
const sortedDeck = this.deck.sort((a, b) => {
if (a.team !== b.team) {
return a.team === ALIGNMENT.GOOD ? -1 : 1;
const order = { good: 0, evil: 1, independent: 2 };
return order[a.team] - order[b.team];
}
return a.role.localeCompare(b.role);
});
Expand Down Expand Up @@ -187,11 +188,7 @@ export class DeckStateManager {
roleEl.dataset.roleId = sortedDeck[i].id;
roleEl.classList.add('added-role');
roleEl.innerHTML = HTMLFragments.DECK_SELECT_ROLE_ADDED_TO_DECK;
if (sortedDeck[i].team === ALIGNMENT.GOOD) {
roleEl.classList.add(ALIGNMENT.GOOD);
} else {
roleEl.classList.add(ALIGNMENT.EVIL);
}
roleEl.classList.add(sortedDeck[i].team);
populateRoleElementInfo(roleEl, sortedDeck, i);
document.getElementById('deck-list').appendChild(roleEl);
const minusOneHandler = (e) => {
Expand Down Expand Up @@ -237,8 +234,10 @@ export class DeckStateManager {
const nameEl = document.getElementById('custom-role-info-modal-name');
alignmentEl.classList.remove(ALIGNMENT.GOOD);
alignmentEl.classList.remove(ALIGNMENT.EVIL);
alignmentEl.classList.remove(ALIGNMENT.INDEPENDENT);
nameEl.classList.remove(ALIGNMENT.GOOD);
nameEl.classList.remove(ALIGNMENT.EVIL);
nameEl.classList.remove(ALIGNMENT.INDEPENDENT);
e.preventDefault();
nameEl.innerText = sortedDeck[i].role;
nameEl.classList.add(sortedDeck[i].team);
Expand All @@ -256,6 +255,7 @@ export class DeckStateManager {
function populateRoleElementInfo (roleEl, sortedDeck, i) {
roleEl.classList.remove(ALIGNMENT.GOOD);
roleEl.classList.remove(ALIGNMENT.EVIL);
roleEl.classList.remove(ALIGNMENT.INDEPENDENT);
roleEl.classList.add(sortedDeck[i].team);
roleEl.querySelector('.role-name').innerHTML =
`<span class="role-quantity"></span>
Expand Down
6 changes: 1 addition & 5 deletions client/src/modules/game_creation/GameCreationStepManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -463,11 +463,7 @@ function renderReviewAndCreateStep (containerId, stepNumber, game, deckManager)
for (const card of game.deck) {
const roleEl = document.createElement('div');
roleEl.innerText = card.quantity + 'x ' + card.role;
if (card.team === ALIGNMENT.GOOD) {
roleEl.classList.add(ALIGNMENT.GOOD);
} else {
roleEl.classList.add(ALIGNMENT.EVIL);
}
roleEl.classList.add(card.team);
div.querySelector('#roles-option').appendChild(roleEl);
}

Expand Down
18 changes: 9 additions & 9 deletions client/src/modules/game_creation/RoleBox.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ export class RoleBox {
loadDefaultRoles = () => {
this.defaultRoles = defaultRoles.sort((a, b) => {
if (a.team !== b.team) {
return a.team === ALIGNMENT.GOOD ? -1 : 1;
const order = { good: 0, evil: 1, independent: 2 };
return order[a.team] - order[b.team];
}
return a.role.localeCompare(b.role);
}).map((role) => {
Expand Down Expand Up @@ -174,10 +175,7 @@ export class RoleBox {
defaultRole.innerHTML = HTMLFragments.DECK_SELECT_ROLE_DEFAULT;
defaultRole.classList.add('default-role');
defaultRole.dataset.roleId = this.defaultRoles[i].id;
const alignmentClass = this.defaultRoles[i].team === ALIGNMENT.GOOD
? ALIGNMENT.GOOD
: ALIGNMENT.EVIL;
defaultRole.classList.add(alignmentClass);
defaultRole.classList.add(this.defaultRoles[i].team);
defaultRole.querySelector('.role-name').innerText = this.defaultRoles[i].role;
selectEl.appendChild(defaultRole);
}
Expand All @@ -202,7 +200,8 @@ export class RoleBox {
}
this.customRoles.sort((a, b) => {
if (a.team !== b.team) {
return a.team === ALIGNMENT.GOOD ? -1 : 1;
const order = { good: 0, evil: 1, independent: 2 };
return order[a.team] - order[b.team];
}
return a.role.localeCompare(b.role);
});
Expand All @@ -212,8 +211,7 @@ export class RoleBox {
customRole.innerHTML = HTMLFragments.DECK_SELECT_ROLE;
customRole.classList.add('custom-role');
customRole.dataset.roleId = this.customRoles[i].id;
const alignmentClass = this.customRoles[i].team === ALIGNMENT.GOOD ? ALIGNMENT.GOOD : ALIGNMENT.EVIL;
customRole.classList.add(alignmentClass);
customRole.classList.add(this.customRoles[i].team);
customRole.querySelector('.role-name').innerText = this.customRoles[i].role;
selectEl.appendChild(customRole);
}
Expand Down Expand Up @@ -282,8 +280,10 @@ export class RoleBox {
const nameEl = document.getElementById('custom-role-info-modal-name');
alignmentEl.classList.remove(ALIGNMENT.GOOD);
alignmentEl.classList.remove(ALIGNMENT.EVIL);
alignmentEl.classList.remove(ALIGNMENT.INDEPENDENT);
nameEl.classList.remove(ALIGNMENT.GOOD);
nameEl.classList.remove(ALIGNMENT.EVIL);
nameEl.classList.remove(ALIGNMENT.INDEPENDENT);
e.preventDefault();
let role;
if (isCustom) {
Expand Down Expand Up @@ -391,7 +391,7 @@ function validateCustomRoleCookie (cookie) {
for (const entry of cookieJSON) {
if (entry !== null && typeof entry === 'object') {
if (typeof entry.role !== 'string' || entry.role.length > PRIMITIVES.MAX_CUSTOM_ROLE_NAME_LENGTH
|| typeof entry.team !== 'string' || (entry.team !== ALIGNMENT.GOOD && entry.team !== ALIGNMENT.EVIL)
|| typeof entry.team !== 'string' || (entry.team !== ALIGNMENT.GOOD && entry.team !== ALIGNMENT.EVIL && entry.team !== ALIGNMENT.INDEPENDENT)
|| typeof entry.description !== 'string' || entry.description.length > PRIMITIVES.MAX_CUSTOM_ROLE_DESCRIPTION_LENGTH
) {
return false;
Expand Down
66 changes: 46 additions & 20 deletions client/src/modules/game_state/states/InProgress.js
Original file line number Diff line number Diff line change
Expand Up @@ -295,26 +295,49 @@ export class InProgress {
&& ((p.userType !== USER_TYPES.MODERATOR && p.userType !== USER_TYPES.SPECTATOR)
|| p.killed)
);
this.renderGroupOfPlayers(
teamEvil,
this.killPlayerHandlers,
this.revealRoleHandlers,
this.stateBucket.currentGameState.accessCode,
ALIGNMENT.EVIL,
this.stateBucket.currentGameState.people.find(person =>
person.id === this.stateBucket.currentGameState.currentModeratorId).userType,
this.socket
);
this.renderGroupOfPlayers(
teamGood,
this.killPlayerHandlers,
this.revealRoleHandlers,
this.stateBucket.currentGameState.accessCode,
ALIGNMENT.GOOD,
this.stateBucket.currentGameState.people.find(person =>
person.id === this.stateBucket.currentGameState.currentModeratorId).userType,
this.socket
const teamIndependent = this.stateBucket.currentGameState.people.filter((p) => p.alignment === ALIGNMENT.INDEPENDENT
&& ((p.userType !== USER_TYPES.MODERATOR && p.userType !== USER_TYPES.SPECTATOR)
|| p.killed)
);
if (teamEvil.length > 0) {
document.getElementById(`${ALIGNMENT.EVIL}-players`).style.display = 'block';
this.renderGroupOfPlayers(
teamEvil,
this.killPlayerHandlers,
this.revealRoleHandlers,
this.stateBucket.currentGameState.accessCode,
ALIGNMENT.EVIL,
this.stateBucket.currentGameState.people.find(person =>
person.id === this.stateBucket.currentGameState.currentModeratorId).userType,
this.socket
);
}
if (teamGood.length > 0) {
document.getElementById(`${ALIGNMENT.GOOD}-players`).style.display = 'block';
this.renderGroupOfPlayers(
teamGood,
this.killPlayerHandlers,
this.revealRoleHandlers,
this.stateBucket.currentGameState.accessCode,
ALIGNMENT.GOOD,
this.stateBucket.currentGameState.people.find(person =>
person.id === this.stateBucket.currentGameState.currentModeratorId).userType,
this.socket
);
}
if (teamIndependent.length > 0) {
document.getElementById(`${ALIGNMENT.INDEPENDENT}-players`).style.display = 'block';
this.renderGroupOfPlayers(
teamIndependent,
this.killPlayerHandlers,
this.revealRoleHandlers,
this.stateBucket.currentGameState.accessCode,
ALIGNMENT.INDEPENDENT,
this.stateBucket.currentGameState.people.find(person =>
person.id === this.stateBucket.currentGameState.currentModeratorId).userType,
this.socket
);
}
document.getElementById('players-alive-label').innerText =
'Players: ' + this.stateBucket.currentGameState.people.filter((person) => !person.out).length + ' / ' +
this.stateBucket.currentGameState.gameSize + ' Alive';
Expand Down Expand Up @@ -460,9 +483,12 @@ function renderPlayerRole (gameState) {
if (gameState.client.alignment === ALIGNMENT.GOOD) {
document.getElementById('game-role').classList.add('game-role-good');
name.classList.add('good');
} else {
} else if (gameState.client.alignment === ALIGNMENT.EVIL) {
document.getElementById('game-role').classList.add('game-role-evil');
name.classList.add('evil');
} else if (gameState.client.alignment === ALIGNMENT.INDEPENDENT) {
document.getElementById('game-role').classList.add('game-role-independent');
name.classList.add('independent');
}
name.setAttribute('title', gameState.client.gameRole);
if (gameState.client.out) {
Expand Down
15 changes: 7 additions & 8 deletions client/src/modules/game_state/states/shared/SharedStateUtil.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import {
ENVIRONMENTS,
SOCKET_EVENTS,
USER_TYPE_ICONS,
USER_TYPES,
ALIGNMENT
USER_TYPES
} from '../../../../config/globals.js';
import { toast } from '../../../front_end_components/Toast.js';
import { Confirmation } from '../../../front_end_components/Confirmation.js';
Expand Down Expand Up @@ -149,7 +148,11 @@ export const SharedStateUtil = {
document.getElementById('role-info-button').addEventListener('click', (e) => {
const deck = stateBucket.currentGameState.deck;
deck.sort((a, b) => {
return a.team === ALIGNMENT.GOOD ? -1 : 1;
if (a.team !== b.team) {
const order = { good: 0, evil: 1, independent: 2 };
return order[a.team] - order[b.team];
}
return a.role.localeCompare(b.role);
});
e.preventDefault();
document.getElementById('role-info-prompt').innerHTML = HTMLFragments.ROLE_INFO_MODAL;
Expand All @@ -168,11 +171,7 @@ export const SharedStateUtil = {
roleName.innerText = card.role;
roleQuantity.innerText = card.quantity + 'x';

if (card.team === ALIGNMENT.GOOD) {
roleName.classList.add(ALIGNMENT.GOOD);
} else {
roleName.classList.add(ALIGNMENT.EVIL);
}
roleName.classList.add(card.team);

roleNameDiv.appendChild(roleQuantity);
roleNameDiv.appendChild(roleName);
Expand Down
9 changes: 9 additions & 0 deletions client/src/styles/GLOBAL.css
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,15 @@ input {
font-weight: bold;
}

.independent, .compact-card.independent .card-role {
color: #af8523 !important;
font-weight: bold;
}

.independent-players, #deck-independent {
border: 2px solid rgba(212, 160, 39, 0.39);
}

@keyframes placeholder {
0%{
background-position: 50% 0
Expand Down
10 changes: 9 additions & 1 deletion client/src/styles/game.css
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ h1 {
display: none;
position: relative;
border: 5px solid transparent;
background-color: #e3e3e3;
background-color: #efefef;
flex-direction: column;
cursor: pointer;
justify-content: space-between;
Expand Down Expand Up @@ -462,6 +462,10 @@ h1 {
border: 4px solid #c55454 !important;
}

.game-role-independent {
border: 4px solid #af8523 !important;
}

#game-role-back {
display: flex;
align-items: center;
Expand Down Expand Up @@ -547,6 +551,10 @@ h1 {
color: #e15656 !important;
}

#game-role #role-name.independent {
color: #af8523 !important;
}

#role-image {
user-select: none;
-ms-user-select: none;
Expand Down
1 change: 1 addition & 0 deletions client/src/view_templates/CreateTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export const hiddenMenus =
<select id="role-alignment" required>
<option value="good">good</option>
<option value="evil">evil</option>
<option value="independent">independent</option>
</select>
</div>
<div>
Expand Down
3 changes: 2 additions & 1 deletion server/config/globals.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ const LOG_LEVEL = {

const ALIGNMENT = {
GOOD: 'good',
EVIL: 'evil'
EVIL: 'evil',
INDEPENDENT: 'independent'
};

const REDIS_CHANNELS = {
Expand Down
2 changes: 1 addition & 1 deletion server/model/GameCreationRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class GameCreationRequest {
&& entry.role.length > 0
&& entry.role.length <= PRIMITIVES.MAX_CUSTOM_ROLE_NAME_LENGTH
&& typeof entry.team === 'string'
&& (entry.team === ALIGNMENT.GOOD || entry.team === ALIGNMENT.EVIL)
&& (entry.team === ALIGNMENT.GOOD || entry.team === ALIGNMENT.EVIL || entry.team === ALIGNMENT.INDEPENDENT)
&& typeof entry.description === 'string'
&& entry.description.length > 0
&& entry.description.length <= PRIMITIVES.MAX_CUSTOM_ROLE_DESCRIPTION_LENGTH
Expand Down
Loading
Loading