function endRound() {
if (!gameActive) return; // Prevent double execution
gameActive = false;
console.log(Ending Round ${currentRound});
// Clear any running timers clearInterval(memoTimerId); memoTimerId = null; clearInterval(inputTimerId); inputTimerId = null; clearTimeout(roundTimeoutId); roundTimeoutId = null; dataInput.disabled = true; inputArea.classList.add('hidden'); resultsArea.classList.remove('hidden'); difficultySelectionDiv.classList.add('hidden'); instructionsDiv.classList.add('hidden'); dataDisplay.classList.add('hidden'); let roundCorrect = 0; detailedResultsDiv.innerHTML = ''; // Evaluate only required keys for this round for (const key of requiredKeys) { const expected = currentData[key]; const actual = userInput[key] || "[No Input]"; const isCorrect = expected === actual; const typeName = KEY_NAMES[key]; if (isCorrect) { roundCorrect++; let displayActual = actual; if (key === 'r' && displayActual !== "[No Input]" && displayActual.length > 2) { displayActual = displayActual.slice(0, -2) + '.' + displayActual.slice(-2); } detailedResultsDiv.innerHTML += `<p>${typeName}: <span class="correct">${displayActual}</span> (Correct)</p>`; } else { let displayActualIncorrect = actual; detailedResultsDiv.innerHTML += `<p>${typeName}: <span class="incorrect">${displayActualIncorrect}</span> (Incorrect)</p>`; } } setScore += roundCorrect; roundCorrectSpan.textContent = roundCorrect; roundTotalSpan.textContent = requiredKeys.length; setScoreSpan.textContent = setScore; resultsDifficultySpan.textContent = currentDifficulty; resultsRoundNumSpan.textContent = currentRound; resultsMaxRoundsSpan.textContent = maxRounds; if (currentRound < maxRounds) { nextRoundMessage.classList.remove('hidden'); // After delay, start next round roundTimeoutId = setTimeout(() => { nextRoundMessage.classList.add('hidden'); startRound(); }, ROUND_DELAY); } else { // No more rounds, end set roundTimeoutId = setTimeout(() => { endSet(); }, ROUND_DELAY); }
}
function endSet() {
resultsArea.classList.add(‘hidden’);
finalResultsArea.classList.remove(‘hidden’);
roundInfoDiv.classList.add(‘hidden’);
difficultySelectionDiv.classList.remove(‘hidden’);
startButton.classList.remove(‘hidden’);
startButton.disabled = false;
finalDifficultySpan.textContent = currentDifficulty; finalCorrectSpan.textContent = setScore; finalTotalSpan.textContent = (DIFFICULTY_KEYS[currentDifficulty] * maxRounds) || 0; const totalAnswers = DIFFICULTY_KEYS[currentDifficulty] * maxRounds; const accuracy = totalAnswers > 0 ? ((setScore / totalAnswers) * 100).toFixed(1) : 0; finalAccuracySpan.textContent = `${accuracy}%`; startButton.textContent = `Start ${currentDifficulty.charAt(0).toUpperCase() + currentDifficulty.slice(1)} Set (${maxRounds} Rounds)`; // Reset set state for new game currentRound = 0; setScore = 0;
}
function endRound() {
if (!gameActive) return; // Prevent double execution
gameActive = false;
console.log(`Ending Round ${currentRound}`);
// Clear any running timers
clearInterval(memoTimerId);
memoTimerId = null;
clearInterval(inputTimerId);
inputTimerId = null;
clearTimeout(roundTimeoutId);
roundTimeoutId = null;
dataInput.disabled = true;
inputArea.classList.add(‘hidden’);
resultsArea.classList.remove(‘hidden’);
difficultySelectionDiv.classList.add(‘hidden’);
instructionsDiv.classList.add(‘hidden’);
dataDisplay.classList.add(‘hidden’);
let roundCorrect = 0;
detailedResultsDiv.innerHTML = ”;
// Evaluate only required keys for this round
for (const key of requiredKeys) {
const expected = currentData[key];
const actual = userInput[key] || “[No Input]”;
const isCorrect = expected === actual;
const typeName = KEY_NAMES[key];
if (isCorrect) {
roundCorrect++;
let displayActual = actual;
if (key === ‘r’ && displayActual !== “[No Input]” && displayActual.length > 2) {
displayActual = displayActual.slice(0, -2) + ‘.’ + displayActual.slice(-2);
}
detailedResultsDiv.innerHTML += `${typeName}: ${displayActual} (Correct)
`; } else { let displayActualIncorrect = actual; detailedResultsDiv.innerHTML += `${typeName}: ${displayActualIncorrect} (Incorrect)
`; } } setScore += roundCorrect; roundCorrectSpan.textContent = roundCorrect; roundTotalSpan.textContent = requiredKeys.length; setScoreSpan.textContent = setScore; resultsDifficultySpan.textContent = currentDifficulty; resultsRoundNumSpan.textContent = currentRound; resultsMaxRoundsSpan.textContent = maxRounds; if (currentRound < maxRounds) { nextRoundMessage.classList.remove('hidden'); // After delay, start next round roundTimeoutId = setTimeout(() => { nextRoundMessage.classList.add(‘hidden’); startRound(); }, ROUND_DELAY); } else { // No more rounds, end set roundTimeoutId = setTimeout(() => { endSet(); }, ROUND_DELAY); } } function endSet() { resultsArea.classList.add(‘hidden’); finalResultsArea.classList.remove(‘hidden’); roundInfoDiv.classList.add(‘hidden’); difficultySelectionDiv.classList.remove(‘hidden’); startButton.classList.remove(‘hidden’); startButton.disabled = false; finalDifficultySpan.textContent = currentDifficulty; finalCorrectSpan.textContent = setScore; finalTotalSpan.textContent = (DIFFICULTY_KEYS[currentDifficulty] * maxRounds) || 0; const totalAnswers = DIFFICULTY_KEYS[currentDifficulty] * maxRounds; const accuracy = totalAnswers > 0 ? ((setScore / totalAnswers) * 100).toFixed(1) : 0; finalAccuracySpan.textContent = `${accuracy}%`; startButton.textContent = `Start ${currentDifficulty.charAt(0).toUpperCase() + currentDifficulty.slice(1)} Set (${maxRounds} Rounds)`; // Reset set state for new game currentRound = 0; setScore = 0; }