feat: systeme de lobby avec liste de rooms

Backend:
- GET /rooms via matchMaker.query() pour lister les salles actives
- ArenaRoom: setMetadata avec nom de salle (Salle #<id6>)

NetworkManager:
- FetchRooms() / OnRoomsRefreshed event (UnityWebRequest GET /rooms)
- JoinByRoomId(), CreateRoom() en plus de JoinArena()
- Refactoring: PrepareJoin/FinishJoin/HandleJoinError pour eviter duplication

LobbyUI:
- Redesign: panel 620x520 avec setup perso (gauche) + liste rooms (droite)
- Bouton Rejoindre par salle, Creer une salle, Rejoindre n importe
- Pseudo pre-rempli depuis PlayerPrefs
- Refresh automatique toutes les 4s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-17 22:14:27 +02:00
parent 44b758360c
commit 391c000a73
4 changed files with 409 additions and 277 deletions

View File

@@ -1,5 +1,5 @@
const cors = require('cors');
const { Server } = require('@colyseus/core');
const { Server, matchMaker } = require('@colyseus/core');
const { WebSocketTransport } = require('@colyseus/ws-transport');
const { ArenaRoom } = require('./rooms/ArenaRoom');
const Stats = require('./stats/StatsManager');
@@ -61,6 +61,21 @@ const gameServer = new Server({
res.json({ ok });
});
// ── Rooms ────────────────────────────────────────────────────────────
app.get('/rooms', async (_req, res) => {
try {
const rooms = await matchMaker.query({ name: 'arena' });
res.json(rooms.map(r => ({
roomId: r.roomId,
clients: r.clients,
maxClients: r.maxClients,
metadata: r.metadata || {},
})));
} catch (_) {
res.json([]);
}
});
// ── Chat ─────────────────────────────────────────────────────────────
app.get('/chat/history', (req, res) => {
res.json(Chat.getHistory(req.query.since));

View File

@@ -14,6 +14,7 @@ class ArenaRoom extends Room {
onCreate(options) {
this.setState(new GameState());
this.setPatchRate(16); // ~62.5 Hz
this.setMetadata({ name: options?.roomName || ('Salle #' + this.roomId.substring(0, 6)) });
this._phaseTimer = null;
this._lobbyTimer = null;