Merge pull request #217 from hppeng-wynn/misc_bugfix

Fix a bunch of bugs from discord bug reports channel
This commit is contained in:
hppeng-wynn 2022-09-05 21:54:39 -07:00 committed by GitHub
commit 228b066711
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 113 additions and 96 deletions

View file

@ -73,7 +73,7 @@ const atrees = {
{
"type": "replace_spell",
"name": "Escape",
"cost": 25,
"cost": 20,
"base_spell": 2,
"display": "",
"parts": []
@ -408,12 +408,19 @@ const atrees = {
{
"name": "Single Bow",
"type": "total",
"hits": { "Single Shot": "Arrow Shield.shots" }
"hits": { "Single Shot": "Arrow Shield.shots" },
"display": false
},
{
"name": "Single Volley",
"type": "total",
"hits": { "Single Shot": "Arrow Shield.charges" },
"display": false
},
{
"name": "DPS",
"type": "total",
"hits": { "Single Shot": "Arrow Shield.charges" }
"hits": { "Single Volley": 2 }
},
{
"name": "Total Damage",
@ -688,12 +695,12 @@ const atrees = {
{
"type": "add_spell_prop",
"base_spell": 2,
"target_part": "Stomp Damage",
"target_part": "Total Damage",
"cost": 0,
"hits": {
"Fierce Stomp": 1
},
"display": "Stomp Damage"
"display": "Total Damage"
}
]
},
@ -843,11 +850,11 @@ const atrees = {
{
"type": "add_spell_prop",
"base_spell": 2,
"target_part": "Per Arrow",
"target_part": "Escape Artist Arrow",
"multipliers": [
20,
70,
0,
10,
30,
0,
0,
0
@ -856,11 +863,11 @@ const atrees = {
{
"type": "add_spell_prop",
"base_spell": 2,
"target_part": "Max Damage (Escape Artist)",
"target_part": "Total Damage",
"hits": {
"Per Arrow": 120
"Escape Artist Arrow": 1
},
"display": "Max Damage (Escape Artist)"
"display": "Total Damage"
}
]
},
@ -929,7 +936,7 @@ const atrees = {
{
"name": "DPS",
"hits": {
"Single Hit": 4
"Single Hit": 3.3333333333333
}
}
]
@ -1003,7 +1010,7 @@ const atrees = {
{
"type": "add_spell_prop",
"base_spell": 2,
"target_part": "Stomp Damage",
"target_part": "Total Damage",
"hits": {
"Geyser Stomp": 1
}
@ -2074,7 +2081,7 @@ const atrees = {
},
{
"display_name": "Elusive",
"desc": "If you do not get hit for 8+ seconds, become immune to self-damage and remove Arrow Storm's recoil. (Dodging counts as not getting hit)",
"desc": "If you do not get hit for 5+ seconds, become immune to self-damage and remove Arrow Storm's recoil. (Dodging counts as not getting hit)",
"archetype": "Boltslinger",
"archetype_req": 0,
"parents": [
@ -2531,23 +2538,15 @@ const atrees = {
{
"type": "add_spell_prop",
"base_spell": 4,
"target_part": "Arrow Rain (Per Arrow)",
"target_part": "Arrow Rain",
"multipliers": [
80,
100,
0,
0,
0,
0,
60
50
]
},
{
"type": "add_spell_prop",
"base_spell": 4,
"target_part": "Arrow Rain (Total)",
"hits": {
"Arrow Rain (Per Arrow)": 150
}
}
]
},
@ -4067,7 +4066,7 @@ const atrees = {
"icon": "node_1"
},
"properties": {
"range": 2
"range": 1
},
"effects": [
{
@ -4751,7 +4750,7 @@ const atrees = {
"parts": [
{
"name": "Heal",
"power": 0.1
"power": 0.15
}
]
}
@ -5228,7 +5227,7 @@ const atrees = {
},
{
"display_name": "Thunderstorm",
"desc": "After casting Meteor, summon 3 lightning strikes and deal additional damage",
"desc": "After casting Meteor, summon 4 lightning strikes and deal additional damage",
"base_abil": "Meteor",
"parents": [
"Wind Slash",
@ -5253,9 +5252,9 @@ const atrees = {
"target_part": "Lightning Damage",
"base_spell": 3,
"multipliers": [
30,
25,
0,
15,
10,
0,
0,
0
@ -5266,7 +5265,7 @@ const atrees = {
"target_part": "Total Damage",
"base_spell": 3,
"hits": {
"Lightning Damage": 3
"Lightning Damage": 4
}
}
]
@ -5564,7 +5563,7 @@ const atrees = {
{
"display_name": "Purification",
"desc": "Heal and Arcane Transfer will purify you of all negative effects and fire. (3s Cooldown)",
"base_abil": 1,
"base_abil": "Heal",
"parents": [
"Ophanim",
"Cheaper Heal",
@ -5662,7 +5661,7 @@ const atrees = {
"name": "nConvBase:3.Lightning Damage"
}
],
"scaling": [15]
"scaling": [10]
},
{
"type": "stat_scaling",
@ -5682,7 +5681,7 @@ const atrees = {
"name": "eConvBase:3.Lightning Damage"
}
],
"scaling": [10]
"scaling": [8]
}
]
},
@ -6029,7 +6028,8 @@ const atrees = {
"archetype": "Riftwalker",
"archetype_req": 5,
"parents": [
"Cheaper Ice Snake"
"Cheaper Ice Snake",
"Fluid Healing"
],
"dependencies": [
"Ice Snake",
@ -6149,7 +6149,7 @@ const atrees = {
"type": "add_spell_prop",
"base_spell": 1,
"target_part": "Second and Third Pulses",
"power": 0.15
"power": 0.20
},
{
"type": "add_spell_prop",
@ -6204,7 +6204,9 @@ const atrees = {
"col": 4,
"icon": "node_3"
},
"properties": {},
"properties": {
"range": 7
},
"effects": [
{
"type": "replace_spell",
@ -6216,11 +6218,11 @@ const atrees = {
"name": "Single Orb",
"type": "damage",
"multipliers": [
40,
70,
0,
0,
0,
20,
30,
0
]
},
@ -6735,7 +6737,8 @@ const atrees = {
"archetype": "Light Bender",
"archetype_req": 0,
"parents": [
"Better Ophanim"
"Better Ophanim",
"Dynamic Faith"
],
"dependencies": [
"Healthier Ophanim I"
@ -6752,7 +6755,7 @@ const atrees = {
},
{
"display_name": "Sunflare",
"desc": "After healing 400% of your max health within 10s, your next Heal will make every nearby ally temporarily immune.",
"desc": "After healing 300% of your max health within 10s, your next Heal will make every nearby ally temporarily immune. Cooldown: 20s",
"archetype": "Light Bender",
"archetype_req": 12,
"base_abil": "Heal",
@ -10726,7 +10729,7 @@ const atrees = {
"parts": [
{
"name": "Effigy Hit",
"multipliers": [ 50, 0, 0, 50, 0, 0 ]
"multipliers": [ 40, 0, 0, 40, 0, 0 ]
},
{
"name": "Single Effigy DPS",
@ -10913,7 +10916,7 @@ const atrees = {
},
{
"display_name": "Blood Rite",
"desc": "When yourself or an ally gets hit while standing in your Totem's range, add 25% of the damage taken into your Blood Pool. (Max 10%)",
"desc": "When yourself or an ally gets hit while standing in your Totem's range, add 35% of the damage taken into your Blood Pool. (Max 10%)",
"archetype": "Acolyte",
"archetype_req": 9,
"parents": ["Fluid Healing", "More Blood Pool II"],
@ -10946,7 +10949,14 @@ const atrees = {
"properties": {
"max_effigy": 1
},
"effects": []
"effects": [
{
"type": "add_spell_prop",
"base_spell": 7,
"name": "Effigy Hit",
"multipliers": [ -10, 0, 0, -10, 0, 0 ]
}
]
},
{
"display_name": "Chant of the Fanatic",
@ -11060,7 +11070,7 @@ const atrees = {
},
{
"display_name": "Mengdu",
"desc": "For every 1% Thorns you have from item IDs, gain +1% Water Damage. (Max 100%)",
"desc": "For every 1% Thorns you have from item IDs, gain +1% Water Damage. (Max 40%)",
"parents": ["Chant of the Fanatic", "Invigorating Wave"],
"dependencies": [],
"blockers": [],
@ -11086,7 +11096,7 @@ const atrees = {
"name": "wDamPct"
},
"scaling": [ 1 ],
"max": 100
"max": 40
}
]
},

File diff suppressed because one or more lines are too long

View file

@ -29,8 +29,7 @@ let boosts_node = new (class extends ComputeNode {
let elem = document.getElementById(key + "-boost")
if (elem.classList.contains("toggleOn")) {
damage_boost += value;
if (key === "warscream") { def_boost += .10 }
if (key === "vanish") { def_boost += .15 }
if (key === "warscream") { def_boost += .20 }
}
}
let res = new Map();
@ -629,48 +628,51 @@ class SpellDamageCalcNode extends ComputeNode {
else {
continue;
}
spell_result.name = part.name;
const {name, display = true} = part;
spell_result.name = name;
spell_result.display = display;
spell_results.push(spell_result);
spell_result_map.set(part.name, spell_result);
spell_result_map.set(name, spell_result);
}
for (const part of spell_parts) {
if ('hits' in part) {
let spell_result = {
normal_min: [0, 0, 0, 0, 0, 0],
normal_max: [0, 0, 0, 0, 0, 0],
normal_total: [0, 0],
crit_min: [0, 0, 0, 0, 0, 0],
crit_max: [0, 0, 0, 0, 0, 0],
crit_total: [0, 0],
heal_amount: 0
}
const dam_res_keys = ['normal_min', 'normal_max', 'normal_total', 'crit_min', 'crit_max', 'crit_total'];
for (const [subpart_name, hits] of Object.entries(part.hits)) {
const subpart = spell_result_map.get(subpart_name);
if (!subpart) { continue; }
if (spell_result.type) {
if (subpart.type !== spell_result.type) {
throw "SpellCalc total subpart type mismatch";
}
}
else {
spell_result.type = subpart.type;
}
if (spell_result.type === 'damage') {
for (const key of dam_res_keys) {
for (let i in spell_result.normal_min) {
spell_result[key][i] += subpart[key][i] * hits;
}
}
}
else {
spell_result.heal_amount += subpart.heal_amount * hits;
}
}
spell_result.name = part.name;
spell_results.push(spell_result);
spell_result_map.set(part.name, spell_result);
if (!('hits' in part)) { continue; }
let spell_result = {
normal_min: [0, 0, 0, 0, 0, 0],
normal_max: [0, 0, 0, 0, 0, 0],
normal_total: [0, 0],
crit_min: [0, 0, 0, 0, 0, 0],
crit_max: [0, 0, 0, 0, 0, 0],
crit_total: [0, 0],
heal_amount: 0
}
const dam_res_keys = ['normal_min', 'normal_max', 'normal_total', 'crit_min', 'crit_max', 'crit_total'];
for (const [subpart_name, hits] of Object.entries(part.hits)) {
const subpart = spell_result_map.get(subpart_name);
if (!subpart) { continue; }
if (spell_result.type) {
if (subpart.type !== spell_result.type) {
throw "SpellCalc total subpart type mismatch";
}
}
else {
spell_result.type = subpart.type;
}
if (spell_result.type === 'damage') {
for (const key of dam_res_keys) {
for (let i in spell_result.normal_min) {
spell_result[key][i] += subpart[key][i] * hits;
}
}
}
else {
spell_result.heal_amount += subpart.heal_amount * hits;
}
}
const {name, display = true} = part;
spell_result.name = name;
spell_result.display = display;
spell_results.push(spell_result);
spell_result_map.set(name, spell_result);
}
return spell_results;
}

View file

@ -249,11 +249,13 @@ spell_damage: {
name: str != "total" Name of the part.
type: "damage" [TODO: DEPRECATED/REMOVE] flag signaling what type of part it is. Can infer from fields
multipliers: array[num, 6] floating point spellmults (though supposedly wynn only supports integer mults)
display: bool To show part or not (for some spells there are too many intermediate calc parts). Default: True
}
spell_heal: {
name: str != "total" Name of the part.
type: "heal" [TODO: DEPRECATED/REMOVE] flag signaling what type of part it is. Can infer from fields
power: num floating point healing power (1 is 100% of max hp).
display: bool To show part or not (for some spells there are too many intermediate calc parts). Default: True
}
spell_total: {
name: str != "total" Name of the part.
@ -261,6 +263,7 @@ spell_total: {
hits: Map[str, Union[str, num]] Keys are other part names, numbers are the multipliers. Undefined behavior if subparts
are not the same type of spell. Can only pull from spells defined before it.
Alternatively, a property reference of the format <ability_id>.propname
display: bool To show part or not (for some spells there are too many intermediate calc parts). Default: True
}

View file

@ -114,7 +114,7 @@ function displayBuildStats(parent_id,build,command_group,stats){
id_val = Math.ceil(id_val*stats.get("poisonPct")/100);
}
displayFixedID(parent_div, id, id_val, elemental_format, style);
if (id === "poison" && id_val > 0) {
/*if (id === "poison" && id_val > 0) {
let row = make_elem('div', ['row']);
let value_elem = make_elem('div', ['col', 'text-end']);
@ -127,7 +127,7 @@ function displayBuildStats(parent_id,build,command_group,stats){
row.appendChild(value_elem);
parent_div.appendChild(row);
}
else if (id === "ls" && id_val != 0) {
else */if (id === "ls" && id_val != 0) {
let row = make_elem('div', ['row']);
let value_elem = make_elem('div', ['col', 'text-end']);
@ -1014,7 +1014,8 @@ function displayPoisonDamage(overallparent_elem, statMap) {
title_elemavg.append(make_elem('span', [], { textContent: "Poison Stats" }));
spell_summary.append(title_elemavg);
let poison_tick = Math.ceil(statMap.get("poison") * (1+skillPointsToPercentage(statMap.get('str'))) * (statMap.get("poisonPct"))/100 /3);
let poison_tick = Math.floor(statMap.get("poison")/3);
//let poison_tick = Math.ceil(statMap.get("poison") * (1+skillPointsToPercentage(statMap.get('str'))) * (statMap.get("poisonPct"))/100 /3);
let overallpoisonDamage = make_elem("p");
overallpoisonDamage.append(
@ -1456,6 +1457,7 @@ function displaySpellDamage(parent_elem, _overallparent_elem, stats, spell, spel
for (let i = 0; i < spell_results.length; ++i) {
const spell_info = spell_results[i];
if (!spell_info.display) { continue; }
let part_div = make_elem("p", ["pt-3"]);
parent_elem.append(part_div);

View file

@ -157,7 +157,7 @@ let idSuffixes = {"displayName": "",
"spRaw3":"",
"spPct4":"%",
"spRaw4":"",
"rainbowRaw":"",
"rSdRaw":"",
"sprint":"%",
"sprintReg":"%",
"jh":"",
@ -255,7 +255,7 @@ let build_detailed_display_commands = [
"ref", "thorns",
"expd",
"spd",
"rainbowRaw",
"rSdRaw",
"sprint", "sprintReg",
"jh",
"xpb", "lb", "lq",

View file

@ -1,4 +1,4 @@
const TOME_DB_VERSION = 4;
const TOME_DB_VERSION = 5;
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.jsA
let tdb;

View file

@ -56,8 +56,8 @@
"restrict": "Soulbound Item",
"lvl": 100,
"defMobs": 5,
"thorns": 6,
"reflection": 6,
"exploding": 6,
"mdPct": 6,
"fixID": false,
"id": 3,
"alias": "Melee II"