modified: templates/quiz_buzzer_multiplayer.html
modified: templates/team_setup.html
This commit is contained in:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user