@@ -457,17 +457,17 @@
Active boosts
+
-
-
@@ -1300,7 +1302,7 @@
-
+
@@ -1319,7 +1321,6 @@
-
JANKY Export SVG
diff --git a/builder/index.html b/builder/index.html
index f769224..b48f29c 100644
--- a/builder/index.html
+++ b/builder/index.html
@@ -1,2 +1,2 @@
-
WynnBuilder WynnBuilder Join the
discord today to suggest new features, submit bug reports, and hangout/talk to devs!
Show Tomes
Edit Abilities
Edit IDs
Reset Edited IDs
Damage Stats
Spell Damage %:
Original Value: 0
Spell Damage Raw:
Original Value: 0
Melee Damage %:
Original Value: 0
Melee Damage Raw:
Original Value: 0
Poison:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
+ Tier:
Original Value: 0
Defense Stats
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Health Regen Raw:
Original Value: 0
Health Regen %:
Original Value: 0
Health Bonus:
Original Value: 0
Utility Stats
1st Spell Cost %:
Original Value: 0
2nd Spell Cost %:
Original Value: 0
3rd Spell Cost %:
Original Value: 0
4th Spell Cost %:
Original Value: 0
1st Spell Cost Raw:
Original Value: 0
2nd Spell Cost Raw:
Original Value: 0
3rd Spell Cost Raw:
Original Value: 0
4th Spell Cost Raw:
Original Value: 0
Input a weapon to see abilities!
+
WynnBuilder WynnBuilder Join the
discord today to suggest new features, submit bug reports, and hangout/talk to devs!
Show Tomes
Edit Abilities
Edit IDs
Reset Edited IDs
Damage Stats
Spell Damage %:
Original Value: 0
Spell Damage Raw:
Original Value: 0
Melee Damage %:
Original Value: 0
Melee Damage Raw:
Original Value: 0
Poison:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
Damage %:
Original Value: 0
+ Tier:
Original Value: 0
Defense Stats
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Defense %:
Original Value: 0
Health Regen Raw:
Original Value: 0
Health Regen %:
Original Value: 0
Health Bonus:
Original Value: 0
Utility Stats
1st Spell Cost %:
Original Value: 0
2nd Spell Cost %:
Original Value: 0
3rd Spell Cost %:
Original Value: 0
4th Spell Cost %:
Original Value: 0
1st Spell Cost Raw:
Original Value: 0
2nd Spell Cost Raw:
Original Value: 0
3rd Spell Cost Raw:
Original Value: 0
4th Spell Cost Raw:
Original Value: 0
Input a weapon to see abilities!
diff --git a/builder/index_full.html b/builder/index_full.html
index 916cb74..9690bd0 100644
--- a/builder/index_full.html
+++ b/builder/index_full.html
@@ -457,6 +457,9 @@
Active boosts
+
+ Radiance
+
War Scream
diff --git a/js/builder/atree.js b/js/builder/atree.js
index 051f5e2..645fb09 100644
--- a/js/builder/atree.js
+++ b/js/builder/atree.js
@@ -148,7 +148,6 @@ const default_abils = {
}, elem_mastery_abil ],
};
-
/**
* Update ability tree internal representation. (topologically sorted node list)
*
diff --git a/js/builder/build.js b/js/builder/build.js
index b39ce86..6ec7b42 100644
--- a/js/builder/build.js
+++ b/js/builder/build.js
@@ -129,9 +129,9 @@ class Build{
}
}
}
- statMap.set("poisonPct", 100);
- statMap.set("critDamPct", 100);
- statMap.set("healPct", 100);
+ statMap.set("poisonPct", 0);
+ statMap.set("critDamPct", 0);
+ statMap.set("healPct", 0);
// The stuff relevant for damage calculation!!! @ferricles
statMap.set("atkSpd", this.weapon.statMap.get("atkSpd"));
diff --git a/js/builder/builder_graph.js b/js/builder/builder_graph.js
index c8e590d..7003ba8 100644
--- a/js/builder/builder_graph.js
+++ b/js/builder/builder_graph.js
@@ -17,7 +17,7 @@ let armor_powder_node = new (class extends ComputeNode {
}
})();
-const damageMultipliers = new Map([ ["totem", .2], ["warscream", 0.0], ["ragnarokkr", 0.30], ["fortitude", 0.60] ]);
+const damageMultipliers = new Map([ ["totem", 0.2], ["warscream", 0.0], ["ragnarokkr", 0.30], ["fortitude", 0.60], ["radiance", 0.0] ]);
let boosts_node = new (class extends ComputeNode {
constructor() { super('builder-boost-input'); }
@@ -614,7 +614,7 @@ class SpellDamageCalcNode extends ComputeNode {
}
} else if ('power' in part) {
// TODO: wynn2 formula
- let _heal_amount = (part.power * getDefenseStats(stats)[0] * (stats.get('healPct')/100));
+ let _heal_amount = (part.power * getDefenseStats(stats)[0] * (1+stats.get('healPct')/100));
if (stats.has('healPct:'+part_id)) {
_heal_amount *= 1+(stats.get('healPct:'+part_id)/100);
}
@@ -847,6 +847,72 @@ class AggregateStatsNode extends ComputeNode {
}
}
+let radiance_affected = [ /*"hp"*/, "fDef", "wDef", "aDef", "tDef", "eDef", "hprPct", "mr", "sdPct", "mdPct", "ls", "ms", "xpb", "lb", "ref",
+/*"str", "dex", "int", "agi", "def",*/
+"thorns", "expd", "spd", "atkTier", "poison", "hpBonus", "spRegen", "eSteal", "hprRaw", "sdRaw", "mdRaw", "fDamPct", "wDamPct", "aDamPct", "tDamPct", "eDamPct", "fDefPct", "wDefPct", "aDefPct", "tDefPct", "eDefPct", "fixID", "category", "spPct1", "spRaw1", "spPct2", "spRaw2", "spPct3", "spRaw3", "spPct4", "spRaw4", "rSdRaw", "sprint", "sprintReg", "jh", "lq", "gXp", "gSpd",
+
+// wynn2 damages.
+"eMdPct","eMdRaw","eSdPct","eSdRaw",/*"eDamPct,"*/"eDamRaw",//"eDamAddMin","eDamAddMax",
+"tMdPct","tMdRaw","tSdPct","tSdRaw",/*"tDamPct,"*/"tDamRaw",//"tDamAddMin","tDamAddMax",
+"wMdPct","wMdRaw","wSdPct","wSdRaw",/*"wDamPct,"*/"wDamRaw",//"wDamAddMin","wDamAddMax",
+"fMdPct","fMdRaw","fSdPct","fSdRaw",/*"fDamPct,"*/"fDamRaw",//"fDamAddMin","fDamAddMax",
+"aMdPct","aMdRaw","aSdPct","aSdRaw",/*"aDamPct,"*/"aDamRaw",//"aDamAddMin","aDamAddMax",
+"nMdPct","nMdRaw","nSdPct","nSdRaw","nDamPct","nDamRaw",//"nDamAddMin","nDamAddMax", // neutral which is now an element
+/*"mdPct","mdRaw","sdPct","sdRaw",*/"damPct","damRaw",//"damAddMin","damAddMax", // These are the old ids. Become proportional.
+"rMdPct","rMdRaw","rSdPct",/*"rSdRaw",*/"rDamPct","rDamRaw",//"rDamAddMin","rDamAddMax", // rainbow (the "element" of all minus neutral). rSdRaw is rainraw
+"critDamPct",
+//"spPct1Final", "spPct2Final", "spPct3Final", "spPct4Final"
+];
+/**
+ * Scale stats if radiance is enabled.
+ */
+const radiance_node = new (class extends ComputeNode {
+ constructor() { super('radiance-node->:('); }
+
+ compute_func(input_map) {
+ const [statmap] = input_map.values(); // Extract values, pattern match it into size one list and bind to first element
+ let elem = document.getElementById('radiance-boost');
+ if (elem.classList.contains("toggleOn")) {
+ const ret = new Map(statmap);
+ for (const val of radiance_affected) {
+ if (reversedIDs.includes(val)) {
+ if ((ret.get(val) || 0) < 0) {
+ ret.set(val, Math.floor((ret.get(val) || 0) * 1.2));
+ }
+ }
+ else {
+ if ((ret.get(val) || 0) > 0) {
+ ret.set(val, Math.floor((ret.get(val) || 0) * 1.2));
+ }
+ }
+ }
+ const dam_mults = new Map(ret.get('damMult'));
+ dam_mults.set('tome', dam_mults.get('tome') * 1.2)
+ ret.set('damMult', dam_mults)
+ const def_mults = new Map(ret.get('defMult'));
+ def_mults.set('tome', def_mults.get('tome') * 1.2)
+ ret.set('defMult', def_mults)
+ return ret;
+ }
+ else {
+ return statmap;
+ }
+ }
+})();
+
+/* Updates all spell boosts
+*/
+function update_radiance() {
+ let elem = document.getElementById('radiance-boost');
+ if (elem.classList.contains("toggleOn")) {
+ elem.classList.remove("toggleOn");
+ } else {
+ elem.classList.add("toggleOn");
+ }
+ radiance_node.mark_dirty().update();
+}
+
+
/**
* Aggregate editable ID stats with build and weapon type.
*
@@ -1086,8 +1152,9 @@ function builder_graph_init() {
atree_node.link_to(class_node, 'player-class');
atree_merge.link_to(class_node, 'player-class');
pre_scale_agg_node.link_to(atree_raw_stats, 'atree-raw-stats');
- atree_scaling.link_to(pre_scale_agg_node, 'scale-stats');
- stat_agg_node.link_to(pre_scale_agg_node, 'pre-scaling');
+ radiance_node.link_to(pre_scale_agg_node, 'stats');
+ atree_scaling.link_to(radiance_node, 'scale-stats');
+ stat_agg_node.link_to(radiance_node, 'pre-scaling');
stat_agg_node.link_to(atree_scaling_stats, 'atree-scaling');
build_encode_node.link_to(atree_node, 'atree').link_to(atree_state_node, 'atree-state');
diff --git a/js/damage_calc.js b/js/damage_calc.js
index 147f2fa..a032a01 100644
--- a/js/damage_calc.js
+++ b/js/damage_calc.js
@@ -199,7 +199,7 @@ function calculateSpellDamage(stats, weapon, _conversions, use_spell_damage, ign
damage_mult *= (1 + v/100);
}
- const crit_mult = stats.get("critDamPct")/100;
+ const crit_mult = 1+(stats.get("critDamPct")/100);
for (const damage of damages) {
const res = [
diff --git a/js/display.js b/js/display.js
index 461f52a..2545ec8 100644
--- a/js/display.js
+++ b/js/display.js
@@ -110,24 +110,8 @@ function displayBuildStats(parent_id,build,command_group,stats){
if (reversedIDs.includes(id)) {
style === "positive" ? style = "negative" : style = "positive";
}
- if (id === "poison" && id_val > 0) {
- 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) {
- let row = make_elem('div', ['row']);
- let value_elem = make_elem('div', ['col', 'text-end']);
-
- let prefix_elem = make_elem('b', [], {textContent: "\u279C With Strength: "});
- let number_elem = make_elem('b', [style], {
- textContent: (id_val * (1+skillPointsToPercentage(stats.get('str'))) ).toFixed(0) + idSuffixes[id]
- });
- value_elem.append(prefix_elem);
- value_elem.append(number_elem);
- row.appendChild(value_elem);
- parent_div.appendChild(row);
- }
- else */if (id === "ls" && id_val != 0) {
+ if (id === "ls" && id_val != 0) {
let row = make_elem('div', ['row']);
let value_elem = make_elem('div', ['col', 'text-end']);