diff --git a/templates/quiz_buzzer_multiplayer.html b/templates/quiz_buzzer_multiplayer.html index 3951115..9bab077 100644 --- a/templates/quiz_buzzer_multiplayer.html +++ b/templates/quiz_buzzer_multiplayer.html @@ -243,6 +243,9 @@ let decayRate = parseInt(localStorage.getItem('buzzer_decay_rate')) || 50; let gameStarted = false; let currentBuzzer = null; + let buzzedPlayers = []; // Liste der Spieler die schon gebuzzert haben + let canBuzz = false; // Kann man buzzern? + let pendingPoints = 0; // Punkte die noch nicht gezählt wurden // Lade Team-Namen und Anzahl const teamCount = parseInt(localStorage.getItem('team_count')) || 4; @@ -256,6 +259,14 @@ { id: 4, name: teamNames[3] || 'Spieler 4', score: {{ player_scores[3] if player_scores else 0 }} } ]; + // Leertaste zum Buzzern + document.addEventListener('keydown', function(e) { + if (e.code === 'Space' && canBuzz && !currentBuzzer) { + e.preventDefault(); + triggerBuzz(); + } + }); + window.onSpotifyWebPlaybackSDKReady = () => { const token = '{{ access_token }}'; const player = new Spotify.Player({ @@ -330,6 +341,7 @@ gameStarted = true; document.getElementById('startButton').classList.add('disabled'); document.getElementById('startButton').style.cursor = 'wait'; + document.getElementById('buzzerHint').style.display = 'block'; const device_id = window.deviceId; const startPosition = getOption('startPosition', 'start'); @@ -344,21 +356,19 @@ .then(() => { console.log('Play command sent'); document.getElementById('startButton').style.display = 'none'; - // Aktiviere Buzzer - for (let i = 1; i <= 4; i++) { - document.getElementById(`buzzer${i}`).classList.remove('disabled'); - } + canBuzz = true; }) .catch(error => console.error('Error starting playback:', error)); } function startBuzzerTimer() { startTime = Date.now(); + canBuzz = true; updateTimer(); } function updateTimer() { - if (currentBuzzer) return; + if (!canBuzz && currentBuzzer) return; const elapsed = (Date.now() - startTime) / 1000; const timerDisplay = document.getElementById('buzzerTimer'); @@ -394,11 +404,11 @@ return points; } - function buzz(playerId) { + function triggerBuzz() { if (currentBuzzer !== null) return; - if (!gameStarted || !startTime) return; + if (!canBuzz) return; - currentBuzzer = playerId; + canBuzz = false; // Verhindere weitere Buzzes buzzTime = Date.now(); const elapsed = (buzzTime - startTime) / 1000; @@ -408,17 +418,33 @@ window.spotifyPlayer.pause(); } - // Markiere Spieler - document.getElementById(`player${playerId}`).classList.add('buzzed'); - document.getElementById('currentPlayer').textContent = `${players[playerId - 1].name} hat gebuzzert!`; - - // Deaktiviere alle Buzzer - for (let i = 1; i <= 4; i++) { - document.getElementById(`buzzer${i}`).classList.add('disabled'); + // Zeige Spielerauswahl + document.getElementById('playerSelection').style.display = 'block'; + document.getElementById('currentPlayer').textContent = 'Wer hat gebuzzert?'; + pendingPoints = calculatePoints(elapsed); + } + + function selectPlayer(playerId) { + if (buzzedPlayers.includes(playerId)) { + alert('Dieser Spieler hat bereits gebuzzert!'); + return; } + currentBuzzer = playerId; + buzzedPlayers.push(playerId); + + // Markiere Spieler + document.getElementById(`player${playerId}`).classList.add('buzzed'); + document.getElementById('currentPlayer').textContent = `${players[playerId - 1].name} antwortet...`; + + // Verstecke Spielerauswahl, zeige Antwortfeld + document.getElementById('playerSelection').style.display = 'none'; document.getElementById('answerSection').classList.add('active'); - window.earnedPoints = calculatePoints(elapsed); + window.earnedPoints = pendingPoints; + } + + function buzz(playerId) { + selectPlayer(playerId); } function setCorrectAnswer() { @@ -486,6 +512,10 @@ const guess = document.getElementById('answerInput').value; if (!guess) return; + // Disable input während Prüfung + document.getElementById('answerInput').disabled = true; + document.querySelector('button[onclick="checkAnswer()"]').disabled = true; + fetch('/check_answer_buzzer', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -495,7 +525,8 @@ game_mode: currentGameMode, playlist_id: '{{ playlist_id }}', earned_points: window.earnedPoints, - player_id: currentBuzzer + player_id: currentBuzzer, + apply_points: false // Punkte NICHT sofort anwenden }) }) .then(response => response.json()) @@ -503,45 +534,95 @@ const resultContainer = document.getElementById('resultContainer'); if (data.correct) { - players[currentBuzzer - 1].score += window.earnedPoints; - updateScoreboard(); + // Speichere Punkte, aber wende sie noch NICHT an + pendingPoints = window.earnedPoints; resultContainer.innerHTML = `
-

