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;