modified: templates/quiz_buzzer_multiplayer.html

modified:   templates/team_setup.html
This commit is contained in:
Simon
2025-12-13 19:15:52 +01:00
parent 5435901143
commit cc07d21138
2 changed files with 298 additions and 5 deletions

View File

@@ -255,6 +255,8 @@
// Lade Team-Namen und Anzahl
const teamCount = parseInt(localStorage.getItem('team_count')) || 4;
const teamNames = JSON.parse(localStorage.getItem('team_names') || '["Spieler 1", "Spieler 2", "Spieler 3", "Spieler 4"]');
const buzzerMode = localStorage.getItem('buzzer_mode') || 'central';
const keyMappings = JSON.parse(localStorage.getItem('key_mappings') || '{"1":"Q","2":"W","3":"E","4":"R"}');
// Spieler-Daten
let players = [
@@ -264,15 +266,39 @@
{ id: 4, name: teamNames[3] || 'Spieler 4', score: {{ player_scores[3] if player_scores else 0 }} }
];
// Leertaste zum Starten/Buzzern, aber nicht in Eingabefeldern
// Tastatur-Events für beide Modi
document.addEventListener('keydown', function(e) {
const active = document.activeElement;
const isInput = active && (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA');
if (e.code === 'Space' && !isInput) {
e.preventDefault();
if (!gameStarted) {
if (isInput) return; // Keine Aktionen in Eingabefeldern
const key = e.key.toUpperCase();
if (!gameStarted) {
// Im persönlichen Modus: Nur die erste Spieler-Taste startet
if (buzzerMode === 'personal' && key === keyMappings['1']) {
e.preventDefault();
startGame();
} else if (canBuzz && !currentBuzzer) {
}
// Im zentralen Modus: Leertaste startet
else if (buzzerMode === 'central' && e.code === 'Space') {
e.preventDefault();
startGame();
}
} else if (canBuzz && !currentBuzzer) {
// Persönlicher Modus: Jede Spieler-Taste buzzert direkt
if (buzzerMode === 'personal') {
for (let i = 1; i <= teamCount; i++) {
if (key === keyMappings[i.toString()] && !buzzedPlayers.includes(i)) {
e.preventDefault();
triggerBuzzPersonal(i);
return;
}
}
}
// Zentraler Modus: Leertaste -> Spielerauswahl
else if (buzzerMode === 'central' && e.code === 'Space') {
e.preventDefault();
triggerBuzz();
}
}
@@ -339,6 +365,18 @@
}
}
}
// Update Buzzer-Hint basierend auf Modus
const hintElement = document.getElementById('buzzerHint');
if (buzzerMode === 'personal') {
let hintText = '⌨️ Buzzer-Tasten: ';
for (let i = 1; i <= teamCount; i++) {
hintText += `${players[i-1].name}=[${keyMappings[i.toString()]}] `;
}
hintElement.innerHTML = hintText;
} else {
hintElement.innerHTML = '⌨️ Drücke LEERTASTE zum Buzzern!';
}
}
function updateScoreboard() {
@@ -451,6 +489,49 @@
pendingPoints = points;
}
function triggerBuzzPersonal(playerId) {
if (currentBuzzer !== null) return;
if (!canBuzz) return;
if (buzzedPlayers.includes(playerId)) {
alert(`${players[playerId - 1].name} hat bereits gebuzzert!`);
return;
}
canBuzz = false; // Verhindere weitere Buzzes
buzzTime = Date.now();
const elapsed = (buzzTime - startTime) / 1000;
// Stoppe Timer-Updates
cancelAnimationFrame(buzzTimer);
// Friere Timer-Anzeige ein
const timerDisplay = document.getElementById('buzzerTimer');
const pointsDisplay = document.getElementById('pointsDisplay');
timerDisplay.textContent = elapsed.toFixed(2) + 's';
const points = calculatePoints(elapsed);
pointsDisplay.textContent = points + ' Punkte';
// Speichere die Zeit beim Buzzern für spätere Berechnung
window.pausedAt = Date.now();
if (window.spotifyPlayer) {
window.spotifyPlayer.pause();
}
// Direkt Spieler setzen (keine Auswahl nötig)
currentBuzzer = playerId;
buzzedPlayers.push(playerId);
pendingPoints = points;
// Markiere Spieler
document.getElementById(`player${playerId}`).classList.add('buzzed');
document.getElementById('currentPlayer').textContent = `${players[playerId - 1].name} antwortet...`;
// Zeige Antwortfeld direkt (keine Spielerauswahl)
document.getElementById('answerSection').classList.add('active');
window.earnedPoints = pendingPoints;
}
function selectPlayer(playerId) {
if (buzzedPlayers.includes(playerId)) {
alert('Dieser Spieler hat bereits gebuzzert!');
@@ -668,6 +749,14 @@
gracePeriod = parseInt(localStorage.getItem('buzzer_grace_period')) || 5;
decayRate = parseInt(localStorage.getItem('buzzer_decay_rate')) || 50;
document.getElementById('pointsDisplay').textContent = maxPoints + ' Punkte';
// Update Starttext basierend auf Modus
const currentPlayerText = document.getElementById('currentPlayer');
if (buzzerMode === 'personal') {
currentPlayerText.textContent = `Drücke [${keyMappings['1']}] zum Starten`;
} else {
currentPlayerText.textContent = 'Drücke LEERTASTE zum Starten';
}
};
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">