From 5b10e60950b46b6778b8846795dfa678fe8770d8 Mon Sep 17 00:00:00 2001
From: "julien.bouin.etu" <julien.bouin.etu@univ-lille.fr>
Date: Sun, 7 Apr 2024 10:43:31 +0200
Subject: [PATCH] debut du scoreboard

---
 client/public/css/main.css |   6 +-
 client/public/index.html   |  47 ++---
 client/src/main.js         |  29 ++-
 client/src/render.js       |  35 ++++
 client/src/scoreboard.json | 101 +++++++++--
 common/avatar.js           |   4 +-
 server/ScoreBoard.js       |  30 ++++
 server/gameLogic.js        | 144 ---------------
 server/index.js            | 355 +++++++++++++++++--------------------
 9 files changed, 366 insertions(+), 385 deletions(-)
 create mode 100644 server/ScoreBoard.js
 delete mode 100644 server/gameLogic.js

diff --git a/client/public/css/main.css b/client/public/css/main.css
index 82754b6..fedccf3 100644
--- a/client/public/css/main.css
+++ b/client/public/css/main.css
@@ -61,9 +61,7 @@ button {
   text-align: center;
   text-decoration: none;
   transition: all .15s;
-  user-select: none;
-  -webkit-user-select: none;
-  touch-action: manipulation;
+
 }
 
 button:hover {
@@ -160,6 +158,4 @@ section .air.air4{
   100%{
     background-position-x: -1000px; 
   }
-}.hidden {
-  display: none;
 }
\ No newline at end of file
diff --git a/client/public/index.html b/client/public/index.html
index abdd408..41ec37b 100644
--- a/client/public/index.html
+++ b/client/public/index.html
@@ -2,30 +2,35 @@
 <html>
 
 <head>
-	<meta charset="UTF-8">
-	<meta name="viewport" content="width=device-width, initial-scale=1" />
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
 
-	<title>ça geek</title>
+    <title>ça geek</title>
     <link rel="shortcut icon" href="images/favicon.ico" />
-	<link rel="stylesheet" href="css/main.css" />
+    <link rel="stylesheet" href="css/main.css" />
 
-	<script src="build/main.bundle.js" defer></script>
+    <script src="build/main.bundle.js" defer></script>
 </head>
+
 <body>
-	<section class='animation'>
-		<div class='air air1'></div>
-		<div class='air air2'></div>
-		<div class='air air3'></div>
-		<div class='air air4'></div>
-		<div class="vide"></div>
-		<div class="divMain">  
-			<h1>ça geek</h1>
-			<button class="buttonStart">Play</button>
-			<button class="scoreBoard">ScoreBoard</button>
-			<button class="credits">Credits</button>
-	  </section>
-	</div>
-	
-	<canvas class="gameCanvas" style="display: none;"></canvas>
+    <section class='animation'>
+        <div class='air air1'></div>
+        <div class='air air2'></div>
+        <div class='air air3'></div>
+        <div class='air air4'></div>
+        <div class="vide"></div>
+        <div class="divMain">
+            <h1>ça geek</h1>
+            <!-- Champ d'entrée pour le pseudo -->
+			<div id="pseudoInput" contenteditable="true" placeholder="Entrez votre pseudo"></div>
+
+            <button class="buttonStart">Play</button>
+            <button class="scoreBoard">ScoreBoard</button>
+            <button class="credits">Credits</button>
+        </div>
+    </section>
+
+    <canvas class="gameCanvas" style="display: none;"></canvas>
 </body>
-</html>
\ No newline at end of file
+
+</html>
diff --git a/client/src/main.js b/client/src/main.js
index 142b376..260b5f8 100644
--- a/client/src/main.js
+++ b/client/src/main.js
@@ -47,6 +47,21 @@ function startGame(event) {
 	socket.emit('canvasSize', canvasSize);
 }
 
+document.querySelector('.buttonStart').addEventListener('click', inputPseudo);
+
+function inputPseudo(event) {
+	const pseudo = prompt('Veuillez saisir votre pseudo :');
+
+	if (pseudo !== null && pseudo.trim() !== '') {
+		socket.emit('pseudo', pseudo);
+
+		const canvasSize = affichage.startGame(event, canvas);
+		socket.emit('canvasSize', canvasSize);
+	} else {
+		alert('Veuillez saisir un pseudo valide');
+	}
+}
+
 const canvasResizeObserver = new ResizeObserver(() => resampleCanvas());
 canvasResizeObserver.observe(canvas);
 
@@ -62,6 +77,12 @@ function render() {
 	context.clearRect(0, 0, canvas.width, canvas.height);
 	renderObject.renderBackground(canvas);
 	gameStarted = affichage.isGameStarted();
+	socket.on('enemis', data => {
+		newEnemis = data;
+	});
+	socket.on('bonusArray', data => {
+		newBonus = data;
+	});
 
 	if (gameStarted) {
 		context.font = '40pt New Super Mario Font U';
@@ -90,10 +111,6 @@ function renderProjectiles() {
 }
 
 function renderBonuses() {
-	socket.on('bonusArray', data => {
-		newBonus = data;
-	});
-
 	newBonus.forEach(bonus => {
 		const img = new Image();
 		img.src = bonusImages[bonus.choix];
@@ -104,10 +121,6 @@ function renderBonuses() {
 }
 
 function renderEnemies() {
-	socket.on('enemis', data => {
-		newEnemis = data;
-	});
-
 	newEnemis.forEach(enemi => {
 		renderObject.renderEnnemi(canvas, context, enemi.x, enemi.y, enemi);
 	});
diff --git a/client/src/render.js b/client/src/render.js
index e9343b3..b341703 100644
--- a/client/src/render.js
+++ b/client/src/render.js
@@ -78,4 +78,39 @@ export default class Render {
 			.getContext('2d')
 			.drawImage(this.background, 0, 0, canvas.width, canvas.height);
 	}
+	renderProjectiles(context, avatars) {
+		for (const avatarId in avatars) {
+			const avatar = avatars[avatarId];
+			context.drawImage(avatar.image, avatar.x, avatar.y);
+			if (avatar.projectiles) {
+				avatar.projectiles.forEach(projectile => {
+					context.drawImage(this.imageProjectile, projectile.x, projectile.y);
+				});
+			}
+		}
+	}
+
+	renderBonuses(canvas, context, bonuses) {
+		bonuses.forEach(bonus => {
+			let img = new Image();
+			img.src = bonusImages[bonus.choix];
+			img.width = 75;
+			img.height = 75;
+			draw(canvas, context, img, bonus.x, bonus.y);
+		});
+	}
+
+	renderEnemies(canvas, context, enemies) {
+		enemies.forEach(enemy => {
+			let image;
+			if (enemy.difficulté == 1) {
+				image = this.imageEnemi;
+			} else if (enemy.difficulté == 2) {
+				image = this.imageEnemi2;
+			} else if (enemy.difficulté == 3) {
+				image = this.imageEnemi3;
+			}
+			draw(canvas, context, image, enemy.x, enemy.y);
+		});
+	}
 }
diff --git a/client/src/scoreboard.json b/client/src/scoreboard.json
index b0486a3..9db723e 100644
--- a/client/src/scoreboard.json
+++ b/client/src/scoreboard.json
@@ -1,17 +1,86 @@
 {
-    "results": [
-      {
-        "nom": "Joueur 1",
-        "score": 100
-      },
-      {
-        "nom": "Joueur 2",
-        "score": 200
-      },
-      {
-        "nom": "Joueur 3",
-        "score": 150
-      }
-    ]
-  }
-  
\ No newline at end of file
+  "results": [
+    {
+      "nom": "Joueur 1",
+      "score": 100
+    },
+    {
+      "nom": "Joueur 2",
+      "score": 200
+    },
+    {
+      "nom": "Joueur 3",
+      "score": 150
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "nom": "Joueur 4",
+      "score": 180
+    },
+    {
+      "score": -15
+    },
+    {
+      "score": -10
+    },
+    {
+      "nom": "julien",
+      "score": -15
+    }
+  ]
+}
\ No newline at end of file
diff --git a/common/avatar.js b/common/avatar.js
index 809a10b..c962f44 100644
--- a/common/avatar.js
+++ b/common/avatar.js
@@ -15,8 +15,9 @@ export class Avatar extends Entite {
 	statut;
 	statutTime;
 	spectateur;
+	pseudo;
 
-	constructor(nom, id, canvasSize) {
+	constructor(nom, id, canvasSize, pseudo) {
 		super(0, 0, new Hitbox(68, 145, 0, 0), null);
 		this.nom = nom;
 		this.score = 0;
@@ -30,6 +31,7 @@ export class Avatar extends Entite {
 		this.canvasSize = canvasSize;
 		this.id = id;
 		this.spectateur = false;
+		this.pseudo = pseudo;
 	}
 
 	setSpectateur() {
diff --git a/server/ScoreBoard.js b/server/ScoreBoard.js
new file mode 100644
index 0000000..fd04dcb
--- /dev/null
+++ b/server/ScoreBoard.js
@@ -0,0 +1,30 @@
+import fs from 'fs';
+
+export class GestionScore {
+	constructor(jsonFilePath) {
+		this.jsonFilePath = jsonFilePath;
+	}
+
+	afficherScores() {
+		try {
+			const data = fs.readFileSync(this.jsonFilePath);
+			const scores = JSON.parse(data);
+			console.log('Scores actuels :');
+			console.log(scores.results);
+		} catch (error) {
+			console.error('Erreur lors de la lecture du fichier JSON :', error);
+		}
+	}
+
+	ajouterScore(nom, score) {
+		try {
+			const data = fs.readFileSync(this.jsonFilePath);
+			const scores = JSON.parse(data);
+			scores.results.push({ nom: nom, score: score });
+			fs.writeFileSync(this.jsonFilePath, JSON.stringify(scores, null, 2));
+			console.log('Score ajouté avec succès !');
+		} catch (error) {
+			console.error("Erreur lors de l'ajout du score :", error);
+		}
+	}
+}
diff --git a/server/gameLogic.js b/server/gameLogic.js
deleted file mode 100644
index 13b80cc..0000000
--- a/server/gameLogic.js
+++ /dev/null
@@ -1,144 +0,0 @@
-import timer from './timer.js';
-
-export function updateGame(
-	io,
-	enemis,
-	bonusArray,
-	avatars,
-	canvasSize,
-	t,
-	firstAvatar,
-	gameStarted,
-	cptConnexion
-) {
-	io.emit('enemis', enemis);
-	io.emit('bonusArray', bonusArray);
-
-	const areAvatarsActive = avatars.some(avatar => !avatar.spectateur);
-
-	if (firstAvatar && areAvatarsActive) {
-		handleActiveAvatars(io, avatars, updateAvatar, canvasSize, t);
-	} else {
-		endGame(io, t, avatars, gameStarted, cptConnexion);
-	}
-}
-
-export function handleActiveAvatars(io, avatars, updateAvatar, canvasSize, t) {
-	const avatarData = [];
-	avatars.forEach(avatar => {
-		updateAvatar(avatar, avatarData, canvasSize, t);
-	});
-	io.emit('avatarsData', avatarData);
-}
-
-export function updateAvatar(avatar, avatarData, canvasSize, t, enemis) {
-	avatar.canvasSize = canvasSize;
-	if (
-		avatar.getStatut() === 'invincibilite' &&
-		t.getTotalTime() - avatar.getStatutTime() === 15
-	) {
-		avatar.setStatut('null');
-	}
-
-	avatar.projectiles.forEach(projectile => projectile.deplacer());
-
-	if (!avatar.spectateur) {
-		avatarData.push({
-			id: avatar.id,
-			x: avatar.getX(),
-			y: avatar.getY(),
-			projectiles: avatar.projectiles,
-			vies: avatar.getVies(),
-			score: avatar.getScore(),
-			socketId: avatar.nom,
-		});
-	}
-
-	handleAvatarEnemiCollisions(avatar, enemis);
-	handleAvatarBonusCollisions(avatar, t);
-}
-
-export function handleAvatarEnemiCollisions(avatar, enemis) {
-	enemis.forEach(enemi => {
-		if (
-			enemi.hitbox.colision(avatar.hitbox) &&
-			avatar.getStatut() !== 'invincibilite'
-		) {
-			handleAvatarEnemiCollisionEffects(avatar, enemi);
-		}
-
-		if (enemi.getVies() < 0) {
-			avatar.incrementScore(5);
-			enemis.splice(enemis.indexOf(enemi), 1);
-		}
-
-		enemi.deplacer();
-
-		avatar.projectiles.forEach(projectile => {
-			if (projectile.hitbox.colision(enemi.hitbox)) {
-				avatar.projectiles.splice(avatar.projectiles.indexOf(projectile), 1);
-				handleProjectileEnemiCollisionEffects(enemi);
-			}
-		});
-	});
-}
-
-export function handleAvatarEnemiCollisionEffects(avatar, enemi) {
-	avatar.decrementScore(5);
-	enemis.splice(enemis.indexOf(enemi), 1);
-	avatar.perdreVie();
-
-	if (canLostLifeAvatar) {
-		canLostLifeAvatar = false;
-		setTimeout(() => {
-			canLostLifeAvatar = true;
-		}, 100);
-	}
-
-	if (avatar.getVies() === 0) {
-		avatar.setSpectateur();
-		io.emit('dead', avatar.id);
-	}
-}
-
-export function handleProjectileEnemiCollisionEffects(enemi) {
-	enemi.perdreVie();
-
-	if (canLostLifeEnemi) {
-		canLostLifeEnemi = false;
-		setTimeout(() => {
-			canLostLifeEnemi = true;
-		}, 1000 / 60);
-	}
-}
-
-export function handleAvatarBonusCollisions(avatar, t) {
-	bonusArray.forEach(bonus => {
-		if (bonus.hitbox.colision(avatar.hitbox)) {
-			handleBonusCollisionEffects(avatar, bonus, t);
-		}
-
-		if (bonus.estExpire(t.getTotalTime())) {
-			bonusArray.splice(bonusArray.indexOf(bonus), 1);
-		}
-	});
-}
-
-export function handleBonusCollisionEffects(avatar, bonus, t) {
-	if (bonusNoms[bonus.getChoix()] === 'vie') {
-		avatar.gagnerVie();
-	} else if (bonusNoms[bonus.getChoix()] === 'invincibilite') {
-		avatar.setStatut('invincibilite');
-		avatar.setStatutTime(t.getTotalTime());
-	}
-
-	bonusArray.splice(bonusArray.indexOf(bonus), 1);
-}
-
-export function endGame(io, t, avatars, gameStarted, cptConnexion) {
-	gameStarted = false;
-	cptConnexion = 0;
-	t = new timer();
-	avatars.length = 0;
-	io.emit('endGame', true);
-}
diff --git a/server/index.js b/server/index.js
index 11a5c5d..2f86d3c 100644
--- a/server/index.js
+++ b/server/index.js
@@ -1,4 +1,3 @@
-// server.js
 import express from 'express';
 import http from 'http';
 import addWebpackMiddleware from './middlewares/addWebpackMiddleware.js';
@@ -9,34 +8,31 @@ import { Coordinate } from '../common/Coordinate.js';
 import timer from './timer.js';
 import Bonus from './bonus.js';
 import { bonusImages, bonusNoms, bonusTaille } from '../common/utils.js';
+import { GestionScore } from './ScoreBoard.js';
 
 const app = express();
-const httpServer = http.createServer(app);
-const io = new IOServer(httpServer);
 
-const canvasSize = new Coordinate(1920, 1261);
-let gameStarted = false;
-let t = new timer();
+let canvasSize = new Coordinate(1920, 1261);
+
 let canLostLifeAvatar = true;
 let canLostLifeEnemi = true;
-let firstAvatar = false;
-let cptConnexion = 0;
-let canShoot = true;
-let LVL2start = false;
-let LVL3start = false;
-const avatars = [];
-const enemis = [];
-const bonusArray = [];
+let gameStarted = false;
+
+let t = new timer();
+
+const httpServer = http.createServer(app);
+const fileOptions = { root: process.cwd() };
+addWebpackMiddleware(app);
+
+const io = new IOServer(httpServer);
 
 app.use(express.static('client/public'));
-const port = process.env.PORT == null ? 8000 : process.env.PORT;
 
+const port = process.env.PORT == null ? 8000 : process.env.PORT;
 httpServer.listen(port, () => {
 	console.log(`Server running at http://localhost:${port}/`);
 });
 
-addWebpackMiddleware(app);
-
 setInterval(function () {
 	if (gameStarted) {
 		t.addTime();
@@ -46,87 +42,109 @@ setInterval(function () {
 	}
 }, 1000);
 
+const avatars = [];
+const enemis = [];
+const bonusArray = [];
+
+let cpt = 0;
+let canShoot = true;
+let LVL2start = false;
+let LVL3start = false;
+let firstAvatar = false;
+const gestionScore = new GestionScore('client/src/scoreboard.json');
+
 io.on('connection', socket => {
-	cptConnexion++;
-	if (cptConnexion <= 4) {
+	cpt++;
+	if (cpt <= 4) {
 		firstAvatar = true;
-		const avatar = new Avatar(`${socket.id}`, cptConnexion);
-		io.emit('newAvatar', {
-			id: cptConnexion,
-			x: avatar.getX(),
-			y: avatar.getY(),
-		});
+		const avatar = new Avatar(`${socket.id}`, cpt);
+		io.emit('newAvatar', { id: cpt, x: avatar.getX(), y: avatar.getY() });
 		avatars.push(avatar);
+		socket.on('pseudo', pseudo => {
+			avatar.pseudo = pseudo;
+		});
 
 		socket.on('disconnect', () => {
-			const disconnectedAvatarIndex = avatars.findIndex(
-				avatar => avatar.nom === socket.id
-			);
-			if (disconnectedAvatarIndex !== -1) {
-				io.emit('disconnectEvent', avatars[disconnectedAvatarIndex].id);
-				avatars.splice(disconnectedAvatarIndex, 1);
-			}
-			console.log(`Client disconnected: ${socket.id}`);
+			avatars.forEach(avatar => {
+				if (avatar.nom == socket.id) {
+					io.emit('disconnectEvent', avatar.id);
+					avatars.splice(avatars.indexOf(avatar), 1);
+				}
+			});
+			console.log(`Déconnexion du client ${socket.id}`);
 		});
 
 		socket.on('start', s => {
-			if (s && cptConnexion !== 0) {
+			if (s == true && cpt != 0) {
 				gameStarted = s;
-			} else if (cptConnexion === 0) {
+			} else if (cpt == 0) {
 				gameStarted = false;
 			}
 		});
 
-		// Handling click events
 		socket.on('clickEvent', clickEvent => {
 			const playerAvatar = avatars.find(avatar => avatar.nom === clickEvent.id);
 			if (playerAvatar) {
 				playerAvatar.click[clickEvent.key] = clickEvent.pressed;
 			} else {
-				console.log(`No avatar found with the name ${clickEvent.id}`);
+				console.log(`Aucun avatar trouvé avec le nom ${clickEvent.id}`);
 			}
 		});
 
 		socket.on('shoot', shoot => {
 			const playerAvatar = avatars.find(avatar => avatar.nom === shoot.id);
-			if (canShoot && playerAvatar) {
+
+			if (canShoot) {
 				playerAvatar.tirer();
 				canShoot = false;
-				setTimeout(() => {
+				setTimeout(function () {
 					canShoot = true;
 				}, 200);
 			}
 		});
 
 		socket.on('canvasSize', canvasSize => {
+			console.log(canvasSize);
 			canvasSize = canvasSize;
 		});
 	}
 });
 
-const spawnIntervals = [
-	{ delay: 1000, startCondition: () => gameStarted },
-	{ delay: 800, startCondition: () => LVL2start && gameStarted },
-	{ delay: 4000, startCondition: () => LVL3start && gameStarted },
-];
-
-spawnIntervals.forEach(({ delay, startCondition }, index) => {
-	setInterval(() => {
-		if (startCondition()) {
-			let randomY =
-				Math.random() * (canvasSize.height - (index === 0 ? 0 : 100));
-			const newEnemy = new enemi(
-				canvasSize.width - (index === 0 ? 0 : 100),
-				randomY,
-				index,
-				index + 1
-			);
-			enemis.push(newEnemy);
+let spawnIntervalLV1 = setInterval(() => {
+	if (gameStarted) {
+		if (t.getMin() >= 1) {
+			LVL2start = true;
+		}
+		if (t.getSec() >= 30) {
+			LVL3start = true;
 		}
-	}, delay);
-});
 
-setInterval(() => {
+		let randomY = Math.random() * (canvasSize.height - 0) + 0;
+		do {
+			randomY = Math.random() * (canvasSize.height - 0) + 0;
+		} while (randomY > canvasSize.height - 57);
+		const newEnemy = new enemi(canvasSize.width, randomY, 0, 1);
+		enemis.push(newEnemy);
+	}
+}, 1000);
+
+let spawnIntervalLV2 = setInterval(() => {
+	if (LVL2start && gameStarted) {
+		let randomY = Math.random() * (canvasSize.height - 100);
+		const newEnemy = new enemi(canvasSize.width - 100, randomY, 1, 2);
+		enemis.push(newEnemy);
+	}
+}, 800);
+
+let spawnIntervalLV3 = setInterval(() => {
+	if (LVL3start && gameStarted) {
+		let randomY = Math.random() * (canvasSize.height - 100);
+		const newEnemy = new enemi(canvasSize.width - 100, randomY, 1, 3);
+		enemis.push(newEnemy);
+	}
+}, 4000);
+
+let spawnBonusInterval = setInterval(() => {
 	if (gameStarted) {
 		let randomX;
 		let randomY;
@@ -143,140 +161,97 @@ setInterval(() => {
 }, 15000);
 
 setInterval(() => {
-	updateGame();
-}, 1000 / 60);
-
-function updateGame() {
 	io.emit('enemis', enemis);
 	io.emit('bonusArray', bonusArray);
 
-	const areAvatarsActive = avatars.some(avatar => !avatar.spectateur);
+	let areAvatarsActive = avatars.some(avatar => !avatar.spectateur);
 
 	if (firstAvatar && areAvatarsActive) {
-		handleActiveAvatars();
-	} else {
-		endGame();
-	}
-}
-
-function handleActiveAvatars() {
-	const avatarData = [];
-	avatars.forEach(avatar => {
-		updateAvatar(avatar, avatarData);
-	});
-	io.emit('avatarsData', avatarData);
-}
-
-function updateAvatar(avatar, avatarData) {
-	avatar.canvasSize = canvasSize;
-	if (
-		avatar.getStatut() === 'invincibilite' &&
-		t.getTotalTime() - avatar.getStatutTime() === 15
-	) {
-		avatar.setStatut('null');
-	}
-
-	enemis.forEach(enemi => {
-		handleAvatarEnemiCollisions(avatar, enemi);
-	});
-
-	avatar.deplacer();
-	avatar.projectiles.forEach(projectile => projectile.deplacer());
-
-	if (!avatar.spectateur) {
-		avatarData.push({
-			id: avatar.id,
-			x: avatar.getX(),
-			y: avatar.getY(),
-			projectiles: avatar.projectiles,
-			vies: avatar.getVies(),
-			score: avatar.getScore(),
-			socketId: avatar.nom,
+		let avatarData = [];
+		avatars.forEach(avatar => {
+			avatar.canvasSize = canvasSize;
+			if (
+				avatar.getStatut() == 'invincibilite' &&
+				t.getTotalTime() - avatar.getStatutTime() == 15
+			) {
+				avatar.setStatut('null');
+			}
+			enemis.forEach(enemi => {
+				if (
+					enemi.hitbox.colision(avatar.hitbox) &&
+					avatar.getStatut() != 'invincibilite'
+				) {
+					if (canLostLifeAvatar) {
+						avatar.decrementScore(5);
+						enemis.splice(enemis.indexOf(enemi), 1);
+						avatar.perdreVie();
+						canLostLifeAvatar = false;
+						setTimeout(function () {
+							canLostLifeAvatar = true;
+						}, 100);
+					}
+					if (avatar.getVies() == 0) {
+						gestionScore.ajouterScore(avatar.pseudo, avatar.score);
+						avatar.setSpectateur();
+						io.emit('dead', avatar.id);
+					}
+				}
+				if (enemi.getVies() < 0) {
+					avatar.incrementScore(5);
+					enemis.splice(enemis.indexOf(enemi), 1);
+				}
+				enemi.deplacer();
+				avatar.colision(enemi.hitbox);
+				avatar.projectiles.forEach(projectile => {
+					if (projectile.hitbox.colision(enemi.hitbox)) {
+						avatar.projectiles.splice(
+							avatar.projectiles.indexOf(projectile),
+							1
+						);
+						if (canLostLifeEnemi) {
+							enemi.perdreVie();
+							canLostLifeEnemi = false;
+							setTimeout(function () {
+								canLostLifeEnemi = true;
+							}, 1000 / 60);
+						}
+					}
+				});
+			});
+			avatar.deplacer();
+			avatar.projectiles.forEach(projectile => projectile.deplacer());
+			if (!avatar.spectateur) {
+				avatarData.push({
+					id: avatar.id,
+					x: avatar.getX(),
+					y: avatar.getY(),
+					projectiles: avatar.projectiles,
+					vies: avatar.getVies(),
+					score: avatar.getScore(),
+					socketId: avatar.nom,
+				});
+			}
+			bonusArray.forEach(bonus => {
+				if (bonus.hitbox.colision(avatar.hitbox)) {
+					if (bonusNoms[bonus.getChoix()] == 'vie') {
+						avatar.gagnerVie();
+					} else if (bonusNoms[bonus.getChoix()] == 'invincibilite') {
+						avatar.setStatut('invincibilite');
+						avatar.setStatutTime(t.getTotalTime());
+					}
+					bonusArray.splice(bonusArray.indexOf(bonus), 1);
+				}
+				if (bonus.estExpire(t.getTotalTime())) {
+					bonusArray.splice(bonusArray.indexOf(bonus), 1);
+				}
+			});
 		});
+		io.emit('avatarsData', avatarData);
+	} else {
+		gameStarted = false;
+		cpt = 0;
+		t = new timer();
+		avatars.length = 0; // Réinitialiser le tableau d'avatars
+		io.emit('endGame', true);
 	}
-
-	handleAvatarBonusCollisions(avatar);
-}
-
-function handleAvatarEnemiCollisions(avatar, enemi) {
-	if (
-		enemi.hitbox.colision(avatar.hitbox) &&
-		avatar.getStatut() !== 'invincibilite'
-	) {
-		handleAvatarEnemiCollisionEffects(avatar, enemi);
-	}
-
-	if (enemi.getVies() < 0) {
-		avatar.incrementScore(5);
-		enemis.splice(enemis.indexOf(enemi), 1);
-	}
-
-	enemi.deplacer();
-
-	avatar.projectiles.forEach(projectile => {
-		if (projectile.hitbox.colision(enemi.hitbox)) {
-			avatar.projectiles.splice(avatar.projectiles.indexOf(projectile), 1);
-			handleProjectileEnemiCollisionEffects(avatar, enemi);
-		}
-	});
-}
-
-function handleAvatarEnemiCollisionEffects(avatar, enemi) {
-	avatar.decrementScore(5);
-	enemis.splice(enemis.indexOf(enemi), 1);
-	avatar.perdreVie();
-
-	if (canLostLifeAvatar) {
-		canLostLifeAvatar = false;
-		setTimeout(() => {
-			canLostLifeAvatar = true;
-		}, 100);
-	}
-
-	if (avatar.getVies() === 0) {
-		avatar.setSpectateur();
-		io.emit('dead', avatar.id);
-	}
-}
-
-function handleProjectileEnemiCollisionEffects(enemi) {
-	enemi.perdreVie();
-
-	if (canLostLifeEnemi) {
-		canLostLifeEnemi = false;
-		setTimeout(() => {
-			canLostLifeEnemi = true;
-		}, 1000 / 60);
-	}
-}
-
-function handleAvatarBonusCollisions(avatar) {
-	bonusArray.forEach(bonus => {
-		if (bonus.hitbox.colision(avatar.hitbox)) {
-			handleBonusCollisionEffects(avatar, bonus);
-		}
-
-		if (bonus.estExpire(t.getTotalTime())) {
-			bonusArray.splice(bonusArray.indexOf(bonus), 1);
-		}
-	});
-}
-
-function handleBonusCollisionEffects(avatar, bonus) {
-	if (bonusNoms[bonus.getChoix()] === 'vie') {
-		avatar.gagnerVie();
-	} else if (bonusNoms[bonus.getChoix()] === 'invincibilite') {
-		avatar.setStatut('invincibilite');
-		avatar.setStatutTime(t.getTotalTime());
-	}
-
-	bonusArray.splice(bonusArray.indexOf(bonus), 1);
-}
-
-function endGame() {
-	gameStarted = false;
-	cptConnexion = 0;
-	t = new timer();
-	avatars.length = 0;
-	io.emit('endGame', true);
-}
+}, 1000 / 60);
-- 
GitLab