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');