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 @@