import {serializeFormData, deserializeFormData, storeData, getData} from "./utils.js"; import {combatModifiers, rpModifiers, features, spellSlots} from "./songs-meta.js" window.addEventListener("DOMContentLoaded", init); function init () { buildModifiers("#combat-modifiers", combatModifiers); buildModifiers("#rp-modifiers", rpModifiers); buildFeatures("#features", features); buildSpells("#spellcasting-spells", spellSlots); let data = getData(); deserializeFormData("#character-data", data); calculateModifiers(combatModifiers); calculateModifiers(rpModifiers) calculateSpellCasting();; let inputs = document.querySelectorAll("input, select, textarea"); for (let i = 0; i < inputs.length; i++) { inputs[i].addEventListener("input", refresh); } } function refresh () { calculateModifiers(combatModifiers); calculateModifiers(rpModifiers); calculateSpellCasting(); let data = serializeFormData("#character-data"); storeData(data); } function buildModifiers(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.display ? item.display : item.name}

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

${item.display ? item.display : item.name}

`; } } } } function buildFeatures (container) { let area = document.querySelector(container); for (let i in features) { let feature = features[i]; area.innerHTML += `

${feature.name}

${feature.level}

`; } } function buildSpells (container, numSpells) { let area = document.querySelector(container); for (let i = 0; i < numSpells; i++) { area.innerHTML += `
`; } } function calculateModifiers (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 calculateSpellCasting () { let attribute = document.querySelector("#spellcasting-attribute").value; let baseVal = 0; if (attribute === "int") { baseVal = Number(document.querySelector("#int").value); } else if (attribute === "cha") { baseVal = Number(document.querySelector("#cha").value); } let training = Number(document.querySelector("#spellcasting-training").value); let mb = Number(document.querySelector("#spellcasting-mb").checked); let mastery = Number(document.querySelector("#mastery").value); let modifier = baseVal + training + (mb * mastery); document.querySelector("#spellcasting-modifier").innerHTML = `= ${modifier}`; document.querySelector("#spellcasting-dc").innerHTML = `= ${8 + modifier}`; } 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`).innerHTML = `= ${value(e)}`; }