diff --git a/src/public/index.html b/src/public/index.html index 70a2152..2717712 100644 --- a/src/public/index.html +++ b/src/public/index.html @@ -182,11 +182,11 @@
-
BUZZER CONTROLS
+
ROUND CONTROL
- - - + + +
diff --git a/src/public/script.js b/src/public/script.js index a8c81f8..de750b0 100644 --- a/src/public/script.js +++ b/src/public/script.js @@ -73,17 +73,26 @@ function handle(msg){ break; case 'room_update': room=msg.room; - if(role==='mod')renderMod();else renderPlayer(); + if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayer(); break; case 'settings_updated': room=msg.room; - if(role==='mod'){renderMod();renderModSettings();}else renderPlayer(); + if(role==='mod'){renderMod();renderRoundButtons();renderModSettings();}else renderPlayer(); break; - case 'round_open': + case 'round_open': room=msg.room; - if(role==='mod')renderMod(); + if(role==='mod'){renderMod();renderRoundButtons();} else{renderPlayerBuzzer();startPlayerTimer();toast('ROUND OPEN','ok');} break; + case 'round_closed': + room=msg.room; + if(role==='mod'){renderMod();renderRoundButtons();} + else{renderPlayerBuzzer();stopPlayerTimer();toast('ROUND CLOSED','warn');} + break; + case 'buzzer_reset': + room=msg.room; + if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer(); + break; case 'round_closed': room=msg.room; if(role==='mod')renderMod(); @@ -93,9 +102,9 @@ function handle(msg){ room=msg.room; if(role==='mod')renderMod();else renderPlayerBuzzer(); break; - case 'buzz_event': + case 'buzz_event': room=msg.room; - if(role==='mod')renderModBuzz(msg);else{renderPlayerBuzzer();addFeed(msg);} + if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);} break; case 'buzz_rejected': toast(msg.reason,'warn');break; @@ -272,7 +281,6 @@ function createRoom(){ // MOD TIMER // ══════════════════════════════════════════════════════ function fmtTime(s){return Math.floor(s/60)+':'+(s%60<10?'0':'')+(s%60);} - function modTimerLoad(){ modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30); modTimerRunning=false; @@ -330,6 +338,42 @@ function broadcastTimerToPlayers(sec,running){ }catch{} } +// ══════════════════════════════════════════════════════ +// MOD ROUND CONTROL +// ══════════════════════════════════════════════════════ +function toggleRound(){ + if(room.buzzerState.roundOpen){ + ws_send({type:'close_round'}); + } else { + ws_send({type:'open_round'}); + } +} + +function resumeRound(){ + ws_send({type:'open_round'}); +} + +function renderRoundButtons(){ + const openBtn=document.getElementById('mod-round-btn'); + const resumeBtn=document.getElementById('mod-resume-btn'); + + if(room.buzzerState.roundOpen){ + openBtn.innerHTML='■ CLOSE ROUND'; + openBtn.className='btn btn-red btn-full'; + resumeBtn.style.display='block'; + if(typeof gsap!=='undefined'){ + gsap.fromTo(resumeBtn,{opacity:0,y:4},{opacity:1,y:0,duration:0.3,ease:'power2.out'}); + } + } else { + openBtn.innerHTML='▶ OPEN ROUND'; + openBtn.className='btn btn-g btn-full'; + resumeBtn.style.display='none'; + if(typeof gsap!=='undefined'){ + gsap.to(resumeBtn,{opacity:0,y:-4,duration:0.3,ease:'power2.in',onComplete:()=>{resumeBtn.style.display='none';}}); + } + } +} + // ══════════════════════════════════════════════════════ // MOD RENDER // ══════════════════════════════════════════════════════ @@ -351,6 +395,7 @@ function renderMod(){ renderModBuzz(null); renderModPlayerList(); renderModTeams(); + renderRoundButtons(); } function renderModBuzz(evt){