"use strict"; const express = require("express"), config = require("config"), moment = require("moment"), crypto = require("crypto"), util = require("util"), Promise = require("bluebird"); let gameDB; require("../db/games").then(function(db) { gameDB = db; }); const router = express.Router(); function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; // While there remain elements to shuffle... while (0 !== currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; // And swap it with the current element. temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } const assetData = { tiles: [ { type: "wood", y: 0. / 4. }, { type: "wood", y: 1. / 4. }, { type: "wood", y: 2. / 4. }, { type: "wood", y: 3. / 4. }, { type: "wheat", y: 0. / 4. }, { type: "wheat", y: 1. / 4. }, { type: "wheat", y: 2. / 4. }, { type: "wheat", y: 3. / 4. }, { type: "stone", y: 0. / 4. }, { type: "stone", y: 1. / 4. }, { type: "stone", y: 2. / 4. }, { type: "sheep", y: 0. / 4. }, { type: "sheep", y: 1. / 4. }, { type: "sheep", y: 2. / 4. }, { type: "sheep", y: 3. / 4. }, { type: "brick", y: 0. / 4. }, { type: "brick", y: 1. / 4. }, { type: "brick", y: 2. / 4. }, { type: "robber", y: 0 } ], pips: [ { roll: 7, pips: 0, y: 3. / 6., x: 0. / 6. }, { roll: 5, pips: 4, y: 0. / 6., x: 0. / 6. }, { roll: 2, pips: 1, y: 0. / 6., x: 1. / 6. }, { roll: 6, pips: 5, y: 0. / 6., x: 2. / 6. }, { roll: 3, pips: 2, y: 0. / 6., x: 3. / 6. }, { roll: 8, pips: 5, y: 0. / 6., x: 4. / 6. }, { roll: 10, pips: 3, y: 0. / 6., x: 5. / 6. }, { roll: 9, pips: 4, y: 1. / 6., x: 0. / 6. }, { roll: 12, pips: 1, y: 1. / 6., x: 1. / 6. }, { roll: 11, pips: 2, y: 1. / 6., x: 2. / 6. }, { roll: 4, pips: 3, y: 1. / 6., x: 3. / 6. }, { roll: 8, pips: 5, y: 1. / 6., x: 4. / 6. }, { roll: 10, pips: 3, y: 1. / 6., x: 5. / 6. }, { roll: 9, pips: 4, y: 2. / 6., x: 0. / 6. }, { roll: 4, pips: 3, y: 2. / 6., x: 1. / 6. }, { roll: 5, pips: 4, y: 2. / 6., x: 2. / 6. }, { roll: 6, pips: 6, y: 2. / 6., x: 3. / 6. }, { roll: 3, pips: 2, y: 2. / 6., x: 4. / 6. }, { roll: 11, pips: 2, y: 2. / 6., x: 5. / 6. } ], borders: [ { file: 'borders-1.6.png', left: "sheep", right: "bank" }, { file: 'borders-2.1.png', center: "sheep" }, { file: 'borders-3.2.png', left: "wheat", right: "bank" }, { file: 'borders-4.3.png', center: "wood" }, { file: 'borders-5.4.png', left: "sheep", right: "bank" }, { file: 'borders-6.5.png', center: "bank" } ], developmentCards: [] }; for (let i = 0; i < 14; i++) { assetData.developmentCards.push("knight"); } for (let i = 0; i < 6; i++) { assetData.developmentCards.push("progress"); } for (let i = 0; i < 5; i++) { assetData.developmentCards.push("victoryPoint"); } const games = {}; router.get("/:id", (req, res/*, next*/) => { console.log("GET games/" + req.params.id); if (req.params.id in games) { const game = games[req.params.id]; return sendGame(res, req, game) } else { const error = `Game not found: ${req.params.id}`; return res.status(404).send(error); } }); router.put("/:id", (req, res/*, next*/) => { console.log("PUT games/" + req.params.id); if (req.params.id in games) { const game = games[req.params.id], changes = req.body; console.log(req.session.id, req.session.activePlayer); console.log(JSON.stringify(changes, null, 2)); for (let change in changes) { switch (change) { case "players": console.log("Player change."); for (let player in changes.players) { const playerChange = changes.players[player]; if (playerChange.name != "") { game.chat.push({ from: player, date: Date.now(), message: `${player} is now '${playerChange.name}'.` }); req.session.activePlayer = player; game.players[player].status = `Just joined`; } else { game.chat.push({ from: player, date: Date.now(), message: `${player} is no longer claimed.` }); req.session.activePlayer = ""; game.players[player].status = `Not active`; } game.players[player].name = playerChange.name; } break; case "chat": console.log("Chat change."); game.chat.push({ from: changes.chat.player, date: Date.now(), message: changes.chat.message }); if (game.chat.length > 10) { game.chat.splice(0, game.chat.length - 10); } break; } } return sendGame(res, req, game); } else { const error = `Game not found: ${req.params.id}`; return res.status(404).send(error); } }); const sendGame = (res, req, game) => { return res.status(200).send(Object.assign({}, game, { timestamp: Date.now(), activePlayer: (req.session && req.session.activePlayer) ? req.session.activePlayer : null })); } router.post("/", (req, res/*, next*/) => { console.log("POST games/"); const game = { startTime: Date.now(), state: "lobby", /* lobby, in-game, finished */ tiles: [], pips: [], borders: [], tokens: [], players: { R: { roads: 15, cities: 4, settlements: 5, points: 0, name: "", status: "Not active" }, O: { roads: 15, cities: 4, settlements: 5, points: 0, name: "", status: "Not active" }, B: { roads: 15, cities: 4, settlements: 5, points: 0, name: "", status: "Not active" }, W: { roads: 15, cities: 4, settlements: 5, points: 0, name: "", status: "Not active" } }, developmentCards: assetData.developmentCards.slice(), dice: [ 0, 0 ], sheep: 19, ore: 19, wool: 19, brick: 19, wheat: 19, longestRoad: null, largestArmy: null, chat: [ { from: "R", date: Date.now(), message: "Server initialized!" } ], id: crypto.randomBytes(8).toString('hex') }; [ "tiles", "pips", "borders" ].forEach((field) => { game[field] = [] for (let i = 0; i < assetData[field].length; i++) { game[field].push(i); } /* Shuffle an array of indexes */ shuffle(game[field]); /* Convert from an index array to a full array */ for (let i = 0; i < assetData[field].length; i++) { game[field][i] = assetData[field][game[field][i]]; } }); shuffle(game.developmentCards) games[game.id] = game; console.log(`New game created: ${game.id}`); return sendGame(res, req, game); }); /* return gameDB.sequelize.query("SELECT " + "photos.*,albums.path AS path,photohashes.hash,modified,(albums.path || photos.filename) AS filepath FROM photos " + "LEFT JOIN albums ON albums.id=photos.albumId " + "LEFT JOIN photohashes ON photohashes.photoId=photos.id " + "WHERE photos.id=:id", { replacements: { id: id }, type: gameDB.Sequelize.QueryTypes.SELECT, raw: true }).then(function(photos) { if (photos.length == 0) { return null; } */ if (0) { router.get("/*", (req, res/*, next*/) => { return gameDB.sequelize.query(query, { replacements: replacements, type: gameDB.Sequelize.QueryTypes.SELECT }).then((photos) => { }); }); } module.exports = router;