diff --git a/public/game.html b/public/game.html
index b878852..46dbe6e 100644
--- a/public/game.html
+++ b/public/game.html
@@ -336,8 +336,8 @@ logs... {
log("room:update", data);
- if (playersEl) {
- playersEl.innerHTML = "";
+ // Always update local player color mapping and orientation even if the players list UI is not present
+ try {
(data.players || []).forEach((p) => {
try {
playerColors[p.id] = p.color;
@@ -346,8 +346,21 @@ logs... {
const li = document.createElement("li");
li.textContent =
(p.color || "Joueur") +
@@ -606,6 +619,22 @@ logs... {
+ log("room:refresh ack", resp);
+ });
+ } catch (_) {
+ try {
+ // last-resort: ask server for update via general event
+ socket.emit("room:refresh", { roomId }, () => {});
+ } catch (_) {}
+ }
+ }
+ } catch (_) {}
} catch (e) {
console.warn("card:effect:applied handler error", e);
}
diff --git a/server.js b/server.js
index 09ffd8a..fa86375 100644
--- a/server.js
+++ b/server.js
@@ -566,7 +566,7 @@ function buildDefaultDeck() {
// ['vacances','Choisie une pièce qui sort du plateau pendant deux tours. Ce après quoi elle tente de revenir: si la case est occupée, alors la pièce vacancière est capturée par la pièce occupant la case.'],
// a reflechir
- ["Empathie", "On retourne le plateau", "empathie"], // pendant X tours ?
+ ["Empathie", "Change la couleur associée à chaque joueur.", "empathie"],
// ['effet domino', "La pièce désigner peut rejouer tant qu'elle capture"]
// ['reversi','Si deux pions encadrent parfaitement une pièce adverse, cette dernière change de camp'],
// ['plus on est de fous','Si le joueur possède deux fous dans la même diagonale, alors toutes les pièces adverses encadrées par ces deux fous sont capturés'],
@@ -3000,6 +3000,9 @@ io.on("connection", (socket) => {
effect,
});
} catch (_) {}
+ try {
+ sendRoomUpdate(room);
+ } catch (_) {}
} catch (e) {
console.error("toucher effect error", e);
}
@@ -3388,11 +3391,11 @@ io.on("connection", (socket) => {
}
}
- // empathie
+ // empathie: minimal handler — swap the color associated to each player and nothing else
else if (cardId === "empathie") {
try {
const board = room.boardState;
- if (!board || !Array.isArray(board.pieces)) {
+ if (!board) {
try {
room.hands = room.hands || {};
room.hands[senderId] = room.hands[senderId] || [];
@@ -3410,89 +3413,24 @@ io.on("connection", (socket) => {
} catch (e) {}
return (
cb &&
- cb({
- error: "no board to flip",
- message: "Aucun plateau à retourner.",
- })
+ cb({ error: "no board to apply empathie", message: "Aucun plateau disponible." })
);
}
- function squareToCoord(sq) {
- if (!sq) return null;
- const s = String(sq).trim().toLowerCase();
- if (!/^[a-z][1-9][0-9]*$/.test(s)) return null;
- const file = s.charCodeAt(0) - "a".charCodeAt(0);
- const rank = parseInt(s.slice(1), 10) - 1;
- return { x: file, y: rank };
- }
- function coordToSquare(x, y) {
- if (x < 0 || y < 0 || !board.width || !board.height) return null;
- if (x < 0 || y < 0 || x >= board.width || y >= board.height)
- return null;
- return String.fromCharCode("a".charCodeAt(0) + x) + (y + 1);
- }
- const w = board.width || 8;
- const h = board.height || 8;
- (board.pieces || []).forEach((p) => {
- try {
- const c = squareToCoord(p.square);
- if (c) {
- const nx = w - 1 - c.x;
- const ny = h - 1 - c.y;
- const ns = coordToSquare(nx, ny);
- if (ns) p.square = ns;
- }
- p.color = p.color === "w" ? "b" : p.color === "b" ? "w" : p.color;
- } catch (_) {}
- });
+
+ // Swap only the players' color mapping (white <-> black). Do NOT move pieces or change board.turn.
try {
- room.activeCardEffects = room.activeCardEffects || [];
- room.activeCardEffects.forEach((e) => {
- if (!e) return;
- try {
- if (e.pieceSquare) {
- const c = squareToCoord(e.pieceSquare);
- if (c) {
- const nx = w - 1 - c.x;
- const ny = h - 1 - c.y;
- const ns = coordToSquare(nx, ny);
- if (ns) e.pieceSquare = ns;
- }
- }
- if (e.square) {
- const c2 = squareToCoord(e.square);
- if (c2) {
- const nx = w - 1 - c2.x;
- const ny = h - 1 - c2.y;
- const ns2 = coordToSquare(nx, ny);
- if (ns2) e.square = ns2;
- }
- }
- if (Array.isArray(e.allowedSquares)) {
- e.allowedSquares = e.allowedSquares.map((sq) => {
- const cc = squareToCoord(sq);
- if (!cc) return sq;
- const nx = w - 1 - cc.x;
- const ny = h - 1 - cc.y;
- return coordToSquare(nx, ny) || sq;
- });
- }
- } catch (_) {}
+ (room.players || []).forEach((pl) => {
+ if (!pl || !pl.color) return;
+ if (pl.color === "white") pl.color = "black";
+ else if (pl.color === "black") pl.color = "white";
});
} catch (_) {}
- (room.players || []).forEach((pl) => {
- try {
- pl.color =
- pl.color === "white"
- ? "black"
- : pl.color === "black"
- ? "white"
- : pl.color;
- } catch (_) {}
- });
- if (board.turn)
- board.turn =
- board.turn === "w" ? "b" : board.turn === "b" ? "w" : board.turn;
- board.version = (board.version || 0) + 1;
+
+ // bump version so clients pick up the change
+ try {
+ board.version = (board.version || 0) + 1;
+ } catch (_) {}
+
const effect = {
id: played.id,
type: "empathie",
@@ -3503,16 +3441,18 @@ io.on("connection", (socket) => {
room.activeCardEffects.push(effect);
played.payload = Object.assign({}, payload, { applied: "empathie" });
try {
- io.to(room.id).emit("card:effect:applied", {
- roomId: room.id,
- effect,
- });
+ io.to(room.id).emit("card:effect:applied", { roomId: room.id, effect });
} catch (_) {}
+
try {
recordPlayerDrewPrev(room, senderId);
} catch (_) {}
+
+ try {
+ sendRoomUpdate(room);
+ } catch (_) {}
} catch (e) {
- console.error("empathie / changement de camp error", e);
+ console.error("empathie minimal handler error", e);
}
}