function _promptGet() { return document.getElementById('prompt').textContent; } function _promptGetAndClear() { let val = _promptGet(); promptClear(); return val; } function _promptDeleteLast() { let elem = document.getElementById('prompt'); elem.textContent = elem.textContent.slice(0, -1); } function _promptClear() { document.getElementById('prompt').textContent = ''; } let prompt_handler; let prompt_handlers = { visit: { append(val) { let elem = document.getElementById('prompt'); if (elem.textContent.length < 3) { elem.textContent += val; promptUpdateRem(); } }, backspace() { _promptDeleteLast(); promptUpdateRem(); }, clear() { _promptClear(); promptUpdateRem(); }, submit() { let pts = _promptGetAndClear(); if (pts) Module.ccall('user_visit', 'number', ['number'], [pts]); }, submit_rem() { let rem = _promptGetAndClear(); if (rem) Module.ccall('user_visit_to_rem', 'number', ['number'], [rem]); } }, num_darts: { append(val) { let elem = document.getElementById('prompt'); if (elem.textContent.length < 3) elem.textContent += val; }, backspace() { _promptDeleteLast(); }, clear() { _promptClear(); }, submit() { let n = _promptGetAndClear(); if (n) Module.ccall('resp_numdarts', null, ['number'], [n]); } }, init: { submit() { Module.ccall('start_match'); } } } function setPromptHandler(ptr) { prompt_handler = prompt_handlers[UTF8ToString(ptr)]; } function promptAppend(...args) { clearOi(); prompt_handler?.append?.(...args); } function promptClear(...args) { clearOi(); prompt_handler?.clear?.(...args); } function promptBackspace(...args) { clearOi(); prompt_handler?.backspace?.(...args); } function promptSubmit(...args) { clearOi(); prompt_handler?.submit?.(...args); } function promptSubmitRem(...args) { clearOi(); prompt_handler?.submit_rem?.(...args); } function clearMatchLog() { document.getElementById('match').textContent = ''; } let oi_timeout; function oi() { document.getElementById('oi').style.visibility = 'visible'; oi_timeout = setTimeout(function() { oi_timeout = null; clearOi() }, 3000); } function clearOi() { document.getElementById('oi').style.visibility = 'hidden'; if (oi_timeout) { clearTimeout(oi_timeout); oi_timeout = null; } } function setPlayerActive(n) { document.querySelectorAll('[id$=-state]').forEach(e => e.classList[n && e.id == `p${n}-state` ? 'add' : 'remove']('active')); } function updatePlayerRem(n, ptr) { document.getElementById(`p${n}-rem`).textContent = UTF8ToString(ptr); } function updatePlayerName(n, ptr) { document.getElementById(`p${n}-name`).textContent = UTF8ToString(ptr); } function updatePlayerSugg(n, ptr) { document.getElementById(`p${n}-sugg`).textContent = UTF8ToString(ptr); } function updatePlayerAvg(n, avg) { document.getElementById(`p${n}-avg`).textContent = avg.toFixed(2); } function setPromptText(ptr) { document.getElementById('prompt').textContent = UTF8ToString(ptr); } function promptMsg(p) { document.getElementById('prompt-msg').textContent = UTF8ToString(p); } function promptSugg(p) { document.getElementById('prompt-sugg').textContent = UTF8ToString(p); } function promptUpdateRem() { Module.ccall('update_user_rem_from_pts', null, ['number'], [_promptGet()]); } function scheduleCCall(f, ms, ...args) { let types = []; let vals = []; for (let i = 0; i < args.length/2; i++) vals[i] = (types[i] = UTF8ToString(args[i*2])) == 'string' ? UTF8ToString(args[i*2+1]) : args[i*2+1]; let func = UTF8ToString(f); setTimeout(function() { Module.ccall(func, null, types, vals) }, ms); } const POINT_CLASSES = [180, 140, 100, 60, 40, 20, 1, 0]; function drawVisit(visit_no, u_pts, u_rem, b_pts, b_rem, b_darts) { let elem = document.getElementById('match'); for (let [i, ptr] of [u_pts, u_rem, visit_no, b_rem, b_pts, b_darts].entries()) { let div = document.createElement('div'); let v = div.textContent = UTF8ToString(ptr); if (i == 0 || i == 4) div.className = `p${POINT_CLASSES.find(x => x <= v)}`; else if (i == 5 && v) div.textContent = `… ${v}`; div.className += ` visit-col${i+1}`; elem.append(div); } elem.scrollTop = elem.scrollHeight; } function setStdev(val) { Module.ccall('change_stdev', null, ['number', 'number'], [val, val]); } function updateStdev(val) { document.getElementById('stdev').value = val; } function setDelay(val) { Module.ccall('change_delay', null, ['number'], [val]); } function updateDelay(val) { document.getElementById('delay').value = val; } function processKey(data) { if (data.altKey || data.ctrlKey || data.metaKey || data.target.type == 'text') return; let key = data.key; if (isFinite(key)) promptAppend(key); else if (key == 'Enter') promptSubmit(); else if (key == 'Backspace') promptBackspace(); else if (key == 'r') promptSubmitRem(); } function modal(id) { document.getElementById(id).style.display = 'block'; } window.onclick = function(e) { if (e.target.classList.contains('modal')) e.target.style.display = 'none'; } document.addEventListener('keydown', processKey);