diff --git a/public/waiting.html b/public/waiting.html index e88b9b0..998a2c7 100644 --- a/public/waiting.html +++ b/public/waiting.html @@ -19,7 +19,14 @@
Room: -
Status: -
Joueurs: 0/2
-
+ + +
+ +
@@ -45,6 +52,8 @@ let roomHostId = null; const hostLabelEl = document.getElementById('hostLabel'); const youAreHostEl = document.getElementById('youAreHost'); + const autoDrawLabelEl = document.getElementById('autoDrawLabel'); + const autoDrawToggleEl = document.getElementById('autoDrawToggle'); function log(...args){ console.log(...args); } @@ -91,6 +100,20 @@ startBtn.style.display = 'none'; } } + // update auto-draw UI if server provides it + try{ + if(typeof data.autoDraw !== 'undefined' && autoDrawLabelEl && autoDrawToggleEl){ + // show the control only to the host + if(myPlayerId && roomHostId && myPlayerId === roomHostId){ + autoDrawLabelEl.style.display = 'inline-flex'; + autoDrawToggleEl.checked = !!data.autoDraw; + autoDrawToggleEl.disabled = false; + } else { + // hide control for non-hosts + autoDrawLabelEl.style.display = 'none'; + } + } + }catch(_){ } }); // register game started handler early so we don't miss the broadcast @@ -129,6 +152,17 @@ } // after join, fetch room state to avoid missing a recent 'playing' state fetch(`/rooms/${encodeURIComponent(roomId)}`).then(r => r.json()).then(roomInfo => { + try{ + if(roomInfo && typeof roomInfo.autoDraw !== 'undefined'){ + if(myPlayerId && roomHostId && myPlayerId === roomHostId){ + // host: show control and set state + if(autoDrawLabelEl && autoDrawToggleEl){ autoDrawLabelEl.style.display = 'inline-flex'; autoDrawToggleEl.checked = !!roomInfo.autoDraw; autoDrawToggleEl.disabled = false; } + } else { + // non-host: hide control + if(autoDrawLabelEl) autoDrawLabelEl.style.display = 'none'; + } + } + }catch(_){ } if(roomInfo && roomInfo.status === 'playing'){ // server already marked room as playing; redirect immediately if(myPlayerId){ @@ -152,6 +186,18 @@ }); }); + // Auto-draw toggle (host only) + if(autoDrawToggleEl){ + autoDrawToggleEl.addEventListener('change', (ev)=>{ + if(!socket) return; + const enabled = !!autoDrawToggleEl.checked; + socket.emit('room:auto_draw:set', { roomId, enabled }, (resp)=>{ + if(resp && resp.error){ log('auto-draw error', resp); alert(resp.error); return; } + log('auto-draw updated', resp); + }); + }); + } + // Copy invite link (hidden link, no display) document.getElementById('copyInviteBtn').addEventListener('click', async ()=>{ const link = `${window.location.origin}/waiting.html?roomId=${encodeURIComponent(roomId)}`; diff --git a/server.js b/server.js index 3979f48..d2cc33b 100644 --- a/server.js +++ b/server.js @@ -27,6 +27,7 @@ function sendRoomUpdate(room){ hostId: room.hostId, size: (room.boardState && room.boardState.width) || room.size, cards: Object.keys(room.cards || {}), + autoDraw: !!room.autoDraw, deckCount: (room.deck && room.deck.length) || 0, discardCount: (room.discard && room.discard.length) || 0 }; @@ -624,7 +625,7 @@ app.post('/rooms', (req, res) => { // hostId will be set when the first player joins // initialize a deck for this room const deck = buildDefaultDeck(); - rooms.set(id, { id, boardState, players: [], status: 'waiting', hostId: null, size, cards: {}, playedCards: [], removalTimers: new Map(), deck, hands: {} }); + rooms.set(id, { id, boardState, players: [], status: 'waiting', hostId: null, size, cards: {}, playedCards: [], removalTimers: new Map(), deck, hands: {}, autoDraw: false }); res.json({ roomId: id, size }); }); @@ -633,7 +634,7 @@ app.get('/rooms/:id', (req, res) => { if (!room) return res.status(404).json({ error: 'room not found' }); const boardState = room.boardState || null; const size = (room.boardState && room.boardState.width) || room.size; - res.json({ id: room.id, boardState, size: size, players: room.players.map(p => ({ id: p.id, color: p.color })), status: room.status, hostId: room.hostId, cards: Object.keys(room.cards || {}) }); + res.json({ id: room.id, boardState, size: size, players: room.players.map(p => ({ id: p.id, color: p.color })), status: room.status, hostId: room.hostId, cards: Object.keys(room.cards || {}), autoDraw: !!room.autoDraw }); }); io.on('connection', (socket) => { @@ -692,6 +693,20 @@ io.on('connection', (socket) => { cb && cb({ ok: true, color, roomId, playerId: assignedId, hostId: room.hostId }); }); + // Host can toggle automatic drawing in the waiting room. Only the host may change this setting. + socket.on('room:auto_draw:set', ({ roomId, enabled }, cb) => { + const room = rooms.get(roomId); + if(!room) return cb && cb({ error: 'room not found' }); + const sender = socket.data.playerId; + if(!sender) return cb && cb({ error: 'not joined' }); + if(room.hostId !== sender) return cb && cb({ error: 'only the host can change auto-draw' }); + room.autoDraw = !!enabled; + // Broadcast updated room state to all participants + try{ sendRoomUpdate(room); }catch(_){ } + try{ io.to(room.id).emit('room:auto_draw:changed', { roomId: room.id, enabled: room.autoDraw }); }catch(_){ } + return cb && cb({ ok: true, autoDraw: room.autoDraw }); + }); + socket.on('game:move', ({ roomId, from, to, promotion }, cb) => { const room = rooms.get(roomId); if (!room) return cb && cb({ error: 'room not found' });