added weapon categories
This commit is contained in:
parent
3d2e620af8
commit
0b5216af19
@ -1,77 +1,100 @@
|
|||||||
const WEAPONS = fetch("/data/weapons.json")
|
let WEAPONS;
|
||||||
.then(response => response.json())
|
let INFUSIONS;
|
||||||
.catch(error => console.log(error));
|
let CORRECTIONS;
|
||||||
const INFUSIONS = fetch("/data/infusions.json")
|
|
||||||
.then(response => response.json())
|
|
||||||
.catch(error => console.log(error));
|
|
||||||
const CORRECTIONS = fetch("/data/damage.json")
|
|
||||||
.then(response => response.json())
|
|
||||||
.catch(error => console.log(error));
|
|
||||||
|
|
||||||
let weapons;
|
|
||||||
let infusions;
|
|
||||||
let corrections;
|
|
||||||
|
|
||||||
const sum = (a, b) => a + b;
|
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
weapons = await WEAPONS;
|
WEAPONS = await fetch("/data/weapons.json").then((response) => response.json());
|
||||||
infusions = await INFUSIONS;
|
INFUSIONS = await fetch("/data/infusions.json").then((response) => response.json());
|
||||||
corrections = await CORRECTIONS;
|
CORRECTIONS = await fetch("/data/damage.json").then((response) => response.json());
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function update() {
|
function update() {
|
||||||
let infusionId = [...document.getElementsByName("infusion")].find(radio => radio.checked).id;
|
// get information from document
|
||||||
let upgradeLevel = 25;
|
let allowedInfusions = [
|
||||||
|
"standard",
|
||||||
|
...[...document.getElementsByName("infusion")].filter((elem) => elem.checked).map((elem) => elem.id),
|
||||||
|
];
|
||||||
|
|
||||||
let stats = [...document.getElementsByName("stat")].map(el => parseInt(el.value));
|
let upgraded = document.getElementById("max-upgrade").checked;
|
||||||
|
let requireStats = document.getElementById("requirements").checked;
|
||||||
|
let damageTypes = [...document.getElementsByName("damage-type")].map((el) => el.checked);
|
||||||
|
|
||||||
let sorted = sortWeapons(infusionId, upgradeLevel, stats);
|
let stats = [...document.getElementsByName("stat")].map((el) => parseInt(el.value));
|
||||||
|
let twoHanding = document.getElementById("2handing").checked;
|
||||||
|
if (twoHanding) {
|
||||||
|
stats[0] = Math.floor(stats[0] * 1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
let filtered = filterWeapons(stats, requireStats, allowedInfusions, damageTypes);
|
||||||
|
let sorted = sortWeapons(filtered, "standard", upgraded, stats);
|
||||||
|
|
||||||
|
// show sorted list
|
||||||
|
let destination = document.getElementById("weapons");
|
||||||
|
let template = document.getElementById("weaponTemplate");
|
||||||
|
sorted.forEach((weapon) => {
|
||||||
|
let clone = template.content.cloneNode(true);
|
||||||
|
|
||||||
|
let tr = clone.children[0];
|
||||||
|
tr.children[0].innerHTML = weapon.name;
|
||||||
|
tr.children[1].innerHTML = weapon.damage;
|
||||||
|
|
||||||
|
destination.appendChild(clone);
|
||||||
|
});
|
||||||
console.log(sorted);
|
console.log(sorted);
|
||||||
|
|
||||||
console.log(sorted.find(item => item.id == "royal-greatsword"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sortWeapons(infusionId, upgradeLevel, stats) {
|
function filterWeapons(stats, requireStats, allowedInfusions, damageTypes) {
|
||||||
return Object.values(weapons).sort((a, b) => damage(b, infusionId, upgradeLevel, stats) - damage(a, infusionId, upgradeLevel, stats));
|
let weapons = Object.values(WEAPONS).filter((weapon) => {
|
||||||
|
return allowedInfusions.some((inf) => Object.values(weapon.infusions).includes(inf));
|
||||||
|
});
|
||||||
|
if (requireStats) {
|
||||||
|
weapons = weapons.filter((weapon) => weapon.requirements.every((stat, i) => stat <= stats[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
function damage(weapon, infusionId, upgradeLevel, stats) {
|
return weapons;
|
||||||
if (weapon.total != undefined && weapon.total != null) {
|
}
|
||||||
return weapon.total;
|
|
||||||
|
function sortWeapons(weapons, infusionId, upgraded, stats) {
|
||||||
|
return weapons.sort((a, b) => damage(b, infusionId, upgraded, stats) - damage(a, infusionId, upgraded, stats));
|
||||||
|
}
|
||||||
|
|
||||||
|
function damage(weapon, infusionId, upgraded, stats) {
|
||||||
|
if (weapon.damage != undefined) {
|
||||||
|
return weapon.damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
let weaponInfusion = weapon.infusions[infusionId];
|
let weaponInfusion = weapon.infusions[infusionId];
|
||||||
let infusion = infusions[infusionId];
|
let infusion = INFUSIONS[infusionId];
|
||||||
|
let upgradeLevel = upgraded ? (weapon.unique ? 10 : 25) : 0;
|
||||||
let bases = infusion.damage.map((amount, ty) => weaponInfusion.damage[ty] * (amount + infusion.upgrade[ty] * upgradeLevel));
|
let bases = infusion.damage.map(
|
||||||
|
(amount, ty) => weaponInfusion.damage[ty] * (amount + infusion.upgrade[ty] * upgradeLevel)
|
||||||
|
);
|
||||||
|
|
||||||
let extras;
|
let extras;
|
||||||
if (stats.some((stat, i) => stat <= weapon.requirements[i])) {
|
if (stats.some((stat, i) => stat <= weapon.requirements[i])) {
|
||||||
extras = bases.map(dmg => dmg * -0.4);
|
extras = bases.map((dmg) => dmg * -0.4);
|
||||||
} else {
|
} else {
|
||||||
extras = bases.map((amount, ty) => {
|
extras = bases.map((amount, ty) => {
|
||||||
let calc = corrections[weaponInfusion.corrections[ty]];
|
let calc = CORRECTIONS[weaponInfusion.corrections[ty]];
|
||||||
let correction = typeCorrections(calc, stats, weaponInfusion.masks[ty]);
|
let correction = typeCorrections(calc, stats, weaponInfusion.masks[ty]);
|
||||||
let scalings = weaponInfusion.scaling.map(itemScaling => {
|
let scalings = weaponInfusion.scaling.map((itemScaling) => {
|
||||||
return (itemScaling * infusion.scaling[ty] + itemScaling * infusion.scaling[ty] * infusion.growth[ty] * upgradeLevel);
|
return (
|
||||||
})
|
itemScaling * infusion.scaling[ty] +
|
||||||
|
itemScaling * infusion.scaling[ty] * infusion.growth[ty] * upgradeLevel
|
||||||
|
);
|
||||||
|
});
|
||||||
let extras = scalings.map((statScaling, statIndex) => {
|
let extras = scalings.map((statScaling, statIndex) => {
|
||||||
return amount * statScaling * correction[statIndex] / 100.0;
|
return (amount * statScaling * correction[statIndex]) / 100.0;
|
||||||
})
|
});
|
||||||
return extras.reduce(sum);
|
return extras.reduce((sum, n) => sum + n);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let total = Math.floor(bases.reduce(sum) + extras.reduce(sum));
|
let damage = Math.floor(bases.reduce((sum, n) => sum + n) + extras.reduce((sum, n) => sum + n));
|
||||||
|
weapon.damage = damage;
|
||||||
|
|
||||||
weapon.bases = bases;
|
return damage;
|
||||||
weapon.extras = extras;
|
|
||||||
weapon.total = total;
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function typeCorrections(calc, stats, masks) {
|
function typeCorrections(calc, stats, masks) {
|
||||||
@ -81,7 +104,7 @@ function typeCorrections(calc, stats, masks) {
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let capIndex = calc.softcaps[ty].findIndex(cap => cap >= stat) - 1;
|
let capIndex = calc.softcaps[ty].findIndex((cap) => cap >= stat) - 1;
|
||||||
let cap = calc.softcaps[ty][capIndex];
|
let cap = calc.softcaps[ty][capIndex];
|
||||||
let capDelta = (calc.softcaps[ty][capIndex + 1] || cap) - cap;
|
let capDelta = (calc.softcaps[ty][capIndex + 1] || cap) - cap;
|
||||||
let growth = calc.growth[ty][capIndex];
|
let growth = calc.growth[ty][capIndex];
|
||||||
@ -91,7 +114,7 @@ function typeCorrections(calc, stats, masks) {
|
|||||||
if (Math.sign(adjust) != -1) {
|
if (Math.sign(adjust) != -1) {
|
||||||
return growth + growthDelta * ((stat - cap) / capDelta) ** adjust;
|
return growth + growthDelta * ((stat - cap) / capDelta) ** adjust;
|
||||||
} else {
|
} else {
|
||||||
return growth + growthDelta * (1 - (1 - ((stat - cap) / capDelta)) ** Math.abs(adjust));
|
return growth + growthDelta * (1 - (1 - (stat - cap) / capDelta) ** Math.abs(adjust));
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user