diff options
author | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2022-04-21 21:20:55 -0700 |
---|---|---|
committer | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2022-04-21 21:20:55 -0700 |
commit | 4d94b22fa44367e682159ad922c53c3bb7f60930 (patch) | |
tree | c378b9333c6ba73715081c9876316f0fa17d929c /web/static | |
parent | 24b71a541f73bffc4ba65ad479b441df2913ef0a (diff) | |
download | dartboat-4d94b22fa44367e682159ad922c53c3bb7f60930.tar.gz dartboat-4d94b22fa44367e682159ad922c53c3bb7f60930.tar.xz |
use prompt handler objects instead of messy state variables
Diffstat (limited to 'web/static')
-rw-r--r-- | web/static/dartboat.js | 241 |
1 files changed, 140 insertions, 101 deletions
diff --git a/web/static/dartboat.js b/web/static/dartboat.js index 7ffe78d..4bda599 100644 --- a/web/static/dartboat.js +++ b/web/static/dartboat.js @@ -1,8 +1,7 @@ -let prompt_num_darts = false; let match_state, user_rem, boat_rem; let oi_timeout; +let prompt_handler; let delay_ms = 1000; -let prompt_mode; const POINT_CLASSES = [180, 140, 100, 60, 40, 20, 1, 0]; @@ -12,6 +11,114 @@ function stcall(f, ret_type, arg_types, args) { args ? [match_state].concat(args) : [match_state]); } +let prompt_handler_visit = { + append(val) { + let elem = document.getElementById('prompt'); + if (elem.textContent.length < 3) { + elem.textContent += val; + promptUpdateRem(); + } + }, + + backspace() { + let elem = document.getElementById('prompt'); + elem.textContent = elem.textContent.slice(0, -1); + promptUpdateRem(); + }, + + clear() { + document.getElementById('prompt').textContent = ''; + promptUpdateRem(); + }, + + submit(pts_is_rem) { + let elem = document.getElementById('prompt'); + let pts = elem.textContent; + if (!pts) return; + promptClear(); + + if (pts_is_rem) + pts = user_rem - pts; + + if (!stcall('user_visit', 'number', ['number'], [pts])) { + oi(); + return; + } + + clearMatchLog(); + stcall('draw_match'); + + if (!stcall('is_match_over', 'number')) { + setBoatActive(); + stcall('boat_visit', 'number', ['number'], [delay_ms]); + } + }, + + submit_rem() { + this.submit(true); + } +} + +let prompt_handler_num_darts = { + append(val) { + let elem = document.getElementById('prompt'); + if (elem.textContent.length < 3) + elem.textContent += val; + }, + + backspace() { + let elem = document.getElementById('prompt'); + elem.textContent = elem.textContent.slice(0, -1); + }, + + clear() { + document.getElementById('prompt').textContent = ''; + }, + + submit() { + let elem = document.getElementById('prompt'); + let val = elem.textContent; + if (!val) return; + promptClear(); + + if (stcall('resp_numdarts', null, ['number'], [val])) + prompt_handler = prompt_handler_init; //FIXME + else + oi(); + } +} + +let prompt_handler_init = { + submit() { + initMatch(); + } +} + +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 = ''; } @@ -52,26 +159,6 @@ function updateBoatRem(rem) { updateBoatStateRem(rem); } -function promptMsg(p) { - document.getElementById('prompt-msg').textContent = UTF8ToString(p); -} - -function promptMsgStr(str) { - document.getElementById('prompt-msg').textContent = str; -} - -function userSugg(p) { - document.getElementById('user-sugg').textContent = UTF8ToString(p); -} - -function boatSugg(p) { - document.getElementById('boat-sugg').textContent = UTF8ToString(p); -} - -function promptSuggStr(str) { - document.getElementById('prompt-sugg').textContent = str; -} - function updateUserStateRem(rem) { let elem = document.getElementById('user-rem'); elem.textContent = rem < 0 || rem == 1 ? 'BUST' : rem; @@ -84,6 +171,14 @@ function updateBoatStateRem(rem) { Module.ccall('get_suggested', null, ['number', 'number'], [rem, 2]); } +function userSugg(p) { + document.getElementById('user-sugg').textContent = UTF8ToString(p); +} + +function boatSugg(p) { + document.getElementById('boat-sugg').textContent = UTF8ToString(p); +} + function updateUserAvg(avg) { document.getElementById('user-avg').textContent = avg.toFixed(2); } @@ -92,96 +187,40 @@ function updateBoatAvg(avg) { document.getElementById('boat-avg').textContent = avg.toFixed(2); } -function promptUpdateRem() { - let elem = document.getElementById('user-rem'); - let pts = document.getElementById('prompt').textContent; - - updateUserStateRem(pts ? user_rem - pts : user_rem); +function promptMsg(p) { + document.getElementById('prompt-msg').textContent = UTF8ToString(p); } -function promptAppend(val) { - if (!prompt_mode || prompt_mode == 'init_match') return; - clearOi(); - - let elem = document.getElementById('prompt'); - if (elem.textContent.length < 3) { - elem.textContent += val; - if (!prompt_num_darts) - promptUpdateRem(); - } +function promptMsgStr(str) { + document.getElementById('prompt-msg').textContent = str; } -function promptClear() { - if (!prompt_mode || prompt_mode == 'init_match') return; - clearOi(); - - document.getElementById('prompt').textContent = ''; - promptUpdateRem(); +function promptSuggStr(str) { + document.getElementById('prompt-sugg').textContent = str; } -function promptBackspace() { - if (!prompt_mode || prompt_mode == 'init_match') return; - clearOi(); +function promptUpdateRem() { + let elem = document.getElementById('user-rem'); + let pts = document.getElementById('prompt').textContent; - let elem = document.getElementById('prompt'); - elem.textContent = elem.textContent.slice(0, -1); - promptUpdateRem(); + updateUserStateRem(pts ? user_rem - pts : user_rem); } function promptNumDarts() { promptMsgStr('Darts needed?'); - prompt_num_darts = true; + prompt_handler = prompt_handler_num_darts; } function setBoatActive() { document.getElementById('user-state').classList.remove('active'); document.getElementById('boat-state').classList.add('active'); - prompt_mode = null; + prompt_handler = null; } function setUserActive() { document.getElementById('boat-state').classList.remove('active'); document.getElementById('user-state').classList.add('active'); - prompt_mode = 'user_active'; -} - -function promptSubmit(remaining) { - clearOi(); - if (!prompt_mode) return; - if (prompt_mode == 'init_match') { - initMatch(); - return; - } - - let elem = document.getElementById('prompt'); - let p_user = elem.textContent; - if (!p_user) return; - promptClear(); - - if (prompt_num_darts) { - if (!stcall('resp_numdarts', null, ['number'], [p_user])) { - oi(); - return; - } - prompt_num_darts = false; - return; - } - - if (remaining) - p_user = user_rem - p_user; - - if (!stcall('user_visit', 'number', ['number'], [p_user])) { - oi(); - return; - } - - clearMatchLog(); - stcall('draw_match'); - - if (!stcall('is_match_over', 'number')) { - setBoatActive(); - stcall('boat_visit', 'number', ['number'], [delay_ms]); - } + prompt_handler = prompt_handler_visit; } function drawBoatThrowing(pts, str) { @@ -212,7 +251,7 @@ function scheduleEndBoatThrowing(rem, avg, delay_ms) { } function matchOver() { - prompt_mode = 'init_match'; + prompt_handler = prompt_handler_init; promptSuggStr('Press OK to play again.'); document.getElementById('user-state').className = ''; } @@ -220,13 +259,13 @@ function matchOver() { function drawVisit(visit_no, u_pts, u_rem, b_pts, b_rem, b_darts) { let elem = document.getElementById('match'); - for (let [i, v] of [u_pts, u_rem, visit_no, b_rem, b_pts, b_darts].entries()) { + for (let [i, ptr] of [u_pts, u_rem, visit_no, b_rem, b_pts, b_darts].entries()) { let div = document.createElement('div'); - let vv = div.textContent = UTF8ToString(v); + let v = div.textContent = UTF8ToString(ptr); if (i == 0 || i == 4) { - div.className = `p${POINT_CLASSES.find(x => x <= vv)}`; + div.className = `p${POINT_CLASSES.find(x => x <= v)}`; } else if (i == 5) { - if (vv) div.textContent = `… ${vv}`; + if (v) div.textContent = `… ${v}`; } div.className += ` visit-col${i+1}`; elem.append(div); @@ -243,14 +282,14 @@ function updateStdev(val) { document.getElementById('stdev').value = val; } -function updateDelay(val) { - document.getElementById('delay').value = val; -} - function delayChanged(val) { delay_ms = val; } +function updateDelay(val) { + document.getElementById('delay').value = val; +} + function processKey(data) { if (data.altKey || data.ctrlKey || data.metaKey || data.target.type == 'text') return; @@ -263,7 +302,7 @@ function processKey(data) { else if (key == 'Backspace') promptBackspace(); else if (key == 'r') - promptSubmit(true); + promptSubmitRem(); } function modal(id) { |