Widget:Calculator/Combat/Max Hit
Jump to navigation
Jump to search
<style>
- max-hit-calc-widget { max-width: 360px; font-size: 14px; }
.max-hit-calc__table { border-collapse: collapse; width: 100%; } .max-hit-calc__table td { padding: 6px 4px; } .max-hit-calc__stat-label { display: flex; align-items: center; gap: 8px; } .max-hit-calc__stat-label img { vertical-align: middle; } .max-hit-calc__results { margin-top: 15px; padding: 12px; background-color: var(--bg-secondary, #1e1e1e); color: var(--text-main, #ccc); border: 1px solid var(--border-color-base, #333); border-radius: 5px; } .max-hit-calc__results b { color: var(--text-bright, #fff); }
- max-hit-calc-widget input[type="text"],
- max-hit-calc-widget input[type="number"] { width: 100%; background-color: var(--bg-main, #1e1f22); color: var(--text-main, #b6b4b2); border: 1px solid var(--border-color-base, #2d2d2d); border-radius: 4px; padding: 6px 8px; box-sizing: border-box; }
- max-hit-calc-widget select { width: 100%; background-color: var(--bg-main, #1e1f22); color: var(--text-main, #b6b4b2); border: 1px solid var(--border-color-base, #2d2d2d); border-radius: 4px; padding: 6px 8px; box-sizing: border-box; }
</style>
<tbody>
</tbody>
Strength Level
|
<input type="number" id="strength-level-input" value="1" min="1" max="100"> |
Strength Bonus
|
<input type="number" id="strength-bonus-input" value="0" min="0"> |
Training Style
|
<select id="training-style-select"> <option value="strength">Strength</option> <option value="accuracy">Accuracy</option> <option value="defense">Defense</option> <option value="all">All (controlled)</option> </select> |
Est. Max Hit: —
<script> (function() {
const strengthLevelInput = document.getElementById('strength-level-input'); const strengthBonusInput = document.getElementById('strength-bonus-input'); const trainingStyleSelect = document.getElementById('training-style-select'); const maxHitResultEl = document.getElementById('max-hit-result');
function calculateMaxHit() { let strengthLevel = parseInt(strengthLevelInput.value, 10) || 1; let strengthBonus = parseInt(strengthBonusInput.value, 10) || 0; const trainingStyle = trainingStyleSelect.value; // Check for the specific base case if (strengthLevel === 1 && strengthBonus === 0) { maxHitResultEl.textContent = 1; return; } // Ensure inputs are within valid range strengthLevel = Math.max(1, Math.min(100, strengthLevel)); strengthBonus = Math.max(0, strengthBonus); // Apply training style bonus let effectiveStrength; if (trainingStyle === 'strength') { effectiveStrength = strengthLevel + 3; } else if (trainingStyle === 'all') { effectiveStrength = strengthLevel + 1; } else { effectiveStrength = strengthLevel; }
const calculatedHit = ( 1.70 + 0.1085 * effectiveStrength + 0.0131 * strengthBonus - 0.0003 * (effectiveStrength ** 2) + 0.0020 * effectiveStrength * strengthBonus - 0.0002 * (strengthBonus ** 2) );
const maxHit = Math.max(1, Math.round(calculatedHit)); maxHitResultEl.textContent = maxHit; }
// Attach event listeners to all inputs and the select dropdown document.addEventListener('DOMContentLoaded', () => { strengthLevelInput.addEventListener('input', calculateMaxHit); strengthBonusInput.addEventListener('input', calculateMaxHit); trainingStyleSelect.addEventListener('change', calculateMaxHit); calculateMaxHit(); // Initial calculation on page load });
})(); </script>