diff --git a/client/index.html b/client/index.html index 5f6958a..343f0de 100644 --- a/client/index.html +++ b/client/index.html @@ -7,6 +7,7 @@

Bonjour !

Ceci est une page statique servie par Express.

+

Temps restant : --

@@ -16,6 +17,10 @@ let myRole = null; console.log("Connecte au serveur, id :", socket.id); + socket.on("timer", (timeLeft) => { + document.getElementById("timerDisplay").textContent = `Temps restant : ${timeLeft}s`; + }); + socket.on("new_round", (startPos) => { player.x = startPos.x; player.y = startPos.y; @@ -130,6 +135,11 @@ } }) + socket.on("timeout", () => { + showGameOver("Temps ecoule. Vous avez perdu."); + }) + + socket.on("victory", ()=> { document.getElementById("victoryScreen").style.display = "block"; myRole = null; diff --git a/client/js/canvas.js b/client/js/canvas.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/canvas.js @@ -0,0 +1 @@ + diff --git a/client/js/main.js b/client/js/main.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/main.js @@ -0,0 +1 @@ + diff --git a/client/js/movement.js b/client/js/movement.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/movement.js @@ -0,0 +1 @@ + diff --git a/client/js/player.js b/client/js/player.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/player.js @@ -0,0 +1 @@ + diff --git a/client/js/role.js b/client/js/role.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/role.js @@ -0,0 +1 @@ + diff --git a/client/js/socket.js b/client/js/socket.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/socket.js @@ -0,0 +1 @@ + diff --git a/client/js/ui.js b/client/js/ui.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/js/ui.js @@ -0,0 +1 @@ + diff --git a/server.js b/server.js new file mode 100644 index 0000000..0e0c900 --- /dev/null +++ b/server.js @@ -0,0 +1,19 @@ +const express = require("express"); +const path = require("path"); +const http = require("http"); +const { Server } = require("socket.io"); + +const { PORT } = require("./config"); +const { registerSocketHandlers } = require("./socketHandlers"); + +const app = express(); +const server = http.createServer(app); +const wSS = new Server(server); // wSS pour webSocketServer + +app.use(express.static(path.join(__dirname, "..", "client"))); + +wSS.on("connection", (socket) => registerSocketHandlers(wSS, socket)); + +server.listen(PORT, () => { + console.log(`serveur demarre sur http://localhost:${PORT}`); +}); diff --git a/server/config.js b/server/config.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/config.js @@ -0,0 +1 @@ + diff --git a/server/doorLogic.js b/server/doorLogic.js new file mode 100644 index 0000000..25d4536 --- /dev/null +++ b/server/doorLogic.js @@ -0,0 +1,6 @@ +/* + doorLogic.js + + Sert a regrouper toute la logique autour des portes +*/ + diff --git a/server/gameState.js b/server/gameState.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/gameState.js @@ -0,0 +1 @@ + diff --git a/server/maze.js b/server/maze.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/maze.js @@ -0,0 +1 @@ + diff --git a/server/package.json b/server/package.json index 64c6f89..4b58248 100644 --- a/server/package.json +++ b/server/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" }, "keywords": [], "author": "", diff --git a/server/server.js b/server/server.js index d25e856..47ec520 100644 --- a/server/server.js +++ b/server/server.js @@ -1,117 +1,12 @@ -const express = require('express'); -const path = require('path'); -const http = require('http'); -const { Server } = require('socket.io'); +/* + server.js -const app = express(); -const server = http.createServer(app); -const io = new Server(server); + Ce fichier sert principalement de point d'entree au programme serveur et a lancer tous les modules necessaires a son fonctionnement +*/ -const PORT = process.env.PORT || 3000; +const express = require("express"); +const path = require("path"); +const http = require("http"); +const { Server } = require("socket.io"); -let waitingPlayer = null; - -// Sert tous les fichiers du dossier "client" -app.use(express.static(path.join(__dirname, "..", "client"))); - -const correctDoor = { x : 2, y : 6}; -const DOORS_TO_WIN = 3; - -io.on("connection", (socket) => { - console.log("Un client s'est connecte : ${socket.id}"); - - if (waitingPlayer === null){ - waitingPlayer = socket; - socket.emit("status", "En attente d'un second joueur..."); - } else { - const partner = waitingPlayer; - waitingPlayer = null; - - const socketIsGuide = Math.random() < 0.5; - const socketRole = socketIsGuide ? "guide" : "explorateur"; - const partnerRole = socketIsGuide ? "explorateur" : "guide"; - - socket.data.partnerId = partner.id; - partner.data.partnerId = socket.id; - - socket.emit("status", "Partie prete !"); - partner.emit("status", "Partie prete !"); - - socket.data.role = socketRole; - partner.data.role = partnerRole; - - const pairState = { gameOver: false, doorsPassed: 0}; - socket.data.pairState = pairState; - partner.data.pairState = pairState; - - socket.emit("role", socketRole); - partner.emit("role", partnerRole); -} - - socket.on("message", (data) => { - const partnerId = socket.data.partnerId; - if (partnerId){ - io.to(partnerId).emit("message", data); - } - }); - - socket.on("door_reached", (position) => { - const pairState = socket.data.pairState; - if (!pairState || pairState.gameOver) return; - - const partnerId = socket.data.partnerId; - const partnerSocket = io.sockets.sockets.get(partnerId); - const isCorrect = position.x === correctDoor.x && position.y === correctDoor.y; - - if (!isCorrect){ - pairState.gameOver = true; - const result = { correct: false}; - socket.emit("door_result", result); - if (partnerSocket) partnerSocket.emit("door_result", result); - return; - } - - pairState.doorsPassed++; - - if (pairState.doorsPassed >= DOORS_TO_WIN){ - pairState.gameOver = true; - socket.emit("victory"); - if (partnerSocket) partnerSocket.emit("victory"); - return; - } - - const temp = socket.data.role; - socket.data.role = partnerSocket.data.role; - partnerSocket.data.role = temp; - - const startPos = { x: 1, y: 1}; - - console.log(pairState); - const result = {correct: isCorrect}; - - socket.emit("door_result", { correct: true}); - socket.emit("new_round", startPos); - socket.emit("role", socket.data.role); - - if (partnerSocket){ - partnerSocket.emit("door_result", { correct: true }); - partnerSocket.emit("new_round", startPos); - partnerSocket.emit("role", partnerSocket.data.role); - } - - if (partnerId){ - io.to(partnerId).emit("door_result", result); - } - }); - - socket.on("disconnect", () => { - console.log("Client deconnecte : ${socket.id}"); - if (waitingPlayer === socket){ - waitingPlayer = null; - } - }); -}); - -server.listen(PORT, () => { - console.log(`Serveur démarré sur http://localhost:${PORT}`); -}); +const { PORT } = require("./config.js"); diff --git a/server/socketHandler.js b/server/socketHandler.js new file mode 100644 index 0000000..b98fc08 --- /dev/null +++ b/server/socketHandler.js @@ -0,0 +1,63 @@ +/* + socketHandlers.js + + Sert a regrouper tous ce qui passe dans une seule connexion +*/ + +const gameState = require("./gameState"); +const { GAME_DURATION } = require("./config"); +const { handleDoorReached } = require("./doorLogic"); +const { startTimer } = require("./timer"); + +function registerSocketHandlers(io, socket) { + console.log(`Un client s'est connecté : ${socket.id}`); + + if (gameState.waitingPlayer === null) { + gameState.waitingPlayer = socket; + socket.emit("status", "En attente d'un second joueur..."); + } else { + const partner = gameState.waitingPlayer; + gameState.waitingPlayer = null; + + const socketIsGuide = Math.random() < 0.5; + const socketRole = socketIsGuide ? "guide" : "explorateur"; + const partnerRole = socketIsGuide ? "explorateur" : "guide"; + + socket.data.role = socketRole; + partner.data.role = partnerRole; + socket.data.partnerId = partner.id; + partner.data.partnerId = socket.id; + + // État partagé par référence entre les deux sockets de la paire + const pairState = { gameOver: false, doorsPassed: 0, timeLeft: GAME_DURATION }; + socket.data.pairState = pairState; + partner.data.pairState = pairState; + + socket.emit("role", socketRole); + partner.emit("role", partnerRole); + socket.emit("status", "Partie prête !"); + partner.emit("status", "Partie prête !"); + + startTimer(socket, partner, pairState); + } + + socket.on("door_reached", (position) => handleDoorReached(io, socket, position)); + + socket.on("disconnect", () => { + console.log(`Client déconnecté : ${socket.id}`); + + if (gameState.waitingPlayer === socket) { + gameState.waitingPlayer = null; + } + + const partnerId = socket.data.partnerId; + if (partnerId) { + const partnerSocket = wSS.sockets.sockets.get(partnerId); + if (partnerSocket){ + partnerSocket.emit("status", "Ton partenaire s'est deconnecte"); + } + } + )}; +} + +module.exports = { registerSocketHandlers }; diff --git a/server/timer.js b/server/timer.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/timer.js @@ -0,0 +1 @@ +