2.0.2 (#252)
* 2.0.2 mage tree Super super janky implementation of winded * Clean up breathless definition * Numerical values and archetype req update for non mage ability trees Notably excludes: Effigy attack speed Double/Triple totem multipliers more shields damage change arrow hurricane nerf don't think this includes dependencies but idk if any changed? Topology fixing still needed * Archer, Warrior and Shaman updated (mostly) * Assassin tree changes * Item db update guess this is the 2.0.2 branch now * Mage edit to match ingame * Fix misc. atree stuff that wasn't fixed yet warrior connections and positions double/triple totem implementation ragna nerf --------- Co-authored-by: hppeng <hppeng> Co-authored-by: TopHat of Pride <33451677+TopHat-of-Pride@users.noreply.github.com> Co-authored-by: aspiepuppy <emimeado@gmail.com>
This commit is contained in:
parent
2bdebda89f
commit
dc878caf1c
61077
clean.json
61077
clean.json
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
1
data/2.0.2.1/atree.json
Normal file
1
data/2.0.2.1/atree.json
Normal file
File diff suppressed because one or more lines are too long
1
data/2.0.2.1/ingreds.json
Normal file
1
data/2.0.2.1/ingreds.json
Normal file
File diff suppressed because one or more lines are too long
1
data/2.0.2.1/items.json
Normal file
1
data/2.0.2.1/items.json
Normal file
File diff suppressed because one or more lines are too long
1069
data/2.0.2.1/tomes.json
Normal file
1069
data/2.0.2.1/tomes.json
Normal file
File diff suppressed because it is too large
Load diff
6318
ingreds_clean.json
6318
ingreds_clean.json
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -302,7 +302,7 @@ function expandRecipe(recipe) {
|
||||||
function idRound(id){
|
function idRound(id){
|
||||||
rounded = Math.round(id);
|
rounded = Math.round(id);
|
||||||
if(rounded == 0){
|
if(rounded == 0){
|
||||||
return 1; //this is a hack, will need changing along w/ rest of ID system if anything changes
|
return Math.sign(id); //this is a hack, will need changing along w/ rest of ID system if anything changes
|
||||||
}else{
|
}else{
|
||||||
return rounded;
|
return rounded;
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,10 +87,10 @@ stat_scaling: {
|
||||||
"slider_name": Optional[str],
|
"slider_name": Optional[str],
|
||||||
"slider_step": Optional[float],
|
"slider_step": Optional[float],
|
||||||
round: Optional[bool] // Control floor behavior. True for stats and false for slider by default
|
round: Optional[bool] // Control floor behavior. True for stats and false for slider by default
|
||||||
slider_behavior: Optional[str] // One of: "merge", "modify". default: merge
|
behavior: Optional[str] // One of: "merge", "modify". default: merge
|
||||||
// merge: add if exist, make new part if not exist
|
// merge: add if exist, make new part if not exist
|
||||||
// modify: change existing part, by incrementing properties. do nothing if not exist
|
// modify: change existing part, by incrementing properties. do nothing if not exist
|
||||||
slider_max: Optional[float] // affected by slider_behavior
|
slider_max: Optional[float] // affected by behavior
|
||||||
inputs: Optional[list[scaling_target]] // List of things to scale. Omit this if using slider
|
inputs: Optional[list[scaling_target]] // List of things to scale. Omit this if using slider
|
||||||
|
|
||||||
output: Optional[scaling_target | List[scaling_target]] // One of the following:
|
output: Optional[scaling_target | List[scaling_target]] // One of the following:
|
||||||
|
@ -511,18 +511,35 @@ const atree_make_interactives = new (class extends ComputeNode {
|
||||||
const slider_map = new Map();
|
const slider_map = new Map();
|
||||||
const button_map = new Map();
|
const button_map = new Map();
|
||||||
|
|
||||||
// first, pull out all the sliders and toggles.
|
let to_process = [];
|
||||||
for (const [abil_id, ability] of merged_abils.entries()) {
|
for (const [abil_id, ability] of merged_abils) {
|
||||||
for (const effect of ability.effects) {
|
for (const effect of ability.effects) {
|
||||||
if (effect['type'] === "stat_scaling" && effect['slider'] === true) {
|
if (effect['type'] === "stat_scaling" && effect['slider'] === true) {
|
||||||
const { slider_name, slider_behavior = 'merge', slider_max, slider_step } = effect;
|
to_process.push([effect, abil_id, ability]);
|
||||||
|
}
|
||||||
|
if (effect['type'] === "raw_stat" && effect['toggle']) {
|
||||||
|
to_process.push([effect, abil_id, ability]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let unprocessed = [];
|
||||||
|
// first, pull out all the sliders and toggles.
|
||||||
|
let k = to_process.length;
|
||||||
|
for (let i = 0; i < k; ++i) {
|
||||||
|
for (const [effect, abil_id, ability] of to_process) {
|
||||||
|
if (effect['type'] === "stat_scaling" && effect['slider'] === true) {
|
||||||
|
const { slider_name, behavior = 'merge', slider_max, slider_step } = effect;
|
||||||
if (slider_map.has(slider_name)) {
|
if (slider_map.has(slider_name)) {
|
||||||
if (slider_max !== undefined) {
|
if (slider_max !== undefined) {
|
||||||
const slider_info = slider_map.get(slider_name);
|
const slider_info = slider_map.get(slider_name);
|
||||||
slider_info.max += slider_max;
|
slider_info.max += slider_max;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
unprocessed.push([effect, abil_id, ability]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (slider_behavior === 'merge') {
|
else if (behavior === 'merge') {
|
||||||
|
console.log(effect);
|
||||||
slider_map.set(slider_name, {
|
slider_map.set(slider_name, {
|
||||||
label_name: slider_name+' ('+ability.display_name+')',
|
label_name: slider_name+' ('+ability.display_name+')',
|
||||||
max: slider_max,
|
max: slider_max,
|
||||||
|
@ -532,6 +549,9 @@ const atree_make_interactives = new (class extends ComputeNode {
|
||||||
abil: ability
|
abil: ability
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
unprocessed.push([effect, abil_id, ability]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (effect['type'] === "raw_stat" && effect['toggle']) {
|
if (effect['type'] === "raw_stat" && effect['toggle']) {
|
||||||
const { toggle: toggle_name } = effect;
|
const { toggle: toggle_name } = effect;
|
||||||
|
@ -540,6 +560,9 @@ const atree_make_interactives = new (class extends ComputeNode {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (unprocessed.length == to_process.length) { break; }
|
||||||
|
to_process = unprocessed;
|
||||||
|
unprocessed = [];
|
||||||
}
|
}
|
||||||
// next, render the sliders and toggles onto the abilities.
|
// next, render the sliders and toggles onto the abilities.
|
||||||
for (const [slider_name, slider_info] of slider_map.entries()) {
|
for (const [slider_name, slider_info] of slider_map.entries()) {
|
||||||
|
@ -623,9 +646,13 @@ const atree_scaling = new (class extends ComputeNode {
|
||||||
continue;
|
continue;
|
||||||
case 'stat_scaling':
|
case 'stat_scaling':
|
||||||
let total = 0;
|
let total = 0;
|
||||||
const {slider = false, scaling = [0]} = effect;
|
const {slider = false, scaling = [0], behavior="merge"} = effect;
|
||||||
let { positive = true, round = true } = effect;
|
let { positive = true, round = true } = effect;
|
||||||
if (slider) {
|
if (slider) {
|
||||||
|
if (behavior == "modify" && !slider_map.has(effect.slider_name)) {
|
||||||
|
// Dangerous control flow.. early continue
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const slider_val = slider_map.get(effect.slider_name).slider.value;
|
const slider_val = slider_map.get(effect.slider_name).slider.value;
|
||||||
total = parseInt(slider_val) * scaling[0];
|
total = parseInt(slider_val) * scaling[0];
|
||||||
round = false;
|
round = false;
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -29,7 +29,8 @@ function parsePowdering(powder_info) {
|
||||||
let atree_data = null;
|
let atree_data = null;
|
||||||
const wynn_version_names = [
|
const wynn_version_names = [
|
||||||
'2.0.1.1',
|
'2.0.1.1',
|
||||||
'2.0.1.2'
|
'2.0.1.2',
|
||||||
|
'2.0.2.1'
|
||||||
];
|
];
|
||||||
const WYNN_VERSION_LATEST = wynn_version_names.length - 1;
|
const WYNN_VERSION_LATEST = wynn_version_names.length - 1;
|
||||||
// Default to the newest version.
|
// Default to the newest version.
|
||||||
|
|
|
@ -17,7 +17,7 @@ let armor_powder_node = new (class extends ComputeNode {
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
const damageMultipliers = new Map([ ["totem", 0.2], ["warscream", 0.0], ["ragnarokkr", 0.30], ["fortitude", 0.60], ["radiance", 0.0] ]);
|
const damageMultipliers = new Map([ ["totem", 0.2], ["warscream", 0.0], ["ragnarokkr", 0.20], ["fortitude", 0.60], ["radiance", 0.0] ]);
|
||||||
|
|
||||||
let boosts_node = new (class extends ComputeNode {
|
let boosts_node = new (class extends ComputeNode {
|
||||||
constructor() { super('builder-boost-input'); }
|
constructor() { super('builder-boost-input'); }
|
||||||
|
|
|
@ -67,6 +67,9 @@ function calculateSpellDamage(stats, weapon, _conversions, use_spell_damage, ign
|
||||||
// 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.
|
||||||
let damages = [];
|
let damages = [];
|
||||||
const neutral_convert = conversions[0] / 100;
|
const neutral_convert = conversions[0] / 100;
|
||||||
|
if (neutral_convert == 0) {
|
||||||
|
present = [false, false, false, false, false, false]
|
||||||
|
}
|
||||||
let weapon_min = 0;
|
let weapon_min = 0;
|
||||||
let weapon_max = 0;
|
let weapon_max = 0;
|
||||||
for (const damage of weapon_damages) {
|
for (const damage of weapon_damages) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const DB_VERSION = 121;
|
const DB_VERSION = 122;
|
||||||
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.jsA
|
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.jsA
|
||||||
|
|
||||||
let db;
|
let db;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const ING_DB_VERSION = 19;
|
const ING_DB_VERSION = 20;
|
||||||
|
|
||||||
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.js
|
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.js
|
||||||
|
|
||||||
|
|
|
@ -15,4 +15,4 @@ if __name__ == "__main__":
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
infile, outfile = args.infile, args.outfile
|
infile, outfile = args.infile, args.outfile
|
||||||
json.dump(json.load(open(infile)), open(outfile, "w"))
|
json.dump(json.load(open(infile)), open(outfile, "w"), ensure_ascii=False, separators=(',', ':'))
|
||||||
|
|
|
@ -3794,5 +3794,9 @@
|
||||||
"Blue Wynnter Sweater": 3792,
|
"Blue Wynnter Sweater": 3792,
|
||||||
"Green Wynnter Sweater": 3793,
|
"Green Wynnter Sweater": 3793,
|
||||||
"Purple Wynnter Sweater": 3794,
|
"Purple Wynnter Sweater": 3794,
|
||||||
"Red Wynnter Sweater": 3795
|
"Red Wynnter Sweater": 3795,
|
||||||
|
"Athanasia": 3796,
|
||||||
|
"Provenance": 3797,
|
||||||
|
"Veneration": 3798,
|
||||||
|
"Reckoning": 3799
|
||||||
}
|
}
|
|
@ -221,4 +221,4 @@ with open("ing_map.json", "w") as ing_mapfile:
|
||||||
|
|
||||||
#save ings
|
#save ings
|
||||||
with open(outfile, "w") as out_file:
|
with open(outfile, "w") as out_file:
|
||||||
json.dump(ings, out_file)
|
json.dump(ings, out_file, ensure_ascii=False, separators=(',', ':'))
|
||||||
|
|
|
@ -96,5 +96,5 @@ with open("id_map.json","w") as id_mapfile:
|
||||||
|
|
||||||
#write the data back to the outfile
|
#write the data back to the outfile
|
||||||
with open(outfile, "w+") as out_file:
|
with open(outfile, "w+") as out_file:
|
||||||
json.dump(data, out_file)
|
json.dump(data, out_file, ensure_ascii=False, separators=(',', ':'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue