From 4a8d005f4448beb13c969862147ff2c4fb5788b9 Mon Sep 17 00:00:00 2001 From: Sebastien Riviere Date: Tue, 26 Aug 2025 23:33:22 +0200 Subject: [PATCH] =?UTF-8?q?Mise=20en=20page=20compl=C3=A8te=20+=20liaison?= =?UTF-8?q?=20partielle=20au=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- traque-back/game.js | 41 +++-- traque-back/team_socket.js | 24 ++- traque-front/app/admin/page.js | 53 ++++--- traque-front/app/admin/parameters/page.js | 49 ++++-- traque-front/app/admin/teams/page.js | 2 +- .../components/admin/gameSettings.jsx | 44 +++--- traque-front/components/admin/liveMap.jsx | 4 +- .../components/admin/penaltySettings.jsx | 49 ------ .../components/admin/polygonZoneMap.jsx | 4 +- traque-front/components/admin/teamAdd.jsx | 24 --- .../components/admin/teamInformation.jsx | 144 +++++++++++++----- traque-front/components/admin/teamList.jsx | 1 - traque-front/components/admin/teamManager.jsx | 82 ++++++++++ traque-front/components/admin/teamReady.jsx | 18 --- traque-front/components/admin/teamViewer.jsx | 60 ++++++++ traque-front/components/util/section.jsx | 14 ++ traque-front/public/icons/greenconnection.png | Bin 14281 -> 0 bytes traque-front/public/icons/home.png | Bin 0 -> 14023 bytes traque-front/public/icons/redbattery.png | Bin 0 -> 2777 bytes traque-front/public/icons/reddude.png | Bin 0 -> 10888 bytes traque-front/public/icons/redlocation.png | Bin 0 -> 12343 bytes 21 files changed, 399 insertions(+), 214 deletions(-) delete mode 100644 traque-front/components/admin/penaltySettings.jsx delete mode 100644 traque-front/components/admin/teamAdd.jsx create mode 100644 traque-front/components/admin/teamManager.jsx delete mode 100644 traque-front/components/admin/teamReady.jsx create mode 100644 traque-front/components/admin/teamViewer.jsx create mode 100644 traque-front/components/util/section.jsx delete mode 100644 traque-front/public/icons/greenconnection.png create mode 100644 traque-front/public/icons/home.png create mode 100644 traque-front/public/icons/redbattery.png create mode 100644 traque-front/public/icons/reddude.png create mode 100644 traque-front/public/icons/redlocation.png diff --git a/traque-back/game.js b/traque-back/game.js index 2fca5cf..e61e7ea 100644 --- a/traque-back/game.js +++ b/traque-back/game.js @@ -92,17 +92,26 @@ export default { penaltyController.stop(); timeoutHandler.endAllSendPositionTimeout(); for (let team of this.teams) { - team.outOfZone = false; - team.penalties = 0; + // Chasing team.captured = false; - team.enemyLocation = null; - team.currentLocation = null; + team.chasing = null; + team.chased = null; + // Locations team.lastSentLocation = null; + team.locationSendDeadline = null; + team.enemyLocation = null; + // Placement + team.ready = false; + // Zone + team.penalties = 0; + team.outOfZone = false; + team.outOfZoneDeadline = null; + // Stats team.distance = 0; - team.finishDate = null; team.nCaptures = 0; team.nSentLocation = 0; team.nObserved = 0; + team.finishDate = null; } this.startDate = null; this.updateTeamChasing(); @@ -178,32 +187,38 @@ export default { */ addTeam(teamName) { this.teams.push({ + // Identification sockets: [], - id: this.getNewTeamId(), name: teamName, + id: this.getNewTeamId(), + captureCode: this.createCaptureCode(), + // Chasing + captured: false, chasing: null, chased: null, + // Locations lastSentLocation: null, - currentLocation: null, - enemyLocation: null, locationSendDeadline: null, + currentLocation: null, + lastCurrentLocationDate: null, + enemyLocation: null, + // Placement startingArea: null, ready: false, - captureCode: this.createCaptureCode(), - captured: false, + // Zone penalties: 0, outOfZone: false, outOfZoneDeadline: null, + // Stats distance: 0, - finishDate: null, nCaptures: 0, nSentLocation: 0, nObserved: 0, + finishDate: null, + // First socket infos phoneModel: null, phoneName: null, battery: null, - ping: null, - nConnected: 0, }); this.updateTeamChasing(); return true; diff --git a/traque-back/team_socket.js b/traque-back/team_socket.js index 6c40301..19d0289 100644 --- a/traque-back/team_socket.js +++ b/traque-back/team_socket.js @@ -38,23 +38,29 @@ export function playersBroadcast(event, data) { export function sendUpdatedTeamInformations(teamId) { const team = game.getTeam(teamId); teamBroadcast(teamId, "update_team", { + // Identification name: team.name, + captureCode: team.captureCode, + // Chasing + captured: team.captured, enemyName: game.getTeam(team.chasing).name, + // Locations lastSentLocation: team.lastSentLocation, enemyLocation: team.enemyLocation, - locationSendDeadline: team.locationSendDeadline, + // Placement phase startingArea: team.startingArea, ready: team.ready, - captureCode: team.captureCode, - captured: team.captured, + // Constraints penalties: team.penalties, outOfZone: team.outOfZone, outOfZoneDeadline: team.outOfZoneDeadline, + locationSendDeadline: team.locationSendDeadline, + // Stats distance: team.distance, - startDate: game.startDate, - finishDate: team.finishDate, nCaptures: team.nCaptures, nSentLocation: team.nSentLocation, + startDate: game.startDate, + finishDate: team.finishDate, }) secureAdminBroadcast("teams", game.teams); } @@ -65,8 +71,14 @@ export function sendUpdatedTeamInformations(teamId) { */ function logoutPlayer(id) { for (const team of game.teams) { + if (team.sockets.indexOf(id) == 0) { + team.battery = null; + team.phoneModel = null; + team.phoneName = null; + } team.sockets = team.sockets.filter((sid) => sid != id); } + secureAdminBroadcast("teams", game.teams); } export function initTeamSocket() { @@ -115,7 +127,9 @@ export function initTeamSocket() { const team = game.getTeam(teamId); if (team.sockets.indexOf(socket.id) == 0) { game.updateLocation(teamId, position); + team.lastCurrentLocationDate = Date.now(); } + secureAdminBroadcast("teams", game.teams); }); socket.on("send_position", () => { diff --git a/traque-front/app/admin/page.js b/traque-front/app/admin/page.js index b4b4787..d8adede 100644 --- a/traque-front/app/admin/page.js +++ b/traque-front/app/admin/page.js @@ -1,11 +1,10 @@ "use client"; import { useAdminConnexion } from "@/context/adminConnexionContext"; -import useAdmin from "@/hook/useAdmin"; import dynamic from "next/dynamic"; -import TeamList from '@/components/admin/teamList'; +import TeamList from '@/components/admin/teamViewer'; import React, { useState } from 'react' -import TeamAddForm from '@/components/admin/teamAdd'; import Link from "next/link"; +import { Section } from "@/components/util/section"; import TeamInformation from "@/components/admin/teamInformation"; // Imported at runtime and not at compile time @@ -14,20 +13,26 @@ const LiveMap = dynamic(() => import('@/components/admin/liveMap'), { ssr: false export default function AdminPage() { const { useProtect } = useAdminConnexion(); const [selectedTeamId, setSelectedTeamId] = useState(null); - const { addTeam, gameState, changeState, teams } = useAdmin(); + useProtect(); + + function onSelected(id) { + if (selectedTeamId === id) { + setSelectedTeamId(null); + } else { + setSelectedTeamId(id); + } + } return ( -
-
-
-

Page Principale

+
+
+
+ +

Page principale

-
-
-

Contrôle

-
-
+
+
-
-
-
-

Équipes

+ +
+
+
-
- -
-
+
-
-
- +
+
+ + setSelectedTeamId(null)}/>
-
+