diff --git a/public/game.html b/public/game.html
index 0d73188..61eda5b 100644
--- a/public/game.html
+++ b/public/game.html
@@ -22,10 +22,7 @@
logs...
-
+
@@ -120,6 +117,31 @@
showCardDrawnNotification(data);
}catch(e){ console.warn('card:drawn handler error', e); }
});
+ // when a card is played by any player, ensure the UI removes it from the owner's hand
+ socket.on('card:played', (data) => {
+ try{
+ log('recv card:played', data);
+ // data.played or data depending on server shape
+ const played = data && data.played ? data.played : data;
+ const cardObj = played && (played.card || played.cardObj || null);
+ const owner = played && played.playerId;
+ // if we have the card object and it's our card, remove its DOM element
+ if(owner === myPlayerId){
+ // find the card element by uuid (data-card-uuid) or by cardId
+ const row = document.querySelector('.cards-row');
+ if(row){
+ const elems = Array.from(row.querySelectorAll('.pokemon-card'));
+ elems.forEach(el => {
+ const uuid = el.dataset.cardUuid || '';
+ const cid = el.dataset.cardId || '';
+ if((cardObj && cardObj.id && uuid && uuid === cardObj.id) || (cardObj && cardObj.cardId && cid && cid === cardObj.cardId)){
+ el.remove();
+ }
+ });
+ }
+ }
+ }catch(e){ console.warn('card:played handler error', e); }
+ });
// selection events (include moves) broadcasted by server
socket.on('game:select', (data) => {
try{
@@ -445,21 +467,9 @@
const header = document.createElement('div');
header.className = 'pokemon-hand-header';
const title = document.createElement('div');
- title.textContent = 'Votre main';
+ title.textContent = 'Vos cartes';
title.className = 'pokemon-hand-title';
header.appendChild(title);
-
- // show public counts for other players (small badges)
- const countsWrap = document.createElement('div');
- countsWrap.className = 'pokemon-hand-counts';
- Object.entries(handCounts||{}).forEach(([pid, cnt])=>{
- if(pid === myPlayerId) return;
- const b = document.createElement('div');
- b.className = 'opponent-count';
- b.textContent = `${pid}: ${cnt}`;
- countsWrap.appendChild(b);
- });
- header.appendChild(countsWrap);
wrap.appendChild(header);
const row = document.createElement('div');
diff --git a/server.js b/server.js
index c54516c..0dc2b5a 100644
--- a/server.js
+++ b/server.js
@@ -27,7 +27,8 @@ function sendRoomUpdate(room){
hostId: room.hostId,
size: (room.boardState && room.boardState.width) || room.size,
cards: Object.keys(room.cards || {}),
- deckCount: (room.deck && room.deck.length) || 0
+ deckCount: (room.deck && room.deck.length) || 0,
+ discardCount: (room.discard && room.discard.length) || 0
};
const handCounts = {};
@@ -571,10 +572,32 @@ io.on('connection', (socket) => {
socket.on('card:play', ({ roomId, playerId, cardId, payload }, cb) => {
const room = rooms.get(roomId);
if(!room) return cb && cb({ error: 'room not found' });
+ // enforce sender identity from socket (don't trust client-supplied playerId)
+ const senderId = socket.data.playerId;
+ if(!senderId) return cb && cb({ error: 'not joined' });
// store played card and apply card effects when applicable
- const played = { id: uuidv4().slice(0,8), playerId, cardId, payload, ts: Date.now() };
+ const played = { id: uuidv4().slice(0,8), playerId: senderId, cardId, payload, ts: Date.now() };
room.playedCards = room.playedCards || [];
+ // remove the played card from the player's hand and move it to discard
+ try{
+ room.hands = room.hands || {};
+ const hand = room.hands[senderId] || [];
+ // find by unique id or by cardId (first match)
+ const idx = hand.findIndex(c => (c.id && c.id === (payload && payload.id)) || (c.cardId && c.cardId === cardId) || (c.id && c.id === cardId));
+ if(idx === -1){
+ return cb && cb({ error: 'you do not have that card' });
+ }
+ const removed = hand.splice(idx,1)[0];
+ room.hands[senderId] = hand;
+ room.discard = room.discard || [];
+ room.discard.push(removed);
+ // attach the removed card object to the played record for informational broadcast
+ played.card = removed;
+ }catch(e){
+ console.error('card removal error', e);
+ }
+
// Implement specific card effects here
try{
if(cardId === 'agrandir_plateau' || cardId === 'expand_board'){
@@ -618,11 +641,11 @@ io.on('connection', (socket) => {
console.error('card:play effect error', e);
}
- room.playedCards.push(played);
- // emit card played to entire room (informational)
- io.to(roomId).emit('card:played', played);
- // send personalized room updates
- sendRoomUpdate(room);
+ room.playedCards.push(played);
+ // emit card played to entire room (informational)
+ io.to(roomId).emit('card:played', played);
+ // send personalized room updates (will include updated hands and discardCount)
+ sendRoomUpdate(room);
cb && cb({ ok: true, played });
});