From fd49572d226792b0c53cace95f863e62c2a7a242 Mon Sep 17 00:00:00 2001 From: cay Date: Fri, 10 Apr 2026 08:25:41 +0100 Subject: [PATCH] uip --- sockets/arena_socket.js | 32 ++++++++++++++++++++++-- views/1v1-battlefield.ejs | 52 +++++++++++++++++++++++++++++---------- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/sockets/arena_socket.js b/sockets/arena_socket.js index 409cd34..864e518 100644 --- a/sockets/arena_socket.js +++ b/sockets/arena_socket.js @@ -333,7 +333,7 @@ function registerArenaHandlers(io, socket) { }); socket.on("arena_join", (data) => { - const { matchId, slot } = data; + const { matchId, slot, playerName } = data; if (!matchId || !slot) return; if (!io._arenaRooms) io._arenaRooms = new Map(); @@ -341,7 +341,13 @@ function registerArenaHandlers(io, socket) { const room = io._arenaRooms.get(matchId); room.sockets[slot] = socket.id; - room.names[slot] = socket.user || "Spieler"; + + // Name aus socket.user (Objekt) oder vom Client mitgesendet + const u = socket.user; + room.names[slot] = (u && (u.ingame_name || u.username || u.name)) + || playerName + || "Spieler"; + socket.join("arena_" + matchId); const otherSlot = slot === "player1" ? "player2" : "player1"; @@ -372,6 +378,28 @@ function registerArenaHandlers(io, socket) { io.to("arena_" + matchId).emit("player_surrendered", { slot }); }); + /* ── Zugwechsel ── */ + socket.on("end_turn", (data) => { + const { matchId, slot } = data; + if (!matchId || !slot) return; + const nextSlot = slot === "player1" ? "player2" : "player1"; + io.to("arena_" + matchId).emit("turn_change", { activeSlot: nextSlot }); + console.log(`[1v1] Zug: ${slot} → ${nextSlot} | Match ${matchId}`); + }); + + socket.on("end_turn_init", (data) => { + const { matchId, starterSlot } = data; + if (!matchId || !starterSlot) return; + // Nur einmal senden (erster Empfang gewinnt) + if (!io._turnInit) io._turnInit = new Set(); + if (io._turnInit.has(matchId)) return; + io._turnInit.add(matchId); + io.to("arena_" + matchId).emit("turn_change", { activeSlot: starterSlot }); + console.log(`[1v1] Startzug: ${starterSlot} | Match ${matchId}`); + // Cleanup nach 10s + setTimeout(() => io._turnInit?.delete(matchId), 10000); + }); + /* ── 2v2 & 4v4 ── */ registerTeamModeHandlers(io, socket, "2v2"); registerTeamModeHandlers(io, socket, "4v4"); diff --git a/views/1v1-battlefield.ejs b/views/1v1-battlefield.ejs index 6bc9f01..87702a2 100644 --- a/views/1v1-battlefield.ejs +++ b/views/1v1-battlefield.ejs @@ -551,34 +551,60 @@ /* Account-ID laden dann arena_join senden */ let myIngameName = null; - fetch("/arena/me") - .then(r => r.json()) - .then(me => { - // Eigenen Namen sofort im Avatar anzeigen - myIngameName = me.ingame_name || me.username || me.name || me.id || "Ich"; - const myNameEl = document.getElementById(amIPlayer1 ? "nameLeft" : "nameRight"); - if (myNameEl) myNameEl.textContent = myIngameName; - socket.emit("arena_join", { matchId, slot: mySlot, accountId: me.id }); - }) - .catch(() => { - socket.emit("arena_join", { matchId, slot: mySlot, accountId: null }); + + function emitArenaJoin(me) { + myIngameName = (me && (me.ingame_name || me.username || me.name || String(me.id))) || "Spieler"; + const myNameEl = document.getElementById(amIPlayer1 ? "nameLeft" : "nameRight"); + if (myNameEl) myNameEl.textContent = myIngameName; + socket.emit("arena_join", { + matchId, + slot: mySlot, + accountId: me?.id ?? null, + playerName: myIngameName, }); + } + + function fetchAndJoin() { + fetch("/arena/me") + .then(r => r.json()) + .then(me => emitArenaJoin(me)) + .catch(() => emitArenaJoin(null)); + } + + // Auf Socket-Connect warten – sicherster Zeitpunkt für arena_join + socket.on("connect", fetchAndJoin); + // Fallback: Socket war bereits verbunden bevor Event registriert wurde + if (socket.connected) fetchAndJoin(); + + // Fallback: Falls nach 8s kein arena_opponent_joined / arena_ready kommt + // → Bereit-Box trotzdem anzeigen + const readyFallbackTimer = setTimeout(() => { + const connecting = document.getElementById("connecting-overlay"); + if (connecting) { + console.warn("[Arena] Kein Socket-Event nach 8s – zeige Bereit-Box als Fallback"); + connecting.remove(); + const lockOverlay = document.getElementById("board-lock-overlay"); + if (lockOverlay) lockOverlay.style.display = "flex"; + } + }, 8000); /* ── Gegner verbunden ───────────────────────────────── */ socket.on("arena_opponent_joined", data => { + console.log("[Arena] arena_opponent_joined:", data); + clearTimeout(readyFallbackTimer); const name = data.name || "Gegner"; document.getElementById(amIPlayer1 ? "nameRight" : "nameLeft").textContent = name; document.getElementById("connecting-overlay")?.remove(); - // Jetzt erst Bereit-Box anzeigen const lockOverlay = document.getElementById("board-lock-overlay"); if (lockOverlay) lockOverlay.style.display = "flex"; }); socket.on("arena_ready", data => { + console.log("[Arena] arena_ready:", data); + clearTimeout(readyFallbackTimer); document.getElementById("connecting-overlay")?.remove(); document.getElementById("nameLeft").textContent = data.player1 || "Spieler 1"; document.getElementById("nameRight").textContent = data.player2 || "Spieler 2"; - // Bereit-Box anzeigen const lockOverlay = document.getElementById("board-lock-overlay"); if (lockOverlay) lockOverlay.style.display = "flex"; });