diff --git a/Index.js b/Index.js new file mode 100644 index 0000000..a10fef8 --- /dev/null +++ b/Index.js @@ -0,0 +1,12 @@ +npm install express ws +const { createHttpServer } = require("./src/server/httpServer"); +const { createWSServer } = require("./src/server/wsServer"); + +const server = createHttpServer(); +createWSServer(server); + +const PORT = process.env.PORT || 3000; + +server.listen(PORT, () => { + console.log(`Multiplayer backend running on port ${PORT}`); +}); \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..6ca47a7 --- /dev/null +++ b/app.js @@ -0,0 +1,33 @@ +const express = require("express"); +const http = require("http"); +const WebSocket = require("ws"); +const { handleEvent } = require("./game"); + +const app = express(); +app.use(express.json()); + +// HTTP test route +app.get("/health", (req, res) => { + res.json({ status: "ok" }); +}); + +// create server +const server = http.createServer(app); + +// websocket layer +const wss = new WebSocket.Server({ server }); + +wss.on("connection", (ws) => { + ws.on("message", (msg) => { + try { + const event = JSON.parse(msg); + handleEvent(event, ws, wss); + } catch (e) { + console.log("bad message"); + } + }); + + ws.send(JSON.stringify({ type: "welcome" })); +}); + +module.exports = server; \ No newline at end of file diff --git a/game.js b/game.js new file mode 100644 index 0000000..f826f14 --- /dev/null +++ b/game.js @@ -0,0 +1,48 @@ +const gameState = { + players: {}, + status: "waiting" +}; + +function handleEvent(event, ws, wss) { + + if (event.type === "join") { + gameState.players[event.playerId] = { + id: event.playerId, + x: 0, + y: 0 + }; + + ws.send(JSON.stringify({ + type: "joined", + state: gameState + })); + } + + if (event.type === "move") { + const p = gameState.players[event.playerId]; + if (!p) return; + + p.x = event.x; + p.y = event.y; + + broadcast(wss); + } + + if (event.type === "start") { + gameState.status = "live"; + broadcast(wss); + } +} + +function broadcast(wss) { + wss.clients.forEach(c => { + if (c.readyState === 1) { + c.send(JSON.stringify({ + type: "state", + state: gameState + })); + } + }); +} + +module.exports = { handleEvent }; \ No newline at end of file