✅ ${i18n.correct || 'Correct'}

+

✅ ${i18n.correct || 'Richtig'}

+${window.earnedPoints} Punkte für ${players[currentBuzzer - 1].name}!

+
+

Song Info:

+

Titel: {{ track.name | clean }}

+

Künstler: {{ track.artists[0].name | clean }}

+

Album: {{ track.album.name | clean }}

+ Auf Spotify öffnen +
`; + document.getElementById('nextQuestionBtn').style.display = 'inline-block'; + document.getElementById('nextQuestionBtn').onclick = function() { + // Wende Punkte beim Klick auf "Nächster Song" an + players[currentBuzzer - 1].score += pendingPoints; + updateScoreboard(); + window.location.href = '/quiz/{{ playlist_id }}?mode={{ game_mode }}&buzzer=1&local_multiplayer=1'; + }; } else { + // Minuspunkte: 25% der möglichen Punkte + const minusPoints = Math.floor(window.earnedPoints * 0.25); + pendingPoints = -minusPoints; + resultContainer.innerHTML = `
-

❌ ${i18n.incorrect || 'Incorrect'}

-

${i18n.your_answer || 'Your answer'}: ${guess}

-

${i18n.correct_answer || 'Correct answer'}: ${data.correct_answer}

+

❌ Falsch

+

Deine Antwort: ${guess}

+

-${minusPoints} Punkte für ${players[currentBuzzer - 1].name}

+
+ + +
`; } - - if (data.comparison) { - resultContainer.innerHTML += ` -
-

${i18n.song_info || 'Song Info'}:

-

${i18n.title || 'Title'}: {{ track.name | clean }}

-

${i18n.artist || 'Artist'}: {{ track.artists[0].name | clean }}

-

${i18n.album || 'Album'}: {{ track.album.name | clean }}

-

${i18n.year || 'Year'}: {{ track.album.release_date[:4] }}

- ${i18n.open_on_spotify || 'Open on Spotify'} -
- `; - } - - document.getElementById('nextQuestionBtn').style.display = 'inline-block'; }) .catch(error => { console.error('Error checking answer:', error); }); } + function continueGame() { + // Wende Minuspunkte an + players[currentBuzzer - 1].score += pendingPoints; + updateScoreboard(); + + // Reset für nächsten Buzzer + document.getElementById('answerSection').classList.remove('active'); + document.getElementById('answerInput').value = ''; + document.getElementById('answerInput').disabled = false; + document.querySelector('button[onclick="checkAnswer()"]').disabled = false; + document.getElementById('resultContainer').innerHTML = ''; + document.getElementById(`player${currentBuzzer}`).classList.remove('buzzed'); + + currentBuzzer = null; + canBuzz = true; + + // Musik weiterspielen + if (window.spotifyPlayer) { + window.spotifyPlayer.resume(); + } + + // Timer weiterlaufen lassen + buzzTimer = requestAnimationFrame(updateTimer); + } + + function showSolution() { + // Wende Minuspunkte an + players[currentBuzzer - 1].score += pendingPoints; + updateScoreboard(); + + const resultContainer = document.getElementById('resultContainer'); + resultContainer.innerHTML = ` +
+

Lösung:

+

Titel: {{ track.name | clean }}

+

Künstler: {{ track.artists[0].name | clean }}

+

Album: {{ track.album.name | clean }}

+ Auf Spotify öffnen +
+ `; + document.getElementById('nextQuestionBtn').style.display = 'inline-block'; + } + function switchGameMode(mode) { window.location.href = `/reset_quiz/{{ playlist_id }}?next_mode=${mode}&buzzer=1&local_multiplayer=1`; } @@ -592,23 +673,35 @@
Drücke START um zu beginnen
- -
- + + + +
+ + + +
+ - - - -