Widget:Calculator/Combat/Max Hit

From HighSpell Wiki
Jump to navigation Jump to search

<style>

  1. 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); }

  1. max-hit-calc-widget input[type="text"],
  2. 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; }
  3. 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>