2021-01-09 00:56:07 +00:00
|
|
|
// Calculate spell damage given a spell elemental conversion table, and a spell multiplier.
|
|
|
|
// If spell mult is 0, its melee damage and we don't multiply by attack speed.
|
2021-01-09 03:53:57 +00:00
|
|
|
function calculateSpellDamage(stats, spellConversions, rawModifier, pctModifier, spellMultiplier, weapon, total_skillpoints) {
|
2021-01-09 00:56:07 +00:00
|
|
|
// Array of neutral + ewtfa damages. Each entry is a pair (min, max).
|
|
|
|
let damages = [];
|
|
|
|
for (const damage_string of stats.get("damageRaw")) {
|
|
|
|
const damage_vals = damage_string.split("-").map(Number);
|
|
|
|
damages.push(damage_vals);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Applying powder.
|
|
|
|
let neutralRemaining = spellConversions[0];
|
|
|
|
let neutralBase = damages[0].slice();
|
|
|
|
let neutralRemainingRaw = damages[0];
|
|
|
|
for (let i = 0; i < 5; ++i) {
|
|
|
|
let conversionRatio = spellConversions[i+1]/100;
|
|
|
|
let min_diff = Math.min(neutralRemainingRaw[0], conversionRatio * neutralBase[0]);
|
|
|
|
let max_diff = Math.min(neutralRemainingRaw[1], conversionRatio * neutralBase[1]);
|
|
|
|
damages[i+1][0] = Math.floor(damages[i+1][0] + min_diff);
|
|
|
|
damages[i+1][1] = Math.floor(damages[i+1][1] + max_diff);
|
|
|
|
neutralRemainingRaw[0] = Math.floor(neutralRemainingRaw[0] - min_diff);
|
|
|
|
neutralRemainingRaw[1] = Math.floor(neutralRemainingRaw[1] - max_diff);
|
|
|
|
}
|
|
|
|
let rawBoosts = [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]];
|
|
|
|
for (const powderID of weapon.get("powders")) {
|
|
|
|
const powder = powderStats[powderID];
|
|
|
|
// Bitwise to force conversion to integer (integer division).
|
|
|
|
const element = (powderID/6) | 0;
|
|
|
|
let conversionRatio = powder.convert/100;
|
|
|
|
if (neutralRemainingRaw[0] > 0) {
|
|
|
|
let min_diff = Math.min(neutralRemainingRaw[0], conversionRatio * neutralBase[0]);
|
|
|
|
let max_diff = Math.min(neutralRemainingRaw[1], conversionRatio * neutralBase[1]);
|
|
|
|
damages[element+1][0] = Math.floor(damages[element+1][0] + min_diff);
|
|
|
|
damages[element+1][1] = Math.floor(damages[element+1][1] + max_diff);
|
|
|
|
neutralRemainingRaw[0] = Math.floor(neutralRemainingRaw[0] - min_diff);
|
|
|
|
neutralRemainingRaw[1] = Math.floor(neutralRemainingRaw[1] - max_diff);
|
|
|
|
}
|
|
|
|
damages[element+1][0] += powder.min;
|
|
|
|
damages[element+1][1] += powder.max;
|
|
|
|
}
|
|
|
|
damages[0][0] *= neutralRemaining / 100;
|
|
|
|
damages[0][1] *= neutralRemaining / 100;
|
|
|
|
console.log(damages);
|
|
|
|
|
2021-01-09 03:53:57 +00:00
|
|
|
let damageMult = 1;
|
2021-01-09 00:56:07 +00:00
|
|
|
// If we are doing melee calculations:
|
|
|
|
if (spellMultiplier == 0) {
|
|
|
|
spellMultiplier = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
damageMult *= spellMultiplier * baseDamageMultiplier[attackSpeeds.indexOf(stats.get("atkSpd"))];
|
|
|
|
}
|
|
|
|
|
|
|
|
rawModifier *= spellMultiplier;
|
|
|
|
|
|
|
|
let totalDamNorm = [rawModifier, rawModifier];
|
|
|
|
let totalDamCrit = [rawModifier, rawModifier];
|
|
|
|
let damages_results = [];
|
|
|
|
// 0th skillpoint is strength, 1st is dex.
|
|
|
|
let str = total_skillpoints[0];
|
|
|
|
let staticBoost = (pctModifier / 100.) + skillPointsToPercentage(str);
|
|
|
|
let skillBoost = [0];
|
|
|
|
for (let i in total_skillpoints) {
|
|
|
|
skillBoost.push(skillPointsToPercentage(total_skillpoints[i]) + stats.get("damageBonus")[i] / 100.);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let i in damages) {
|
|
|
|
let damageBoost = 1 + skillBoost[i] + staticBoost;
|
|
|
|
damages_results.push([
|
|
|
|
Math.max(damages[i][0] * damageBoost * damageMult, 0), // Normal min
|
|
|
|
Math.max(damages[i][1] * damageBoost * damageMult, 0), // Normal max
|
|
|
|
Math.max(damages[i][0] * (1 + damageBoost) * damageMult, 0), // Crit min
|
|
|
|
Math.max(damages[i][1] * (1 + damageBoost) * damageMult, 0), // Crit max
|
|
|
|
]);
|
|
|
|
totalDamNorm[0] += damages_results[i][0];
|
|
|
|
totalDamNorm[1] += damages_results[i][1];
|
|
|
|
totalDamCrit[0] += damages_results[i][2];
|
|
|
|
totalDamCrit[1] += damages_results[i][3];
|
|
|
|
}
|
2021-01-09 03:53:57 +00:00
|
|
|
damages_results[0][0] += rawModifier;
|
|
|
|
damages_results[0][1] += rawModifier;
|
2021-01-09 00:56:07 +00:00
|
|
|
return [totalDamNorm, totalDamCrit, damages_results];
|
|
|
|
}
|