1
0
James Ketrenos 5a16804a7e Create game and persist in memory.
Signed-off-by: James Ketrenos <james_gitlab@ketrenos.com>
2020-04-21 18:30:20 -07:00

182 lines
5.2 KiB
JavaScript
Executable File

"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 /" + req.params.id);
if (req.params.id in games) {
return res.status(200).send(games[req.params.id]);
} else {
const error = `Game not found: ${req.params.id}`;
return res.status(404).send(error);
}
});
router.post("/", (req, res/*, next*/) => {
console.log("POST /");
const game = {
startTime: Date.now(),
tiles: [],
pips: [],
borders: [],
tokens: [
{ player: "R", roads: 15, cities: 4, settlements: 5, points: 0 },
{ player: "O", roads: 15, cities: 4, settlements: 5, points: 0 },
{ player: "B", roads: 15, cities: 4, settlements: 5, points: 0 },
{ player: "W", roads: 15, cities: 4, settlements: 5, points: 0 }
],
developmentCards: assetData.developmentCards.slice(),
sheep: 19,
ore: 19,
wool: 19,
brick: 19,
wheat: 19,
longestRoad: null,
largestArmy: null,
id: crypto.randomBytes(20).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;
return res.status(200).send(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;