(function () { var TOTAL = 25; var next, startTime, timerInterval; function init() { var grid = document.getElementById('nt-grid'); var timerEl = document.getElementById('nt-timer'); var btnStart = document.getElementById('nt-start'); var listEl = document.getElementById('nt-list'); var progressBar = document.getElementById('nt-progress-bar'); var progressLabel = document.getElementById('nt-progress-label'); var resultArea = document.getElementById('nt-result-area'); if (!grid || !timerEl || !btnStart || !listEl) { console.warn('NT: element missing'); return; } function setProgress(done) { if (progressBar) progressBar.style.width = Math.round((done / TOTAL) * 100) + '%'; if (progressLabel) progressLabel.textContent = done + ' / ' + TOTAL; } function getResultMessage(sec) { if (sec < 10) return 'šŸ”„ é©šē•°ēš„ćŖååæœé€Ÿåŗ¦ļ¼ćƒˆćƒƒćƒ—ćƒ—ćƒ¬ć‚¤ćƒ¤ćƒ¼ē“šļ¼'; if (sec < 15) return '⚔ ē“ ę™“ć‚‰ć—ć„ļ¼ć‹ćŖć‚Šć®é›†äø­åŠ›ć§ć™ļ¼'; if (sec < 20) return 'šŸ’Ŗ ć„ć„ć‚æć‚¤ćƒ ļ¼ē¶™ē¶šć§ć•ć‚‰ć«ä¼øć³ć¾ć™ļ¼'; if (sec < 30) return 'šŸ‘ ć¾ćšć¾ćšć®ć‚¹ć‚æćƒ¼ćƒˆļ¼ē·“ēæ’ć‚ć‚‹ć®ćæļ¼'; return 'šŸŽ® ē„¦ć‚‰ćšē¶™ē¶šļ¼ęÆŽę—„ē·“ēæ’ć§åæ…ćšé€ŸććŖć‚Šć¾ć™ļ¼'; } function renderResultCard(final) { if (!resultArea) return; var tweetText = encodeURIComponent('ćƒŠćƒ³ćƒćƒ¼ć‚æćƒƒćƒć§ ' + final + 's é”ęˆļ¼\n#静岔eć‚¹ćƒćƒ¼ćƒ„ć‚Æćƒ©ćƒ– #ćƒŠćƒ³ćƒćƒ¼ć‚æćƒƒćƒ'); var tweetHref = 'https://twitter.com/intent/tweet?text=' + tweetText + '&url=' + encodeURIComponent(location.href); var card = document.createElement('div'); card.style.cssText = 'background:linear-gradient(135deg,#eff6ff,#f5f3ff);border:2px solid #c7d2fe;border-radius:14px;padding:1.5rem;text-align:center;font-family:sans-serif;margin:0 1.5rem 1.25rem;'; var scoreEl = document.createElement('div'); scoreEl.style.cssText = 'font-size:2.4rem;font-weight:800;color:#4f46e5;margin-bottom:0.3rem;'; scoreEl.textContent = final + 's'; var msgEl = document.createElement('div'); msgEl.style.cssText = 'font-size:0.9rem;color:#64748b;margin-bottom:1.25rem;line-height:1.6;'; msgEl.textContent = getResultMessage(parseFloat(final)); var shareLink = document.createElement('a'); shareLink.href = tweetHref; shareLink.target = '_blank'; shareLink.rel = 'noopener noreferrer'; shareLink.style.cssText = 'display:inline-flex;align-items:center;justify-content:center;padding:0.65rem 1.4rem;border-radius:9px;font-size:0.9rem;font-weight:700;background:#0f172a;color:#fff;text-decoration:none;margin:0.3rem;cursor:pointer;'; shareLink.textContent = 'X ēµęžœć‚’Xでシェア'; var retryBtn = document.createElement('button'); retryBtn.type = 'button'; retryBtn.style.cssText = 'display:inline-flex;align-items:center;justify-content:center;padding:0.65rem 1.4rem;border-radius:9px;font-size:0.9rem;font-weight:700;background:#fff;color:#4f46e5;border:2px solid #c7d2fe;margin:0.3rem;cursor:pointer;'; retryBtn.textContent = 'ć‚‚ć†äø€åŗ¦ęŒ‘ęˆ¦'; retryBtn.addEventListener('click', startGame); card.appendChild(scoreEl); card.appendChild(msgEl); card.appendChild(shareLink); card.appendChild(retryBtn); resultArea.innerHTML = ''; resultArea.appendChild(card); resultArea.style.display = 'block'; } function hideResult() { if (!resultArea) return; resultArea.innerHTML = ''; resultArea.style.display = 'none'; } function initEmptyGrid() { grid.innerHTML = ''; for (var i = 0; i < TOTAL; i++) { var c = document.createElement('div'); c.className = 'nt-cell empty'; grid.appendChild(c); } next = 1; setProgress(0); timerEl.className = ''; hideResult(); } function buildGrid() { var nums = []; for (var k = 1; k <= TOTAL; k++) nums.push(k); nums.sort(function () { return Math.random() - 0.5; }); var cells = grid.querySelectorAll('.nt-cell'); for (var i = 0; i < cells.length; i++) { (function (cell, n) { cell.className = 'nt-cell'; cell.textContent = n; var fresh = cell.cloneNode(true); fresh.addEventListener('click', function () { if (n === next) { fresh.classList.add('disabled'); next++; setProgress(next - 1); if (next > TOTAL) finish(); } }); cell.parentNode.replaceChild(fresh, cell); })(cells[i], nums[i]); } } function loadRanking() { try { return JSON.parse(localStorage.getItem('nt-ranking') || '[]'); } catch (e) { return []; } } function saveRanking(score) { var data = loadRanking(); data.push(parseFloat(score)); data.sort(function (a, b) { return a - b; }); if (data.length > 10) data.length = 10; try { localStorage.setItem('nt-ranking', JSON.stringify(data)); } catch (e) {} } function renderRanking() { var data = loadRanking(); listEl.innerHTML = ''; var medals = ['šŸ„‡', '🄈', 'šŸ„‰']; data.forEach(function (v, i) { var li = document.createElement('li'); li.textContent = (medals[i] || (i + 1) + '.') + ' ' + parseFloat(v).toFixed(2) + 's'; listEl.appendChild(li); }); } function updateTimer() { timerEl.textContent = ((performance.now() - startTime) / 1000).toFixed(2) + 's'; } function finish() { clearInterval(timerInterval); timerInterval = null; var final = ((performance.now() - startTime) / 1000).toFixed(2); timerEl.textContent = final + 's'; timerEl.className = 'fin'; setProgress(TOTAL); saveRanking(final); renderRanking(); btnStart.disabled = false; renderResultCard(final); } function startGame() { if (timerInterval) { clearInterval(timerInterval); timerInterval = null; } btnStart.disabled = true; initEmptyGrid(); var count = 3; timerEl.textContent = count; timerEl.className = ''; var countdown = setInterval(function () { count--; if (count > 0) { timerEl.textContent = count; } else { timerEl.textContent = 'GO!'; timerEl.className = 'go'; clearInterval(countdown); setTimeout(function () { buildGrid(); startTime = performance.now(); timerInterval = setInterval(updateTimer, 50); }, 600); } }, 1000); } btnStart.addEventListener('click', startGame); hideResult(); renderRanking(); next = 1; setProgress(0); console.log('NT: ready'); } if (typeof window.jQuery !== 'undefined') { window.jQuery(document).ready(init); } else if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();