From 13e9e1e0fbe06c52b92db7d32c26ae788c0692d3 Mon Sep 17 00:00:00 2001 From: cay Date: Sun, 12 Apr 2026 10:32:09 +0100 Subject: [PATCH] adrgr --- public/css/1v1.css | 45 ++++++++++ sockets/arena_socket.js | 16 ++-- views/1v1-battlefield.ejs | 168 +++++++++++++++++++++++++++++++++++++- 3 files changed, 222 insertions(+), 7 deletions(-) diff --git a/public/css/1v1.css b/public/css/1v1.css index a7ee880..7e5f5d0 100644 --- a/public/css/1v1.css +++ b/public/css/1v1.css @@ -885,3 +885,48 @@ body { opacity: 0.25; pointer-events: none; } + +/* ═══════════════════════════════════════════════════════════ + DRAG & DROP +═══════════════════════════════════════════════════════════ */ + +/* Hand-Karte wird gerade gezogen */ +.hand-slot.dragging { + opacity: 0.35; + transform: scale(0.95); + border-color: rgba(240, 190, 60, 0.4) !important; +} + +/* Board-Slot ist eine aktive Drop-Zone (freier Slot in meiner Zone) */ +.card-slot.drop-zone-active { + border: 2px dashed rgba(240, 190, 60, 0.9) !important; + background: rgba(180, 130, 20, 0.22) !important; + animation: pulse-zone 1.2s ease-in-out infinite; +} + +/* Hover: Karte schwebt über einem gültigen Slot */ +.card-slot.drop-zone-hover { + border: 2px solid rgba(240, 210, 80, 1) !important; + background: rgba(200, 150, 30, 0.38) !important; + box-shadow: + 0 0 0 3px rgba(240, 200, 60, 0.4), + 0 0 28px rgba(240, 190, 60, 0.55) !important; + transform: scale(1.06); + animation: none !important; +} + +@keyframes pulse-zone { + 0%, 100% { box-shadow: 0 0 8px rgba(240, 190, 60, 0.25); } + 50% { box-shadow: 0 0 22px rgba(240, 190, 60, 0.55); } +} + +/* Hand-Slot nicht draggable (kein Cursor-Feedback) */ +.hand-slot:not([draggable="true"]) { + cursor: default; +} +.hand-slot[draggable="true"] { + cursor: grab; +} +.hand-slot[draggable="true"]:active { + cursor: grabbing; +} diff --git a/sockets/arena_socket.js b/sockets/arena_socket.js index 6f76b20..345775f 100644 --- a/sockets/arena_socket.js +++ b/sockets/arena_socket.js @@ -1,5 +1,5 @@ /* ============================================================ - sockets/arena.js + sockets/arena.js 1v1 Matchmaking + 2v2 Team-Lobby + 4v4 Team-Lobby inkl. Kick-Funktion für Team-Leader wurde getestet ============================================================ */ @@ -21,7 +21,7 @@ function generateId() { } /* ═══════════════════════════════════════════════════════════ - HELPER: Generisch für 2v2 UND 4v4 ohne 1v1 + HELPER: Generisch für 2v2 UND 4v4 ═══════════════════════════════════════════════════════════ */ function getTeamMap(mode) { return mode === "4v4" ? teams4v4 : teams2v2; @@ -415,9 +415,7 @@ function registerArenaHandlers(io, socket) { } // Sonst: bereits guter Name gespeichert → nicht überschreiben - console.log( - `[1v1] Name gesetzt: slot=${slot}, name=${room.names[slot]}, playerName=${playerName}`, - ); + console.log(`[1v1] Name gesetzt: slot=${slot}, name=${room.names[slot]}, playerName=${playerName}`); socket.join("arena_" + matchId); @@ -472,6 +470,14 @@ function registerArenaHandlers(io, socket) { console.log(`[1v1] Zug: ${slot} → ${nextSlot} | Match ${matchId}`); }); + /* ── Karte gespielt → an Gegner weiterleiten ── */ + socket.on("card_played", (data) => { + const { matchId } = data; + if (!matchId) return; + socket.to("arena_" + matchId).emit("card_played", data); + console.log(`[1v1] card_played: ${data.card?.name} → ${data.boardSlot} | Match ${matchId}`); + }); + socket.on("end_turn_init", (data) => { const { matchId, starterSlot } = data; if (!matchId || !starterSlot) return; diff --git a/views/1v1-battlefield.ejs b/views/1v1-battlefield.ejs index 780393c..441eca3 100644 --- a/views/1v1-battlefield.ejs +++ b/views/1v1-battlefield.ejs @@ -351,11 +351,14 @@