diff --git a/public/css/styles.css b/public/css/styles.css index abc1e3f..8ab8499 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -822,6 +822,14 @@ h1, h2, h3, h4, h5, h6 { line-height: 1; } +.dice-result-box.pending { + border-color: var(--info); +} + +.dice-total.pending-value { + color: var(--info); +} + .dice-breakdown { margin-top: 6px; font-family: var(--font-mono); diff --git a/public/index.html b/public/index.html index 0a23eee..0a770ca 100644 --- a/public/index.html +++ b/public/index.html @@ -273,10 +273,11 @@
Percentile
- + +
- Roll tens or ones. + Roll tens to begin.
diff --git a/public/js/dice.js b/public/js/dice.js index 3de89a6..8b1c61e 100644 --- a/public/js/dice.js +++ b/public/js/dice.js @@ -122,6 +122,52 @@ function clearCustomRoll() { box.innerHTML = 'Enter a quantity and die size.'; } +let percentileTens = null; + +function updatePercentileButtons() { + document.getElementById('percentileTensBtn').disabled = percentileTens !== null; + document.getElementById('percentileOnesBtn').disabled = percentileTens === null; +} + +function rollPercentileTens() { + percentileTens = Math.floor(Math.random() * 10) * 10; // 0, 10, 20 ... 90 + updatePercentileButtons(); + + const box = document.getElementById('percentileResult'); + box.className = 'dice-result-box animate pending'; + box.innerHTML = ` +
${percentileTens}
+
Tens rolled — now roll ones.
+ `; + void box.offsetWidth; +} + +function rollPercentileOnes() { + if (percentileTens === null) return; + + const ones = Math.floor(Math.random() * 10); // 0-9 + const total = percentileTens + ones === 0 ? 100 : percentileTens + ones; + + const box = document.getElementById('percentileResult'); + box.className = 'dice-result-box animate'; + box.innerHTML = ` +
${total}
+
Percentile  [tens: ${percentileTens}, ones: ${ones}]
+ `; + void box.offsetWidth; + + percentileTens = null; + updatePercentileButtons(); +} + +function clearPercentile() { + percentileTens = null; + updatePercentileButtons(); + const box = document.getElementById('percentileResult'); + box.className = 'dice-result-box'; + box.innerHTML = 'Roll tens to begin.'; +} + function quickRoll(sides, qty, mod, label, boxId) { const rolls = []; for (let i = 0; i < qty; i++) { @@ -173,12 +219,10 @@ function init() { document.getElementById('customRollBtn').addEventListener('click', rollCustom); document.getElementById('customClearBtn').addEventListener('click', clearCustomRoll); - document.getElementById('percentileTensBtn').addEventListener('click', () => { - quickRoll(10, 1, 0, 'Percentile (tens)', 'percentileResult'); - }); - document.getElementById('percentileOnesBtn').addEventListener('click', () => { - quickRoll(10, 1, 0, 'Percentile (ones)', 'percentileResult'); - }); + document.getElementById('percentileTensBtn').addEventListener('click', rollPercentileTens); + document.getElementById('percentileOnesBtn').addEventListener('click', rollPercentileOnes); + document.getElementById('percentileClearBtn').addEventListener('click', clearPercentile); + updatePercentileButtons(); document.getElementById('ability4d6Btn').addEventListener('click', () => { quickRoll(6, 4, -4, '4d6 drop lowest (approx)', 'abilityResult');