window.addEventListener("DOMContentLoaded", init); let combatModifiers = [ { category: "Saves", items: [ { name: "Resilience", type: "full", value: function (e) { return Math.max(e.STR, e.END) + e.training + (e.mb * e.mastery); } }, { name: "Reflex", type: "full", value: function (e) { return Math.max(e.AGI, e.WIT) + e.training + (e.mb * e.mastery); } }, { name: "Resolve", type: "full", value: function (e) { return Math.max(e.INT, e.CHA) + e.training + (e.mb * e.mastery); } } ] }, { category: "Weapon", items: [ { name: "Simple", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Brawl", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Bludgeon", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Axe", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Polearm", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Sword", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Archery", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } }, { name: "Firearm", type: "full", value: function (e) { return Math.max(e.STR, e.AGI) + e.training + (e.mb * e.mastery); } } ] }, { category: "Armor", items: [ { name: "Unarmored", type: "training-only", value: function (e) { return } }, { name: "Light", type: "training-only", value: function (e) { return } }, { name: "Medium", type: "training-only", value: function (e) { return } }, { name: "Heavy", type: "training-only", value: function (e) { return } } ] } ] let rpModifiers = [ { category: "Skills", items: [ { name: "Athletics", type: "full", value: function (e) { return e.STR + e.training + (e.mb * e.mastery); } }, { name: "Fortitude", type: "full", value: function (e) { return e.END + e.training + (e.mb * e.mastery); } }, { name: "Acrobatics", type: "full", value: function (e) { return e.AGI + e.training + (e.mb * e.mastery); } }, { name: "Stealth", type: "full", value: function (e) { return e.AGI + e.training + (e.mb * e.mastery); } }, { name: "Thievery", type: "full", value: function (e) { return e.AGI + e.training + (e.mb * e.mastery); } }, { name: "Animal_Handling", type: "full", value: function (e) { return e.WIT + e.training + (e.mb * e.mastery); } }, { name: "Intuition", type: "full", value: function (e) { return e.WIT + e.training + (e.mb * e.mastery); } }, { name: "Perception", type: "full", value: function (e) { return e.WIT + e.training + (e.mb * e.mastery); } }, { name: "Streetwise", type: "full", value: function (e) { return e.WIT + e.training + (e.mb * e.mastery); } }, { name: "Survival", type: "full", value: function (e) { return e.WIT + e.training + (e.mb * e.mastery); } }, { name: "Arcana", type: "full", value: function (e) { return e.INT + e.training + (e.mb * e.mastery); } }, { name: "Crafting", type: "full", value: function (e) { return e.INT + e.training + (e.mb * e.mastery); } }, { name: "Investigation", type: "full", value: function (e) { return e.INT + e.training + (e.mb * e.mastery); } }, { name: "Medicine", type: "full", value: function (e) { return e.INT + e.training + (e.mb * e.mastery); } }, { name: "Lore", type: "textarea", value: function (e) { return e.INT + e.training + (e.mb * e.mastery); } }, { name: "Deception", type: "full", value: function (e) { return e.CHA + e.training + (e.mb * e.mastery); } }, { name: "Intimidation", type: "full", value: function (e) { return e.CHA + e.training + (e.mb * e.mastery); } }, { name: "Performance", type: "full", value: function (e) { return e.CHA + e.training + (e.mb * e.mastery); } }, { name: "Persuasion", type: "full", value: function (e) { return e.CHA + e.training + (e.mb * e.mastery); } } ] } ] function init () { populateModifiers("#combat-modifiers", combatModifiers); window.setInterval(() => { setAllValues(combatModifiers) }, 250); populateModifiers("#rp-modifiers", rpModifiers); setAllValues(rpModifiers); window.setInterval(() => { setAllValues(rpModifiers) }, 250); } function populateModifiers(container, data) { let area = document.querySelector(container); for (let i in data) { let category = data[i]; let categoryDiv = document.createElement("div"); area.append(categoryDiv); categoryDiv.style = "display: contents;"; categoryDiv.innerHTML = `

${category.category}

`; for (let j in data[i].items) { let item = data[i].items[j]; if (item.type === "full") { categoryDiv.innerHTML += `

${item.name}

`; } else if (item.type === "training-only"){ categoryDiv.innerHTML += `

${item.name}

`; } else if (item.type === "textarea") { categoryDiv.innerHTML += `
`; } } } } function setAllValues (data) { for (let i in data) { let category = data[i]; for (let j in data[i].items) { let item = data[i].items[j]; setModifierVal(category.category, item.name, item.value); } } } function setModifierVal (category, name, value) { let e = {}; e.STR = Number(document.querySelector("#str").value); e.END = Number(document.querySelector("#end").value); e.AGI = Number(document.querySelector("#agi").value); e.WIT = Number(document.querySelector("#wit").value); e.INT = Number(document.querySelector("#int").value); e.CHA = Number(document.querySelector("#cha").value); e.training = Number(document.querySelector(`#${category}-${name}-training`).value); e.mb = Number(document.querySelector(`#${category}-${name}-mb`).checked); e.mastery = Number(document.querySelector("#mastery").value); document.querySelector(`#${category}-${name}-result`).innerText = value(e); }