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");