diff --git a/public/game.html b/public/game.html index b161c26..f254af9 100644 --- a/public/game.html +++ b/public/game.html @@ -290,6 +290,16 @@ showCardDrawnNotification(data); }catch(e){ console.warn('card:drawn handler error', e); } }); + // public notice that a player drew a card when autoDraw is OFF (server emits this only in that case) + socket.on('player:drew', (data) => { + try{ + const pid = data && data.playerId; + if(!pid) return; + const actor = (pid === myPlayerId) ? 'Vous' : (playerColors[pid] ? playerColors[pid] : 'Adversaire'); + // show owner message as 'Vous : a pioché une carte' so the player sees the activity line too + appendActivity(`${actor} : a pioché une carte`); + }catch(_){ } + }); // when server broadcasts generic room updates, it includes autoDraw flag // ensure draw button visibility is updated inside the room:update handler below // when a card is played by any player, ensure the UI removes it from the owner's hand diff --git a/server.js b/server.js index 466644b..653cfd3 100644 --- a/server.js +++ b/server.js @@ -294,7 +294,8 @@ function buildDefaultDeck(){ // ['petit pion','Le joueur choisit un pion. À partir du prochain tour, il est promu en reine dès qu il capture un pièce non pion.'], ['révolution','Tous les pions sont aléatoirement changés en Cavalier, Fou ou Tour et les Cavaliers, Fous et Tours sont changés en pions.'], ["doppelganger","Choisis une pièce. À partir de maintenant, devient chacune des pièces qu'elle capture."], - // ['kurby','Choisis une pièce. À sa prochaine capture, récupère les mouvements de la pièce capturée.'] + // ['kurby','Choisis une pièce. À sa prochaine capture, récupère les mouvements de la pièce capturée.'], + // ["cachotier", "La prochaine carte jouée ne sera pas révélée à l'adversaire."], ]; function cap(s){ if(!s) return s; s = String(s).trim(); return s.charAt(0).toUpperCase() + s.slice(1); } return cards.map(([title,desc])=>{ @@ -1401,18 +1402,12 @@ io.on('connection', (socket) => { // nothing drawn (hand full or deck empty) return cb && cb({ error: 'no_card_drawn', message: "Aucune carte n'a été tirée." }); } - // drawing consumes the player's turn: flip turn and decrement per-turn effects - // advance board version + // drawing consumes the player's turn: advance board version and mark that the player used their action board.version = (board.version || 0) + 1; - - // If the move consumed a free-move granted by a card, perform end-of-turn bookkeeping now - if(freeMoveConsumed){ - const moved = { playerId: senderId, from, to }; - try{ io.to(roomId).emit('move:moved', moved); }catch(_){ } - try{ endTurnAfterCard(room, senderId); }catch(e){ try{ sendRoomUpdate(room); }catch(_){ } } - return cb && cb({ ok: true, moved }); - } - // flip turn + room._cardPlayedThisTurn = room._cardPlayedThisTurn || {}; + // mark that this player has used their card/draw action this turn (prevents playing a card after drawing) + room._cardPlayedThisTurn[senderId] = true; + // flip turn to the next player board.turn = (board.turn === 'w') ? 'b' : 'w'; // decrement remainingTurns for time-limited effects that belong to the player who just finished their turn try{ @@ -1437,8 +1432,7 @@ io.on('connection', (socket) => { } }catch(e){ console.error('decrement-after-draw error', e); } - // reset per-turn card-play flags - try{ room._cardPlayedThisTurn = {}; }catch(_){ } + // note: do NOT clear room._cardPlayedThisTurn here; it should be reset at endTurnAfterCard // at this point it's the next player's turn; perform start-of-turn draw if autoDraw enabled const nextColor = board.turn; @@ -1446,8 +1440,8 @@ io.on('connection', (socket) => { if(nextPlayer){ try{ maybeDrawAtTurnStart(room, nextPlayer.id); }catch(_){ sendRoomUpdate(room); } } else { sendRoomUpdate(room); } - // notify room that the player drew and ended their turn - try{ io.to(room.id).emit('player:drew', { roomId: room.id, playerId: senderId, card: drawn }); }catch(_){ } + // notify room that the player drew and ended their turn (do NOT reveal card contents) + try{ io.to(room.id).emit('player:drew', { roomId: room.id, playerId: senderId }); }catch(_){ } return cb && cb({ ok: true, card: drawn }); }catch(err){ console.error('player:draw error', err); return cb && cb({ error: 'server_error' }); } });