From de62e91ac997a93155ed645ff3c7a342b32052d6 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 5 Jun 2025 00:05:42 +0200 Subject: [PATCH] Final(ish) --- index.html | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/index.html b/index.html index 25b586e..1859e04 100644 --- a/index.html +++ b/index.html @@ -249,6 +249,10 @@ display: initial; } + .pool-container input { + width: 30%; + } + #btn-load-character { display: none; } @@ -288,6 +292,8 @@ Campaign Name Max Effort + Armor +

Abilities

@@ -399,6 +405,26 @@ const inputCampaignName = document.getElementById("campaign-name"); const inputMaxEffort = document.getElementById("max-effort"); const characterSelector = document.getElementById("character-roster"); + const abilitySelector = document.getElementById("ability-selector"); + const abilityInitialCost = document.getElementById("ability-cost"); + const abilityEffort = document.getElementById("ability-effort"); + const abilityRoller = document.getElementById("roll-ability"); + const abilityCostDisplay = document.getElementById("ability-cost-display"); + const poolChoices = { + might: document.getElementById("pool-selector-might"), + speed: document.getElementById("pool-selector-speed"), + intellect: document.getElementById("pool-selector-intellect"), + }; + const poolValues = { + might: document.getElementById("pool-value-might"), + speed: document.getElementById("pool-value-speed"), + intellect: document.getElementById("pool-value-intellect"), + }; + const poolEdges = { + might: document.getElementById("pool-edge-might"), + speed: document.getElementById("pool-edge-speed"), + intellect: document.getElementById("pool-edge-intellect"), + }; var characterRoster = {}; var currentCharacter = null; @@ -580,6 +606,44 @@ } }; + const d20 = () => Math.floor(Math.random() * 20) + 1; + + const getSelectedAttribute = () => { + var currentPoolSelector = document.querySelector("input[name=pool-selector]:checked"); + + return (currentPoolSelector === null) ? null : currentPoolSelector.value; + }; + + const getSelectedPool = () => { + if ((currentPool = getSelectedAttribute()) === null) { + return 0; + } + + return Number(poolValues[currentPool].value); + }; + + const getSelectedEdge = () => { + if ((currentPool = getSelectedAttribute()) === null) { + return 0; + } + + return Number(poolEdges[currentPool].value); + }; + + const calculateAbilityCost = () => { + var cost = Number(abilityInitialCost.value); + var usedEffort = Number(abilityEffort.value); + var effortCost = (usedEffort > 0) ? 3 + Math.max(usedEffort - 1, 0) * 2 : 0; + cost += effortCost - getSelectedEdge(); + + return Math.max(cost, 0); + }; + + const updateAbilityCost = () => { + var cost = calculateAbilityCost(); + abilityCostDisplay.innerHTML = String(cost); + }; + document.addEventListener( "DOMContentLoaded", () => { @@ -592,6 +656,41 @@ }, ); + abilitySelector.addEventListener( + "change", + (evt) => { + var selectedOption = evt.target.selectedOptions[0]; + + if (selectedOption.dataset.pool !== null) { + var poolChooser = poolChoices[selectedOption.dataset.pool]; + poolChooser.checked = true; + abilityInitialCost.value = Number(selectedOption.dataset.cost); + } + }, + ); + + abilityInitialCost.addEventListener("input", updateAbilityCost); + + var abilityEffortChecking = false; + + abilityEffort.addEventListener( + "input", + (evt) => { + if (abilityEffortChecking) return; + + abilityEffortChecking = true; + + if (evt.target.value < 0) { + evt.target.value = 0; + } else if (evt.target.value >= inputMaxEffort.value) { + evt.target.value = maxEffort.value; + } + + updateAbilityCost(); + abilityEffortChecking = false; + }, + ); + btnNoCharCreateCharacter.addEventListener("click", createCharacter); document