skipbo/src/index.mjs
2018-08-11 12:12:18 +02:00

93 lines
2.7 KiB
JavaScript

import cfg from "./cfg";
import express from "express";
import repl from "repl";
import http from "http";
import sio from "socket.io";
import path from "path";
function deck() {
return [
...[...Array(12)].map((_, i) => new Array(12).fill(++i)).reduce((a,b)=>[...b,...a])
, ...[...Array(18).fill(13)]
].map(a => [Math.random(), a]).sort((a, b) => a[0] - b[0]).map(a => a[1]);
}
const rooms = new Map();
function cards() {
this.hand = [];
this.pile = Array(cfg.iters.pile);
this.stock = [];
}
const fillHand = (room, player) => {
player.hand.push(...room.deck.splice(0, cfg.iters.hand - player.hand.length));
player.hand.sort((a, b) => a > b);
};
const fillStock = (room, player) => {
player.stock.push(...room.deck.splice(0, cfg.iters.stock));
};
const begin = room => room.player.forEach(player => {
fillHand(room, player.cards);
fillStock(room, player.cards);
});
const app = express();
const server = http.Server(app);
const io = sio(server);
server.listen(8080);
app
.use(express.static(path.resolve("src", "static")))
.get("/rooms", (req, res) => {
res.setHeader("Content-Type", "application/json");
res.send([...rooms.keys()]);
});
io.on("connection", socket => {
socket.emit("auth"); // initial ping
socket.on("player", data => { // playername, gameroom
socket.playername = data.playername;
socket.room = data.gameroom;
socket.join(data.gameroom);
if(!rooms.has(data.gameroom)) {
rooms.set(data.gameroom, {
player: new Map(Object.entries({ [data.playername]: { cards: new cards, leader: true }})),
deck: new deck,
mainstack: []
});
}
if(!rooms.get(data.gameroom).player.has(data.playername)) {
rooms.get(data.gameroom).player.set(data.playername, { cards: new cards, leader: false });
}
io.in(socket.room).emit("playerlist", [...rooms.get(data.gameroom).player.keys()]);
});
socket.on("disconnect", data => {
const roomname = socket.room;
const player = socket.playername;
const room = rooms.get(socket.room);
socket.disconnect(true);
room.player.delete(player);
io.in(roomname).emit("playerlist", [...room.player.keys()]);
if(room.player.size === 1)
room.player.get( [...room.player.keys()][0] ).leader = true;
if(room.player.size === 0)
rooms.delete(roomname);
});
socket.on("start", () => {
const room = rooms.get(socket.room);
if( room.player.get(socket.playername).leader ) {
begin(room);
io.in(socket.room).emit("gamestart", {
deck: room.deck,
mainstack: room.mainstack,
player: [...room.player]
});
}
});
});
const r = repl.start("> ");
r.context.rooms = rooms;