From 3d2e620af836682f5c853902b07bfdd67aa152e6 Mon Sep 17 00:00:00 2001 From: vodofrede Date: Mon, 4 Apr 2022 19:01:12 +0200 Subject: [PATCH] fixed some stuff --- src/data/chestpieces.json | 10 +++- src/data/classes.json | 44 +++++++------- src/data/gauntlets.json | 2 +- src/data/helmets.json | 26 +-------- src/data/leggings.json | 10 +++- src/data/talismans.json | 2 +- src/data/weapons.json | 2 +- src/script/armor.js | 120 +++++++++++++++++++++----------------- src/script/class.js | 2 +- 9 files changed, 112 insertions(+), 106 deletions(-) diff --git a/src/data/chestpieces.json b/src/data/chestpieces.json index 0970c74..2db4db2 100644 --- a/src/data/chestpieces.json +++ b/src/data/chestpieces.json @@ -1,7 +1,7 @@ { "no-chestpiece": { "id": "no-chestpieces", - "name": "None", + "name": "No chestpiece", "defenses": [0, 0, 0, 0, 0, 0, 0, 0], "resistances": [0, 0, 0, 0], "poise": 0, @@ -439,6 +439,14 @@ "poise": 16, "weight": 10.6 }, + "deathbed-dress": { + "id": "deathbed-dress", + "name": "Deathbed Dress", + "defenses": [0.6, 2.7, 0.6, 0.6, 11.9, 11.4, 11.9, 12.4], + "resistances": [38, 11, 63, 107], + "poise": 1, + "weight": 3.2 + }, "depraved-perfumer-robe": { "id": "depraved-perfumer-robe", "name": "Depraved Perfumer Robe", diff --git a/src/data/classes.json b/src/data/classes.json index d726f13..140d96f 100644 --- a/src/data/classes.json +++ b/src/data/classes.json @@ -1,21 +1,9 @@ [ { - "id": "vagabond", - "name": "Vagabond", - "level": 9, - "stats": [15, 10, 11, 14, 13, 9, 9, 7] - }, - { - "id": "warrior", - "name": "Warrior", - "level": 8, - "stats": [11, 12, 11, 10, 16, 10, 8, 9] - }, - { - "id": "hero", - "name": "Hero", - "level": 7, - "stats": [14, 9, 12, 16, 9, 7, 8, 11] + "id": "wretch", + "name": "Wretch", + "level": 1, + "stats": [10, 10, 10, 10, 10, 10, 10, 10] }, { "id": "bandit", @@ -29,12 +17,30 @@ "level": 6, "stats": [9, 15, 9, 8, 12, 16, 7, 9] }, + { + "id": "hero", + "name": "Hero", + "level": 7, + "stats": [14, 9, 12, 16, 9, 7, 8, 11] + }, { "id": "prophet", "name": "Prophet", "level": 7, "stats": [10, 14, 8, 11, 10, 7, 16, 10] }, + { + "id": "warrior", + "name": "Warrior", + "level": 8, + "stats": [11, 12, 11, 10, 16, 10, 8, 9] + }, + { + "id": "vagabond", + "name": "Vagabond", + "level": 9, + "stats": [15, 10, 11, 14, 13, 9, 9, 7] + }, { "id": "samurai", "name": "Samurai", @@ -52,11 +58,5 @@ "name": "Confessor", "level": 10, "stats": [10, 13, 10, 12, 12, 9, 14, 9] - }, - { - "id": "wretch", - "name": "Wretch", - "level": 1, - "stats": [10, 10, 10, 10, 10, 10, 10, 10] } ] diff --git a/src/data/gauntlets.json b/src/data/gauntlets.json index 4972d40..6e41da9 100644 --- a/src/data/gauntlets.json +++ b/src/data/gauntlets.json @@ -1,7 +1,7 @@ { "no-gauntlets": { "id": "no-gauntlets", - "name": "None", + "name": "No gauntlets", "defenses": [0, 0, 0, 0, 0, 0, 0, 0], "resistances": [0, 0, 0, 0], "poise": 0, diff --git a/src/data/helmets.json b/src/data/helmets.json index 41d5816..5c091f0 100644 --- a/src/data/helmets.json +++ b/src/data/helmets.json @@ -1,7 +1,7 @@ { "no-helmet": { "id": "no-helmet", - "name": "None", + "name": "No helmet", "defenses": [0, 0, 0, 0, 0, 0, 0, 0], "resistances": [0, 0, 0, 0], "poise": 0, @@ -344,22 +344,6 @@ "poise": 6, "weight": 5.1 }, - "deathbed-dress": { - "id": "deathbed-dress", - "name": "Deathbed Dress", - "defenses": [0.6, 2.7, 0.6, 0.6, 11.9, 11.4, 11.9, 12.4], - "resistances": [38, 11, 63, 107], - "poise": 1, - "weight": 3.2 - }, - "deathbed-smalls": { - "id": "deathbed-smalls", - "name": "Deathbed Smalls", - "defenses": [1.5, 2.3, 1.5, 1.5, 6.8, 6.5, 6.8, 7.2], - "resistances": [24, 7, 39, 66], - "poise": 1, - "weight": 2.0 - }, "depraved-perfumer-headscarf": { "id": "depraved-perfumer-headscarf", "name": "Depraved Perfumer Headscarf", @@ -1167,14 +1151,6 @@ "poise": 6, "weight": 5.1 }, - "rotten-duelist-greaves": { - "id": "rotten-duelist-greaves", - "name": "Rotten Duelist Greaves", - "defenses": [7.4, 6.2, 7.7, 7.1, 6.2, 6.5, 5.8, 6.2], - "resistances": [35, 35, 15, 15], - "poise": 10, - "weight": 7.3 - }, "rotten-duelist-helm": { "id": "rotten-duelist-helm", "name": "Rotten Duelist Helm", diff --git a/src/data/leggings.json b/src/data/leggings.json index 6467efc..3947440 100644 --- a/src/data/leggings.json +++ b/src/data/leggings.json @@ -1,7 +1,7 @@ { "no-leggings": { "id": "no-leggings", - "name": "None", + "name": "No leggings", "defenses": [0, 0, 0, 0, 0, 0, 0, 0], "resistances": [0, 0, 0, 0], "poise": 0, @@ -662,6 +662,14 @@ "poise": 5, "weight": 5.7 }, + "rotten-duelist-greaves": { + "id": "rotten-duelist-greaves", + "name": "Rotten Duelist Greaves", + "defenses": [7.4, 6.2, 7.7, 7.1, 6.2, 6.5, 5.8, 6.2], + "resistances": [35, 35, 15, 15], + "poise": 10, + "weight": 7.3 + }, "royal-knight-greaves": { "id": "royal-knight-greaves", "name": "Royal Knight Greaves", diff --git a/src/data/talismans.json b/src/data/talismans.json index 0b66ce2..8b1ef80 100644 --- a/src/data/talismans.json +++ b/src/data/talismans.json @@ -1,5 +1,5 @@ { - "no-talisman": { "id": "no-talismans", "name": "None" }, + "no-talisman": { "id": "no-talismans", "name": "No talisman" }, "crimson-amber-medallion": { "id": "crimson-amber-medallion", "name": "Crimson Amber Medallion", diff --git a/src/data/weapons.json b/src/data/weapons.json index 48f05e1..0ac4e65 100644 --- a/src/data/weapons.json +++ b/src/data/weapons.json @@ -1,7 +1,7 @@ { "no-weapon": { "id": "no-weapons", - "name": "None", + "name": "No weapon", "requirements": [0, 0, 0, 0, 0], "infusions": { "standard": { diff --git a/src/script/armor.js b/src/script/armor.js index 54c9670..b3c5745 100644 --- a/src/script/armor.js +++ b/src/script/armor.js @@ -1,15 +1,15 @@ const HELMETS = fetch("/data/helmets.json") - .then(response => response.json()) - .catch(error => console.log(error)); + .then((response) => response.json()) + .catch((error) => console.log(error)); const CHESTPIECES = fetch("/data/chestpieces.json") - .then(response => response.json()) - .catch(error => console.log(error)); + .then((response) => response.json()) + .catch((error) => console.log(error)); const GAUNTLETS = fetch("/data/gauntlets.json") - .then(response => response.json()) - .catch(error => console.log(error)); + .then((response) => response.json()) + .catch((error) => console.log(error)); const LEGGINGS = fetch("/data/leggings.json") - .then(response => response.json()) - .catch(error => console.log(error)); + .then((response) => response.json()) + .catch((error) => console.log(error)); var helmets; var chestpieces; @@ -28,7 +28,7 @@ async function init() { async function update() { // remove any previous results - Array.from(document.getElementsByClassName("sort-result")).forEach(elem => elem.parentNode.removeChild(elem)); + Array.from(document.getElementsByClassName("sort-result")).forEach((elem) => elem.parentNode.removeChild(elem)); // clamp equip load values to reasonable values // [...document.getElementsByName("equip-load")].forEach(el => el.value = Math.max(el.value, 0.0)); @@ -36,15 +36,14 @@ async function update() { // update budget let budget = equipLoadBudget(); document.getElementById("equip-load-budget").value = budget.toFixed(1); - let sortBy = [...document.getElementsByName("sorting-order")].find(elem => elem.checked).id; + let sortBy = [...document.getElementsByName("sorting-order")].find((elem) => elem.checked).id; // get locked items - let lockedItems = await Promise.all([HELMETS, CHESTPIECES, GAUNTLETS, LEGGINGS]) - .then(allItems => { - return [...document.getElementsByName("locked-items")] - .map((select, i) => Object.values(allItems[i])[select.selectedIndex]) - .filter(item => !item.id.startsWith("no-")); - }); + let lockedItems = await Promise.all([HELMETS, CHESTPIECES, GAUNTLETS, LEGGINGS]).then((allItems) => { + return [...document.getElementsByName("locked-items")] + .map((select, i) => Object.values(allItems[i])[select.selectedIndex]) + .filter((item) => !item.id.startsWith("no-")); + }); // pre-sort and eliminate some equipment helmets = eliminate(Object.values(await HELMETS), sortBy, lockedItems); @@ -61,22 +60,22 @@ async function update() { } function reset() { - [...document.getElementsByName("locked-items")].forEach(select => select.selectedIndex = 0); + [...document.getElementsByName("locked-items")].forEach((select) => (select.selectedIndex = 0)); update(); } function eliminate(list, sortBy, lockedItems) { - if (lockedItems.some(item => list.includes(item))) { - return [list.find(item => lockedItems.includes(item))]; + if (lockedItems.some((item) => list.includes(item))) { + return [list.find((item) => lockedItems.includes(item))]; } let sorted = [...list]; sorted.sort((a, b) => a.weight - b.weight); - let approved = [] - sorted.forEach(item => { - if (!approved.some(other => fitness(item, sortBy) <= fitness(other, sortBy))) { - approved.push(item) + let approved = []; + sorted.forEach((item) => { + if (!approved.some((other) => fitness(item, sortBy) <= fitness(other, sortBy))) { + approved.push(item); } }); @@ -84,48 +83,50 @@ function eliminate(list, sortBy, lockedItems) { } function permutations(budget, lockedItems) { - return helmets.flatMap(h => { - return chestpieces.flatMap(c => { - return gauntlets.flatMap(g => { + return helmets.flatMap((h) => { + return chestpieces.flatMap((c) => { + return gauntlets.flatMap((g) => { return leggings - .filter(l => isAllowedSet([h, c, g, l], lockedItems)) - .filter(l => budget > setWeight([h, c, g, l])) - .map(l => [h, c, g, l]); - }) - }) + .filter((l) => isAllowedSet([h, c, g, l], lockedItems)) + .filter((l) => budget > setWeight([h, c, g, l])) + .map((l) => [h, c, g, l]); + }); + }); }); } function knapSack(selection, sortBy) { - return selection.reduce((best, set) => { - best.push(set); - best.sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy)); - best.pop(); - return best; - }, selection.slice(0, 3)).sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy)); + return selection + .reduce((best, set) => { + best.push(set); + best.sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy)); + best.pop(); + return best; + }, selection.slice(0, 3)) + .sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy)); } function fitness(item, sortBy) { switch (sortBy) { case "sort-average": - return item.average ??= (item.defenses.reduce((total, n) => total + n, 0) ?? 0); + return item.defenses.reduce((total, n) => total + n, 0) ?? 0; case "sort-physical": - return item.physical ??= (item.defenses.slice(0, 4).reduce((total, n) => total + n, 0) ?? 0); + return item.defenses.slice(0, 4).reduce((total, n) => total + n, 0) ?? 0; case "sort-elemental": - return item.elemental ??= (item.defenses.slice(4, 8).reduce((total, n) => total + n, 0) ?? 0); + return item.defenses.slice(4, 8).reduce((total, n) => total + n, 0) ?? 0; case "sort-resistances": - return item.resistances ??= (item.resistances.reduce((total, n) => total + n, 0) ?? 0); + return item.resistances.reduce((total, n) => total + n, 0) ?? 0; case "sort-poise": return item.poise ?? 0; } } -const setWeight = (set) => set.weight ??= set.reduce((total, item) => total + item.weight, 0); -const setFitness = (set, sortBy) => set.fitness ??= set.reduce((total, item) => total + fitness(item, sortBy), 0.0); -const isAllowedSet = (set, lockedItems) => lockedItems.every(item => set.includes(item)); +const setWeight = (set) => (set.weight ??= set.reduce((total, item) => total + item.weight, 0)); +const setFitness = (set, sortBy) => (set.fitness ??= set.reduce((total, item) => total + fitness(item, sortBy), 0.0)); +const isAllowedSet = (set, lockedItems) => lockedItems.every((item) => set.includes(item)); function equipLoadBudget() { - let rollModifier = parseFloat([...document.getElementsByName("roll-type")].find(elem => elem.checked).value); + let rollModifier = parseFloat([...document.getElementsByName("roll-type")].find((elem) => elem.checked).value); let max = document.getElementById("max-equip-load").value || 0; let current = document.getElementById("current-equip-load").value || 0; @@ -136,7 +137,7 @@ function equipLoadBudget() { // site rendering functions function populateSelect(templateId, destinationId, items) { let destination = document.getElementById(destinationId); - items.forEach(item => { + items.forEach((item) => { destination.options.add(new Option(item.name, item.id)); }); } @@ -145,7 +146,7 @@ async function populateResults(templateId, destinationId, sets) { let template = document.getElementById(templateId); let destination = document.getElementById(destinationId); - (await sets).forEach(set => { + (await sets).forEach((set) => { let clone = template.content.cloneNode(true); let li = clone.children[0]; @@ -172,11 +173,22 @@ async function populateResults(templateId, destinationId, sets) { function itemStatsToString(item) { let weight = item.weight.toFixed(1) + " wgt., "; let poise = item.poise + " poise, "; - let physical = item.defenses.slice(0, 4).reduce((total, defense) => total + defense, 0.0).toFixed(1) + " phys. "; - let elemental = item.defenses.slice(4, 8).reduce((total, defense) => total + defense, 0.0).toFixed(1) + " elem. "; + let physical = + item.defenses + .slice(0, 4) + .reduce((total, defense) => total + defense, 0.0) + .toFixed(1) + " phys. "; + let elemental = + item.defenses + .slice(4, 8) + .reduce((total, defense) => total + defense, 0.0) + .toFixed(1) + " elem. "; // let physical = item.defenses.slice(0, 4).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i] + ", ", 0.0); // let elemental = item.defenses.slice(4, 8).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i + 4] + ", ", ""); - let resistances = item.resistances.reduce((total, res, i) => total + res + " " + ["immunity", "robustness", "focus", "vitality"][i] + ", ", ""); + let resistances = item.resistances.reduce( + (total, res, i) => total + res + " " + ["immunity", "robustness", "focus", "vitality"][i] + ", ", + "" + ); return weight + poise + physical + elemental + "
" + resistances; } @@ -186,8 +198,10 @@ function setStatsToString(set) { weight: set[0].weight + set[1].weight + set[2].weight + set[3].weight, poise: set[0].poise + set[1].poise + set[2].poise + set[3].poise, defenses: set[0].defenses.map((stat, i) => stat + set[1].defenses[i] + set[2].defenses[i] + set[3].defenses[i]), - resistances: set[0].resistances.map((stat, i) => stat + set[1].resistances[i] + set[2].resistances[i] + set[3].resistances[i]) - } + resistances: set[0].resistances.map( + (stat, i) => stat + set[1].resistances[i] + set[2].resistances[i] + set[3].resistances[i] + ), + }; return itemStatsToString(imaginary); -} \ No newline at end of file +} diff --git a/src/script/class.js b/src/script/class.js index 1826af8..4d28dd2 100644 --- a/src/script/class.js +++ b/src/script/class.js @@ -68,7 +68,7 @@ async function update() { elem.value = Math.max(total[i] - items[i], best.stats[i]); }); document.getElementsByName("virtual").forEach((elem, i) => { - elem.value = Math.max(total[i], best.stats[i]); + elem.value = Math.max(total[i], best.stats[i] + items[i]); }); document.getElementById("initial-level").value = best.stats.reduce((sum, n) => sum + n) - 79;