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; }