93 lines
2.7 KiB
JavaScript
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; |