From 553f09cc7c3adfdb479e55aeaef767994630ccc4 Mon Sep 17 00:00:00 2001 From: Meleeman01 Date: Tue, 19 Nov 2024 06:16:26 -0600 Subject: [PATCH] added basic scaffold for wheel of fortune --- index.html | 92 +++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 49 ++++++++++++++++++++++++ package.json | 15 ++++++++ puzzles.json | 24 ++++++++++++ server.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 275 insertions(+) create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 puzzles.json create mode 100644 server.js diff --git a/index.html b/index.html new file mode 100644 index 0000000..3d18d63 --- /dev/null +++ b/index.html @@ -0,0 +1,92 @@ + + + + + Multiplayer Game + + + + + + +
+ + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..aaebe3d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,49 @@ +{ + "name": "wheeloffortune", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wheeloffortune", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "uuid": "^11.0.2", + "ws": "^8.18.0" + } + }, + "node_modules/uuid": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.2.tgz", + "integrity": "sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8ae5198 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "wheeloffortune", + "version": "1.0.0", + "description": "play Wheel Of Fortune with friends online", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Meleeman", + "license": "MIT", + "dependencies": { + "uuid": "^11.0.2", + "ws": "^8.18.0" + } +} diff --git a/puzzles.json b/puzzles.json new file mode 100644 index 0000000..7753588 --- /dev/null +++ b/puzzles.json @@ -0,0 +1,24 @@ +[ + { + "given": ["a","b","r"], + "answer": "naggers", + "category": "people who annoy you" + }, + { + "given": ["a","b","r"], + "answer": "karen", + "category": "people who annoy you" + }, + { + "given": ["a","b","r"], + "answer": "Andy", + "category": "people who annoy you" + }, + { + "given": ["a","b","r"], + "answer": "Wet Back", + "category":"alternative names" + } +] + + diff --git a/server.js b/server.js new file mode 100644 index 0000000..a278302 --- /dev/null +++ b/server.js @@ -0,0 +1,95 @@ +const WebSocket = require("ws"); +const { v4: uuidv4 } = require("uuid"); +const puzzles = require('./puzzles.json'); +const crypto = require('crypto'); + +const wss = new WebSocket.Server({ port: 8080 }); +const rooms = {}; // Stores rooms and their clients +const wheel = [ + 'lose a turn',800,350,450,700,300,600,5000, + 300,600,300,500,800,550,400,300,900,500,'spin again', + 900,'Bankrupt',600,400,300 +] //represents wheel in wheel of fortune game. +function getRandomValue(array) { + const randomIndex = crypto.randomInt(0, array.length); + return array[randomIndex]; +} + +// server.js +wss.on("connection", (ws) => { + ws.on("message", (message) => { + const data = JSON.parse(message); + + if (data.type === "create_room") { + const roomCode = uuidv4().slice(0, 5); + rooms[roomCode] = { clients: [ws], leader: ws, gameState: {} }; + ws.roomCode = roomCode; + ws.send(JSON.stringify({ type: "room_created", roomCode, isLeader: true })); + } + + if (data.type === "join_room") { + const { roomCode } = data; + if (rooms[roomCode]) { + rooms[roomCode].clients.push(ws); + ws.roomCode = roomCode; + ws.send(JSON.stringify({ type: "joined_room", roomCode, isLeader: rooms[roomCode].leader === ws })); + } else { + ws.send(JSON.stringify({ type: "error", message: "Room not found" })); + } + } + + if (data.type === "start_game") { + const room = rooms[ws.roomCode]; + console.log('game started for:',room); + if (room && room.leader === ws) { + room.clients.forEach((client) => { + client.send(JSON.stringify({ type: "game_started", roomCode: ws.roomCode })); + }); + } else { + ws.send(JSON.stringify({ type: "error", message: "Only the leader can start the game" })); + } + } + + if (data.type === "spin_wheel" || data.type === "guess_letter") { + const room = rooms[ws.roomCode]; + if (room && room.clients.includes(ws)) { + // Handle spin and guess events + if (data.type === "spin_wheel") { + // Simulate a wheel spin result and update room state + const spinResult = getRandomValue(wheel); + room.gameState.spinResult = spinResult; + room.clients.forEach((client) => + client.send(JSON.stringify({ type: "spin_result", spinResult, player: ws === room.leader ? "Leader" : "Player" })) + ); + } + + if (data.type === "guess_letter") { + const { letter } = data; + // Handle guess logic (e.g., check if the letter is in the puzzle) + const correctGuess = Math.random() > 0.5; // Random outcome for simplicity + room.gameState.lastGuess = { letter, correct: correctGuess }; + room.clients.forEach((client) => + client.send(JSON.stringify({ type: "guess_result", letter, correct: correctGuess, player: ws === room.leader ? "Leader" : "Player" })) + ); + } + } else { + ws.send(JSON.stringify({ type: "error", message: "You are not in this room" })); + } + } + }); + + ws.on("close", () => { + if (ws.roomCode && rooms[ws.roomCode]) { + const room = rooms[ws.roomCode]; + room.clients = room.clients.filter((client) => client !== ws); + if (room.leader === ws && room.clients.length > 0) { + room.leader = room.clients[0]; + room.leader.send(JSON.stringify({ type: "new_leader" })); + } + if (room.clients.length === 0) delete rooms[ws.roomCode]; + } + }); +}); + + +console.log("WebSocket server is running on ws://localhost:8080");