diff --git a/server.js b/server.js
index 2ab468e..4eb1794 100644
--- a/server.js
+++ b/server.js
@@ -16,7 +16,7 @@ const CronJob = require('cron').CronJob;
var activeGames = {};
// cron job for periodically clearing finished games
-const job = new CronJob('0 0 */1 * * *', function() {
+const job = new CronJob('0 0 */2 * * *', function() {
console.log(activeGames);
for (const key in activeGames) {
if (activeGames.hasOwnProperty(key) && (Math.abs((new Date()) - (new Date(activeGames[key].startTime))) / 36e5) >= 2) {
diff --git a/static/join.js b/static/join.js
index 35d5cc8..eac3984 100644
--- a/static/join.js
+++ b/static/join.js
@@ -29,7 +29,7 @@ document.getElementById("join-btn").addEventListener("click", function() {
sessionStorage.setItem("code", document.getElementById("code").value);
let playerId = utility.generateID();
sessionStorage.setItem("id", playerId);
- const playerInfo = {name: document.getElementById("name").value, id: playerId, code: document.getElementById("code").value};
+ const playerInfo = {name: document.getElementById("name").value, id: playerId, code: document.getElementById("code").value.toString().trim()};
socket.emit('joinGame', playerInfo);
} else {
document.getElementById("name").classList.add("error");
diff --git a/static/setup.js b/static/setup.js
index 1c9ad4f..6959ab5 100644
--- a/static/setup.js
+++ b/static/setup.js
@@ -40,36 +40,64 @@ document.getElementById("role-btn").addEventListener("click", displayRoleModal);
document.getElementById("close").addEventListener("click", closeModal);
// render all of the available cards to the user
-window.onload = function() {
- for (const card of cards) {
- const newCard = new Card(card.role, card.team, card.description, card.powerRole);
+window.onload = function() {
+ for (let i = 0; i < cards.length; i ++) {
+ const newCard = new Card(cards[i].role, cards[i].team, cards[i].description, cards[i].powerRole);
// put card info in the informational role description modal
const modalRole = document.createElement("div");
modalRole.setAttribute("class", "modal-role");
- modalRole.innerHTML = card.team === "good" ?
- "
" + card.role + "
" + card.team + "
" + card.description + "
"
- : "" + card.role + "
" + card.team + "
" + card.description + "
";
+ modalRole.innerHTML = cards[i].team === "good" ?
+ "" + cards[i].role + "
" + cards[i].team + "
" + cards[i].description + "
"
+ : "" + cards[i].role + "
" + cards[i].team + "
" + cards[i].description + "
";
document.getElementById("roles").appendChild(modalRole);
fullDeck.push(newCard);
const cardContainer = document.createElement("div");
+ const quantityClass = cards[i].team === "good" ? "card-quantity quantity-village" : "card-quantity quantity-wolf"
+
cardContainer.setAttribute("class", "card");
- cardContainer.innerHTML = "" + newCard.role + "
" + newCard.quantity + "
";
-
- cardContainer.addEventListener("click", function() {
- if(!newCard.powerRole || (newCard.powerRole && newCard.quantity === 0)) {
- newCard.quantity += 1;
- }
- cardContainer.getElementsByClassName("card-quantity")[0].innerHTML = newCard.quantity;
- updateGameSize();
- });
-
+ cardContainer.setAttribute("id", "card-" + i);
+ cardContainer.innerHTML =
+ "" +
+ "
" + newCard.role + "
" +
+ "
+
" +
+ "
" +
+ "" + newCard.quantity + "
" +
+ "";
document.getElementById("card-select").appendChild(cardContainer)
+ let cardTop = document.getElementById("card-" + i).getElementsByClassName("card-top")[0];
+ let cardQuantity = document.getElementById("card-" + i).getElementsByClassName("card-quantity")[0];
+ let cardBottom = document.getElementById("card-" + i).getElementsByClassName("card-bottom")[0];
+ cardTop.addEventListener("click", incrementCardQuantity, false);
+ cardBottom.addEventListener("click", decrementCardQuantity, false);
+ cardTop.card = newCard;
+ cardTop.quantityEl = cardQuantity;
+ cardBottom.card = newCard;
+ cardBottom.quantityEl = cardQuantity;
}
};
+function incrementCardQuantity(e) {
+ console.log(e.target);
+ if(e.target.card.quantity < 25) {
+ e.target.card.quantity += 1;
+ }
+ e.target.quantityEl.innerHTML = e.target.card.quantity;
+ updateGameSize();
+}
+
+function decrementCardQuantity(e) {
+ if(e.target.card.quantity > 0) {
+ e.target.card.quantity -= 1;
+ }
+ e.target.quantityEl.innerHTML = e.target.card.quantity;
+ updateGameSize();
+}
+
function updateGameSize() {
gameSize = 0;
for (let card of fullDeck) {
@@ -118,9 +146,9 @@ function createGame() {
if (document.getElementById("name").value.length > 0 && atLeastOnePlayer) {
// generate 6 digit access code
let code = "";
- let charPool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ let charPool = "abcdefghijklmnopqrstuvwxyz0123456789";
for (let i = 0; i < 6; i++) {
- code += charPool[utility.getRandomInt(61)]
+ code += charPool[utility.getRandomInt(36)]
}
// generate unique player Id for session
@@ -136,7 +164,7 @@ function createGame() {
code,
gameSize,
buildDeckFromQuantities(),
- document.getElementById("time").value
+ Math.ceil(document.getElementById("time").value)
);
socket.emit('newGame', game, function(data) {
socket.emit('joinGame', playerInfo);
diff --git a/static/styles.css b/static/styles.css
index fb6e961..e96d98a 100644
--- a/static/styles.css
+++ b/static/styles.css
@@ -19,8 +19,8 @@
.card {
padding: 0.5em;
- width: 5em;
- height: 7.5em;
+ width: 7em;
+ height: 10.5em;
font-size: 0.9em;
margin: 0 0.7em 0.7em 0;
}
@@ -62,8 +62,8 @@
}
.card {
- height: 8.5em;
- width: 5em;
+ width: 7em;
+ height: 10.5em;
padding: 1em;
font-size: 1.1em;
margin: 0.5em;
@@ -148,6 +148,7 @@ html, body {
.app-title .app-header {
width: 6em;
display: flex;
+ font-weight: bold;
}
.app-title {
@@ -253,8 +254,9 @@ button {
.card {
text-align: center;
cursor: pointer;
+ position: relative;
color: gray;
- border: 1px solid #7d0b0b;
+ border: 1px solid black;
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.4);
border-radius: 3px;
user-select: none;
@@ -264,11 +266,52 @@ button {
background-color: rgba(0, 0, 0, 0.05);
}
+.card-top {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ height: 50%;
+ border-bottom: 1px solid gray;
+}
+
+.card-bottom {
+ display: flex;
+ justify-content: flex-end;
+ height: 50%;
+ align-items: flex-start;
+}
+
+.card-top p {
+ margin: 0;
+ font-size: 2.5em;
+ pointer-events: none;
+}
+
+.card-top p.card-role {
+ font-size: 1em;
+ pointer-events: none;
+}
+
+.card-bottom p {
+ pointer-events: none;
+ font-size: 3em;
+ margin: 0;
+}
+
.card-quantity {
+ pointer-events: none;
font-weight: bold;
color: #7d0b0b;
font-size: 2.5em;
margin: 0;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 32%;
+ width: 1.5em;
+ background-color: white;
+ margin-left: auto;
+ margin-right: auto;
}
.card-role {
@@ -509,18 +552,10 @@ label {
transform-style: preserve-3d;
}
-.village {
- border: 2px solid rgba(23, 20, 105, 0.5);
-}
-
.village h2 {
color: #171469;
}
-.wolf {
- border: 2px solid rgba(125, 11, 11, 0.5);
-}
-
.wolf h2 {
color: #7d0b0b;
}
@@ -557,9 +592,7 @@ label {
margin: auto auto;
border-radius: 3px;
text-align: center;
-}
-
-.game-card:hover {
+ border: 2px solid rgba(59, 59, 59, 0.5);
}
/* Position the front and back side */
@@ -760,6 +793,14 @@ label {
font-family: 'diavlo', sans-serif;
}
+.quantity-village {
+ color: #171469;
+}
+
+.quantity-wolf {
+ color: #7d0b0b;
+}
+
@keyframes animatetop {
from {top: -300px; opacity: 0}
to {top: 0; opacity: 1}