Fix crafter page, fix damage calculation for crafted and normal items (no longer rounded powder damage)

This commit is contained in:
hppeng 2022-06-26 00:08:02 -07:00
parent efe3a7b0e8
commit 975c0faa1f
8 changed files with 91 additions and 44 deletions

View file

@ -301,8 +301,6 @@
<script type="text/javascript" src="../js/damage_calc.js"></script> <script type="text/javascript" src="../js/damage_calc.js"></script>
<script type="text/javascript" src="../js/display_constants.js"></script> <script type="text/javascript" src="../js/display_constants.js"></script>
<script type="text/javascript" src="../js/display.js"></script> <script type="text/javascript" src="../js/display.js"></script>
<script type="text/javascript" src="../js/sq2display_constants.js"></script>
<script type="text/javascript" src="../js/sq2display.js"></script>
<script type="text/javascript" src="../js/load_ing.js"></script> <script type="text/javascript" src="../js/load_ing.js"></script>
<script type="text/javascript" src="../js/load.js"></script> <script type="text/javascript" src="../js/load.js"></script>
<script type="text/javascript" src="../js/craft.js"></script> <script type="text/javascript" src="../js/craft.js"></script>

View file

@ -62,8 +62,6 @@
<script type="text/javascript" src="/js/load_ing.js"></script> <script type="text/javascript" src="/js/load_ing.js"></script>
<script type="text/javascript" src="/js/display_constants.js"></script> <script type="text/javascript" src="/js/display_constants.js"></script>
<script type="text/javascript" src="/js/display.js"></script> <script type="text/javascript" src="/js/display.js"></script>
<script type="text/javascript" src="/js/sq2display_constants.js"></script>
<script type="text/javascript" src="/js/sq2display.js"></script>
<script type="text/javascript" src="/js/item.js"></script> <script type="text/javascript" src="/js/item.js"></script>
</body> </body>
</html> </html>

View file

@ -79,8 +79,6 @@
<script type="text/javascript" src="/js/damage_calc.js"></script> <script type="text/javascript" src="/js/damage_calc.js"></script>
<script type="text/javascript" src="/js/display_constants.js"></script> <script type="text/javascript" src="/js/display_constants.js"></script>
<script type="text/javascript" src="/js/display.js"></script> <script type="text/javascript" src="/js/display.js"></script>
<script type="text/javascript" src="/js/sq2display_constants.js"></script>
<script type="text/javascript" src="/js/sq2display.js"></script>
<script type="text/javascript" src="/js/query_2.js"></script> <script type="text/javascript" src="/js/query_2.js"></script>
<script type="text/javascript" src="/js/expr_parser.js"></script> <script type="text/javascript" src="/js/expr_parser.js"></script>
<script type="text/javascript" src="/js/load.js"></script> <script type="text/javascript" src="/js/load.js"></script>

View file

@ -58,7 +58,7 @@ const baseDamageMultiplier = [ 0.51, 0.83, 1.5, 2.05, 2.5, 3.1, 4.3 ];
const classes = ["Warrior", "Assassin", "Mage", "Archer", "Shaman"]; const classes = ["Warrior", "Assassin", "Mage", "Archer", "Shaman"];
const wep_to_class = new Map([["dagger", "Assassin"], ["spear", "Warrior"], ["wand", "Mage"], ["bow", "Archer"], ["relik", "Shaman"]]) const wep_to_class = new Map([["dagger", "Assassin"], ["spear", "Warrior"], ["wand", "Mage"], ["bow", "Archer"], ["relik", "Shaman"]])
const tiers = ["Normal", "Unique", "Rare", "Legendary", "Fabled", "Mythic", "Set", "Crafted"] //I'm not sure why you would make a custom crafted but if you do you should be able to use it w/ the correct powder formula const tiers = ["Normal", "Unique", "Rare", "Legendary", "Fabled", "Mythic", "Set", "Crafted"] //I'm not sure why you would make a custom crafted but if you do you should be able to use it w/ the correct powder formula
const types = armorTypes.concat(accessoryTypes).concat(weaponTypes).concat(consumableTypes).concat(tome_types).map(x => x.substring(0,1).toUpperCase() + x.substring(1)); const all_types = armorTypes.concat(accessoryTypes).concat(weaponTypes).concat(consumableTypes).concat(tome_types).map(x => x.substring(0,1).toUpperCase() + x.substring(1));
//weaponTypes.push("sword"); //weaponTypes.push("sword");
//console.log(types) //console.log(types)
let itemTypes = armorTypes.concat(accessoryTypes).concat(weaponTypes).concat(tome_types); let itemTypes = armorTypes.concat(accessoryTypes).concat(weaponTypes).concat(tome_types);

View file

@ -204,9 +204,14 @@ class ItemInputNode extends InputNode {
type_match = item.statMap.get('type') === this.none_item.statMap.get('type'); type_match = item.statMap.get('type') === this.none_item.statMap.get('type');
} }
if (type_match) { if (type_match) {
if (item.statMap.get('category') === 'armor' && powdering !== undefined) { if (powdering !== undefined) {
if (item.statMap.get('category') === 'armor') {
applyArmorPowders(item.statMap, powdering); applyArmorPowders(item.statMap, powdering);
} }
else if (item.statMap.get('category') === 'weapon') {
apply_weapon_powders(item.statMap, powdering);
}
}
return item; return item;
} }
} }
@ -330,7 +335,7 @@ class WeaponInputDisplayNode extends ComputeNode {
dps = dps[1]; dps = dps[1];
if (isNaN(dps)) dps = 0; if (isNaN(dps)) dps = 0;
} }
this.dps_field.textContent = dps; this.dps_field.textContent = Math.round(dps);
//as of now, we NEED to have the dropdown tab visible/not hidden in order to properly display atree stuff. //as of now, we NEED to have the dropdown tab visible/not hidden in order to properly display atree stuff.
if (!document.getElementById("toggle-atree").classList.contains("toggleOn")) { if (!document.getElementById("toggle-atree").classList.contains("toggleOn")) {

View file

@ -172,16 +172,17 @@ function calculateCraft() {
document.getElementById("mat-2").textContent = recipe.get("materials")[1].get("item").split(" ").slice(1).join(" ") + " Tier:"; document.getElementById("mat-2").textContent = recipe.get("materials")[1].get("item").split(" ").slice(1).join(" ") + " Tier:";
//Display Recipe Stats //Display Recipe Stats
displaysq2RecipeStats(player_craft, "recipe-stats"); displayRecipeStats(player_craft, "recipe-stats");
//Display Craft Stats //Display Craft Stats
// displayCraftStats(player_craft, "craft-stats"); // displayCraftStats(player_craft, "craft-stats");
let mock_item = player_craft.statMap; let mock_item = player_craft.statMap;
displaysq2ExpandedItem(mock_item, "craft-stats"); apply_weapon_powders(mock_item);
displayExpandedItem(mock_item, "craft-stats");
//Display Ingredients' Stats //Display Ingredients' Stats
for (let i = 1; i < 7; i++) { for (let i = 1; i < 7; i++) {
displaysq2ExpandedIngredient(player_craft.ingreds[i-1] , "ing-"+i+"-stats"); displayExpandedIngredient(player_craft.ingreds[i-1] , "ing-"+i+"-stats");
} }
//Display Warnings - only ingred type warnings for now //Display Warnings - only ingred type warnings for now
let warning_elem = document.getElementById("craft-warnings"); let warning_elem = document.getElementById("craft-warnings");
@ -341,7 +342,7 @@ function toggleMaterial(buttonId) {
*/ */
function updateCraftedImage() { function updateCraftedImage() {
let input = document.getElementById("recipe-choice"); let input = document.getElementById("recipe-choice");
if (item_types.includes(input.value)) { if (all_types.includes(input.value)) {
document.getElementById("recipe-img").src = "../media/items/" + (newIcons ? "new/":"old/") + "generic-" + input.value.toLowerCase() + ".png"; document.getElementById("recipe-img").src = "../media/items/" + (newIcons ? "new/":"old/") + "generic-" + input.value.toLowerCase() + ".png";
} }
@ -364,4 +365,8 @@ function resetFields() {
calculateCraft(); calculateCraft();
} }
load_ing_init(init_crafter); (async function() {
let load_promises = [ load_ing_init() ];
await Promise.all(load_promises);
init_crafter();
})();

View file

@ -1,34 +1,25 @@
const damageMultipliers = new Map([ ["allytotem", .15], ["yourtotem", .35], ["vanish", 0.80], ["warscream", 0.10], ["bash", 0.50] ]); const damageMultipliers = new Map([ ["allytotem", .15], ["yourtotem", .35], ["vanish", 0.80], ["warscream", 0.10], ["bash", 0.50] ]);
// GRR THIS MUTATES THE ITEM const damage_keys = [ "nDam_", "eDam_", "tDam_", "wDam_", "fDam_", "aDam_" ];
const damage_present_key = 'damagePresent';
function get_base_dps(item) { function get_base_dps(item) {
const attack_speed_mult = baseDamageMultiplier[attackSpeeds.indexOf(item.get("atkSpd"))]; const attack_speed_mult = baseDamageMultiplier[attackSpeeds.indexOf(item.get("atkSpd"))];
//SUPER JANK @HPP PLS FIX //SUPER JANK @HPP PLS FIX
let damage_keys = [ "nDam_", "eDam_", "tDam_", "wDam_", "fDam_", "aDam_" ];
if (item.get("tier") !== "Crafted") { if (item.get("tier") !== "Crafted") {
let weapon_result = apply_weapon_powder(item);
let damages = weapon_result[0];
let total_damage = 0; let total_damage = 0;
for (const i in damage_keys) { for (const damage_k of damage_keys) {
total_damage += damages[i][0] + damages[i][1]; damages = item.get(damage_k);
item.set(damage_keys[i], damages[i][0]+"-"+damages[i][1]); total_damage += damages[0] + damages[1];
} }
total_damage = total_damage / 2; return total_damage * attack_speed_mult / 2;
return total_damage * attack_speed_mult; }
} else { else {
let base_low = [item.get("nDamBaseLow"),item.get("eDamBaseLow"),item.get("tDamBaseLow"),item.get("wDamBaseLow"),item.get("fDamBaseLow"),item.get("aDamBaseLow")];
let results_low = apply_weapon_powder(item, base_low);
let damage_low = results_low[2];
let base_high = [item.get("nDamBaseHigh"),item.get("eDamBaseHigh"),item.get("tDamBaseHigh"),item.get("wDamBaseHigh"),item.get("fDamBaseHigh"),item.get("aDamBaseHigh")];
let results_high = apply_weapon_powder(item, base_high);
let damage_high = results_high[2];
let total_damage_min = 0; let total_damage_min = 0;
let total_damage_max = 0; let total_damage_max = 0;
for (const i in damage_keys) { for (const damage_k of damage_keys) {
total_damage_min += damage_low[i][0] + damage_low[i][1]; damages = item.get(damage_k);
total_damage_max += damage_high[i][0] + damage_high[i][1]; total_damage_min += damages[0][0] + damages[0][1];
item.set(damage_keys[i], damage_low[i][0]+"-"+damage_low[i][1]+"\u279c"+damage_high[i][0]+"-"+damage_high[i][1]); total_damage_max += damages[1][0] + damages[1][1];
} }
total_damage_min = attack_speed_mult * total_damage_min / 2; total_damage_min = attack_speed_mult * total_damage_min / 2;
total_damage_max = attack_speed_mult * total_damage_max / 2; total_damage_max = attack_speed_mult * total_damage_max / 2;
@ -36,11 +27,38 @@ function get_base_dps(item) {
} }
} }
// THIS MUTATES THE ITEM
function apply_weapon_powders(item) {
let present;
if (item.get("tier") !== "Crafted") {
let weapon_result = calc_weapon_powder(item);
let damages = weapon_result[0];
present = weapon_result[1];
for (const i in damage_keys) {
item.set(damage_keys[i], damages[i]);
}
} else {
let base_low = [item.get("nDamBaseLow"),item.get("eDamBaseLow"),item.get("tDamBaseLow"),item.get("wDamBaseLow"),item.get("fDamBaseLow"),item.get("aDamBaseLow")];
let results_low = calc_weapon_powder(item, base_low);
let damage_low = results_low[0];
let base_high = [item.get("nDamBaseHigh"),item.get("eDamBaseHigh"),item.get("tDamBaseHigh"),item.get("wDamBaseHigh"),item.get("fDamBaseHigh"),item.get("aDamBaseHigh")];
let results_high = calc_weapon_powder(item, base_high);
let damage_high = results_high[0];
present = results_high[1];
for (const i in damage_keys) {
item.set(damage_keys[i], [damage_low[i], damage_high[i]]);
}
}
console.log(item);
item.set(damage_present_key, present);
}
/** /**
* weapon: Weapon to apply powder to * weapon: Weapon to apply powder to
* damageBases: used by crafted * damageBases: used by crafted
*/ */
function apply_weapon_powder(weapon, damageBases) { function calc_weapon_powder(weapon, damageBases) {
let powders = weapon.get("powders").slice(); let powders = weapon.get("powders").slice();
// Array of neutral + ewtfa damages. Each entry is a pair (min, max). // Array of neutral + ewtfa damages. Each entry is a pair (min, max).
@ -86,10 +104,15 @@ function apply_weapon_powder(weapon, damageBases) {
if (neutralRemainingRaw[1] > 0) { if (neutralRemainingRaw[1] > 0) {
let min_diff = Math.min(neutralRemainingRaw[0], conversionRatio * neutralBase[0]); let min_diff = Math.min(neutralRemainingRaw[0], conversionRatio * neutralBase[0]);
let max_diff = Math.min(neutralRemainingRaw[1], conversionRatio * neutralBase[1]); let max_diff = Math.min(neutralRemainingRaw[1], conversionRatio * neutralBase[1]);
damages[element+1][0] = Math.floor(round_near(damages[element+1][0] + min_diff));
damages[element+1][1] = Math.floor(round_near(damages[element+1][1] + max_diff)); //damages[element+1][0] = Math.floor(round_near(damages[element+1][0] + min_diff));
neutralRemainingRaw[0] = Math.floor(round_near(neutralRemainingRaw[0] - min_diff)); //damages[element+1][1] = Math.floor(round_near(damages[element+1][1] + max_diff));
neutralRemainingRaw[1] = Math.floor(round_near(neutralRemainingRaw[1] - max_diff)); //neutralRemainingRaw[0] = Math.floor(round_near(neutralRemainingRaw[0] - min_diff));
//neutralRemainingRaw[1] = Math.floor(round_near(neutralRemainingRaw[1] - max_diff));
damages[element+1][0] += min_diff;
damages[element+1][1] += max_diff;
neutralRemainingRaw[0] -= min_diff;
neutralRemainingRaw[1] -= max_diff;
} }
damages[element+1][0] += powder.min; damages[element+1][0] += powder.min;
damages[element+1][1] += powder.max; damages[element+1][1] += powder.max;
@ -111,9 +134,14 @@ function calculateSpellDamage(stats, weapon, conversions, use_spell_damage, igno
// Array of neutral + ewtfa damages. Each entry is a pair (min, max). // Array of neutral + ewtfa damages. Each entry is a pair (min, max).
// 1. Get weapon damage (with powders). // 1. Get weapon damage (with powders).
let weapon_result = apply_weapon_powder(weapon); let weapon_damages;
let weapon_damages = weapon_result[0]; if (weapon.get('tier') === 'Crafted') {
let present = weapon_result[1]; weapon_damages = damage_keys.map(x => weapon.get(x)[1]);
}
else {
weapon_damages = damage_keys.map(x => weapon.get(x));
}
let present = weapon.get(damage_present_key);
// 2. Conversions. // 2. Conversions.
// 2.1. First, apply neutral conversion (scale weapon damage). Keep track of total weapon damage here. // 2.1. First, apply neutral conversion (scale weapon damage). Keep track of total weapon damage here.

View file

@ -173,6 +173,7 @@ function displayExpandedItem(item, parent_id){
// #commands create a new element. // #commands create a new element.
// !elemental is some janky hack for elemental damage. // !elemental is some janky hack for elemental damage.
// normals just display a thing. // normals just display a thing.
item = new Map(item); // shallow copy
if (item.get("category") === "weapon") { if (item.get("category") === "weapon") {
item.set('basedps', get_base_dps(item)); item.set('basedps', get_base_dps(item));
} else if (item.get("category") === "armor") { } else if (item.get("category") === "armor") {
@ -341,7 +342,21 @@ function displayExpandedItem(item, parent_id){
bckgrd.appendChild(img); bckgrd.appendChild(img);
} }
} else { } else {
if (id.endsWith('Dam_')) {
// TODO: kinda jank but replacing lists with txt at this step
let damages = item.get(id);
if (item.get("tier") !== "Crafted") {
damages = damages.map(x => Math.round(x));
item.set(id, damages[0]+"-"+damages[1]);
}
else {
damages = damages.map(x => x.map(y => Math.round(y)));
item.set(id, damages[0][0]+"-"+damages[0][1]+"\u279c"+damages[1][0]+"-"+damages[1][1]);
}
}
let p_elem; let p_elem;
// TODO: wtf is this if statement
if ( !(item.get("tier") === "Crafted" && item.get("category") === "armor" && id === "hp") && (!skp_order.includes(id)) || (skp_order.includes(id) && item.get("tier") !== "Crafted" && parent_div.nodeName === "table") ) { //skp warp if ( !(item.get("tier") === "Crafted" && item.get("category") === "armor" && id === "hp") && (!skp_order.includes(id)) || (skp_order.includes(id) && item.get("tier") !== "Crafted" && parent_div.nodeName === "table") ) { //skp warp
p_elem = displayFixedID(parent_div, id, item.get(id), elemental_format); p_elem = displayFixedID(parent_div, id, item.get(id), elemental_format);
} else if (item.get("tier") === "Crafted" && item.get("category") === "armor" && id === "hp") { } else if (item.get("tier") === "Crafted" && item.get("category") === "armor" && id === "hp") {