Merge branch 'atree' into atree-validation-fix

This commit is contained in:
hppeng 2022-07-08 19:13:37 -07:00
commit 5e43db7a49
11 changed files with 3377 additions and 1655 deletions

3028
clean.json

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -8,7 +8,7 @@ The game, of course
Additional Contributors, in no particular order: Additional Contributors, in no particular order:
- Kiocifer (Icons!) - Kiocifer (Icons!)
- IncinerateMe (helping transition to 1.20.3 / CI helper) - IncinerateMe (helping transition to 1.20.3 / CI helper)
- puppy (wynn2 ability tree help) - puppy (dog)
- SockMower (ability tree encode/decode optimization) - SockMower (ability tree encode/decode optimization)
- ITechnically (coding emotional support / misc) - ITechnically (coding emotional support / misc)
- touhoku (best IM) - touhoku (best IM)

View file

@ -166,6 +166,7 @@ const atree_node = new (class extends ComputeNode {
} }
node.parents = parents; node.parents = parents;
} }
console.log(atree_map);
let atree_topo_sort = []; let atree_topo_sort = [];
topological_sort_tree(atree_head, atree_topo_sort, new Map()); topological_sort_tree(atree_head, atree_topo_sort, new Map());
@ -492,22 +493,24 @@ const atree_collect_spells = new (class extends ComputeNode {
let ret_spells = new Map(); let ret_spells = new Map();
for (const [abil_id, abil] of atree_merged.entries()) { for (const [abil_id, abil] of atree_merged.entries()) {
// TODO: Possibly, make a better way for detecting "spell abilities"? // TODO: Possibly, make a better way for detecting "spell abilities"?
if (abil.effects.length == 0) { continue; }
let ret_spell = deepcopy(abil.effects[0]); // NOTE: do not mutate results of previous steps!
let has_spell_def = false;
for (const effect of abil.effects) { for (const effect of abil.effects) {
if (effect.type === 'replace_spell') { if (effect.type === 'replace_spell') {
has_spell_def = true;
// replace_spell just replaces all (defined) aspects. // replace_spell just replaces all (defined) aspects.
for (const key in effect) { const ret_spell = ret_spells.get(effect.base_spell);
ret_spell[key] = deepcopy(effect[key]); if (ret_spell) {
// NOTE: do not mutate results of previous steps!
for (const key in effect) {
ret_spell[key] = deepcopy(effect[key]);
}
}
else {
ret_spells.set(effect.base_spell, deepcopy(effect));
} }
} }
} }
if (!has_spell_def) { continue; } }
const base_spell_id = ret_spell.base_spell; for (const [abil_id, abil] of atree_merged.entries()) {
for (const effect of abil.effects) { for (const effect of abil.effects) {
switch (effect.type) { switch (effect.type) {
case 'replace_spell': case 'replace_spell':
@ -515,7 +518,7 @@ const atree_collect_spells = new (class extends ComputeNode {
continue; continue;
case 'add_spell_prop': { case 'add_spell_prop': {
const { base_spell, target_part = null, cost = 0, behavior = 'merge'} = effect; const { base_spell, target_part = null, cost = 0, behavior = 'merge'} = effect;
if (base_spell !== base_spell_id) { continue; } // TODO: redundant? if we assume abils only affect one spell const ret_spell = ret_spells.get(base_spell);
// TODO: unjankify this... if ('cost' in ret_spell) { ret_spell.cost += cost; } // TODO: unjankify this... if ('cost' in ret_spell) { ret_spell.cost += cost; }
if (target_part === null) { if (target_part === null) {
@ -537,7 +540,7 @@ const atree_collect_spells = new (class extends ComputeNode {
for (const [idx, v] of Object.entries(effect.hits)) { // looks kinda similar to multipliers case... hmm... can we unify all of these three? (make healpower a list) for (const [idx, v] of Object.entries(effect.hits)) { // looks kinda similar to multipliers case... hmm... can we unify all of these three? (make healpower a list)
if (idx in part.hits) { part.hits[idx] += v; } if (idx in part.hits) { part.hits[idx] += v; }
else { part.hits[idx] = v; } else { part.hits[idx] = v; }
} }
} }
else { else {
throw "uhh invalid spell add effect"; throw "uhh invalid spell add effect";
@ -558,7 +561,7 @@ const atree_collect_spells = new (class extends ComputeNode {
} }
case 'convert_spell_conv': case 'convert_spell_conv':
const { base_spell, target_part, conversion } = effect; const { base_spell, target_part, conversion } = effect;
if (base_spell !== base_spell_id) { continue; } // TODO: redundant? if we assume abils only affect one spell const ret_spell = ret_spells.get(base_spell);
const elem_idx = damageClasses.indexOf(conversion); const elem_idx = damageClasses.indexOf(conversion);
let filter = target_part === 'all'; let filter = target_part === 'all';
for (let part of ret_spell.parts) { // TODO: replace with Map? to avoid this linear search... idk prolly good since its not more verbose to type in json for (let part of ret_spell.parts) { // TODO: replace with Map? to avoid this linear search... idk prolly good since its not more verbose to type in json
@ -577,7 +580,6 @@ const atree_collect_spells = new (class extends ComputeNode {
continue; continue;
} }
} }
ret_spells.set(base_spell_id, ret_spell);
} }
return ret_spells; return ret_spells;
} }

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,146 +0,0 @@
{
"Archer": {
"Arrow Shield": 0,
"Escape": 1,
"Arrow Bomb": 2,
"Heart Shatter": 3,
"Fire Creep": 4,
"Bryophyte Roots": 5,
"Nimble String": 6,
"Arrow Storm": 7,
"Guardian Angels": 8,
"Windy Feet": 9,
"Basaltic Trap": 10,
"Windstorm": 11,
"Grappling Hook": 12,
"Implosion": 13,
"Twain's Arc": 14,
"Fierce Stomp": 15,
"Scorched Earth": 16,
"Leap": 17,
"Shocking Bomb": 18,
"Mana Trap": 19,
"Escape Artist": 20,
"Initiator": 21,
"Call of the Hound": 22,
"Arrow Hurricane": 23,
"Geyser Stomp": 24,
"Crepuscular Ray": 25,
"Grape Bomb": 26,
"Tangled Traps": 27,
"Snow Storm": 28,
"All-Seeing Panoptes": 29,
"Minefield": 30,
"Bow Proficiency I": 31,
"Cheaper Arrow Bomb": 32,
"Cheaper Arrow Storm": 33,
"Cheaper Escape": 34,
"Earth Mastery": 35,
"Thunder Mastery": 36,
"Water Mastery": 37,
"Air Mastery": 38,
"Fire Mastery": 39,
"More Shields": 40,
"Stormy Feet": 41,
"Refined Gunpowder": 42,
"More Traps": 43,
"Better Arrow Shield": 44,
"Better Leap": 45,
"Better Guardian Angels": 46,
"Cheaper Arrow Storm (2)": 47,
"Precise Shot": 48,
"Cheaper Arrow Shield": 49,
"Rocket Jump": 50,
"Cheaper Escape (2)": 51,
"Stronger Hook": 52,
"Cheaper Arrow Bomb (2)": 53,
"Bouncing Bomb": 54,
"Homing Shots": 55,
"Shrapnel Bomb": 56,
"Elusive": 57,
"Double Shots": 58,
"Triple Shots": 59,
"Power Shots": 60,
"Focus": 61,
"More Focus": 62,
"More Focus (2)": 63,
"Traveler": 64,
"Patient Hunter": 65,
"Stronger Patient Hunter": 66,
"Frenzy": 67,
"Phantom Ray": 68,
"Arrow Rain": 69,
"Decimator": 70
},
"Warrior": {
"Bash": 0,
"Spear Proficiency 1": 1,
"Cheaper Bash": 2,
"Double Bash": 3,
"Charge": 4,
"Heavy Impact": 5,
"Vehement": 6,
"Tougher Skin": 7,
"Uppercut": 8,
"Cheaper Charge": 9,
"War Scream": 10,
"Earth Mastery": 11,
"Thunder Mastery": 12,
"Water Mastery": 13,
"Air Mastery": 14,
"Fire Mastery": 15,
"Quadruple Bash": 16,
"Fireworks": 17,
"Half-Moon Swipe": 18,
"Flyby Jab": 19,
"Flaming Uppercut": 20,
"Iron Lungs": 21,
"Generalist": 22,
"Counter": 23,
"Mantle of the Bovemists": 24,
"Bak'al's Grasp": 25,
"Spear Proficiency 2": 26,
"Cheaper Uppercut": 27,
"Aerodynamics": 28,
"Provoke": 29,
"Precise Strikes": 30,
"Air Shout": 31,
"Enraged Blow": 32,
"Flying Kick": 33,
"Stronger Mantle": 34,
"Manachism": 35,
"Boiling Blood": 36,
"Ragnarokkr": 37,
"Ambidextrous": 38,
"Burning Heart": 39,
"Stronger Bash": 40,
"Intoxicating Blood": 41,
"Comet": 42,
"Collide": 43,
"Rejuvenating Skin": 44,
"Uncontainable Corruption": 45,
"Radiant Devotee": 46,
"Whirlwind Strike": 47,
"Mythril Skin": 48,
"Armour Breaker": 49,
"Shield Strike": 50,
"Sparkling Hope": 51,
"Massive Bash": 52,
"Tempest": 53,
"Spirit of the Rabbit": 54,
"Massacre": 55,
"Axe Kick": 56,
"Radiance": 57,
"Cheaper Bash 2": 58,
"Cheaper War Scream": 59,
"Discombobulate": 60,
"Thunderclap": 61,
"Cyclone": 62,
"Second Chance": 63,
"Blood Pact": 64,
"Haemorrhage": 65,
"Brink of Madness": 66,
"Cheaper Uppercut 2": 67,
"Martyr": 68
}
}

View file

@ -236,7 +236,7 @@ class ItemInputDisplayNode extends ComputeNode {
this.input_field.classList.add("is-invalid"); this.input_field.classList.add("is-invalid");
return null; return null;
} }
if (item.statMap.has('powders')) { if (this.powder_field && item.statMap.has('powders')) {
this.powder_field.placeholder = "powders"; this.powder_field.placeholder = "powders";
} }
@ -244,7 +244,7 @@ class ItemInputDisplayNode extends ComputeNode {
return null; return null;
} }
if (item.statMap.has('powders')) { if (this.powder_field && item.statMap.has('powders')) {
this.powder_field.placeholder = item.statMap.get('slots') + ' slots'; this.powder_field.placeholder = item.statMap.get('slots') + ' slots';
} }
@ -945,7 +945,7 @@ class SkillPointSetterNode extends ComputeNode {
class SumNumberInputNode extends InputNode { class SumNumberInputNode extends InputNode {
compute_func(input_map) { compute_func(input_map) {
let value = this.input_field.value; let value = this.input_field.value;
if (value === "") { value = 0; } if (value === "") { value = "0"; }
let input_num = 0; let input_num = 0;
if (value.includes("+")) { if (value.includes("+")) {

View file

@ -1,4 +1,4 @@
const DB_VERSION = 93; const DB_VERSION = 94;
// @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;

View file

@ -19,5 +19,62 @@
{"name":"Breakthrough","type":"bracelet","level":105,"tier":"Fabled","majorIds":[],"intelligence":45,"agility":45,"strengthPoints":-4,"dexterityPoints":-4,"defensePoints":-6,"earthDefense":-45,"thunderDefense":-45,"fireDefense":-30,"sdPct-base":13,"sdRaw-base":75,"ms-base":6,"spRaw2-base":-4,"category":"accessory","displayName":"Breakthrough","spellDamage":13,"spellDamageRaw":75,"manaSteal":6,"spellCostRaw2":-4,"identified":false}, {"name":"Breakthrough","type":"bracelet","level":105,"tier":"Fabled","majorIds":[],"intelligence":45,"agility":45,"strengthPoints":-4,"dexterityPoints":-4,"defensePoints":-6,"earthDefense":-45,"thunderDefense":-45,"fireDefense":-30,"sdPct-base":13,"sdRaw-base":75,"ms-base":6,"spRaw2-base":-4,"category":"accessory","displayName":"Breakthrough","spellDamage":13,"spellDamageRaw":75,"manaSteal":6,"spellCostRaw2":-4,"identified":false},
{"name":"Detachment","type":"bracelet","level":105,"tier":"Fabled","majorIds":[],"dexterity":55,"agility":60,"thunderDefense":60,"airDefense":60,"mdRaw-base":-85,"sdRaw-base":-65,"spd-base":13,"spPct4-base":-13,"category":"accessory","displayName":"Detachment","damageBonusRaw":-85,"spellDamageRaw":-65,"speed":13,"spellCostPct4":-13,"identified":false}, {"name":"Detachment","type":"bracelet","level":105,"tier":"Fabled","majorIds":[],"dexterity":55,"agility":60,"thunderDefense":60,"airDefense":60,"mdRaw-base":-85,"sdRaw-base":-65,"spd-base":13,"spPct4-base":-13,"category":"accessory","displayName":"Detachment","damageBonusRaw":-85,"spellDamageRaw":-65,"speed":13,"spellCostPct4":-13,"identified":false},
{"name":"Exhibition","type":"necklace","level":105,"tier":"Fabled","majorIds":[],"intelligence":80,"earthDefense":-30,"thunderDefense":-30,"waterDefense":60,"fireDefense":-30,"airDefense":-30,"mr-base":-4,"spRaw1-base":-2,"spRaw2-base":-2,"spRaw3-base":-2,"spRaw4-base":-2,"category":"accessory","displayName":"Exhibition","manaRegen":-4,"spellCostRaw1":-2,"spellCostRaw2":-2,"spellCostRaw3":-2,"spellCostRaw4":-2,"identified":false}, {"name":"Exhibition","type":"necklace","level":105,"tier":"Fabled","majorIds":[],"intelligence":80,"earthDefense":-30,"thunderDefense":-30,"waterDefense":60,"fireDefense":-30,"airDefense":-30,"mr-base":-4,"spRaw1-base":-2,"spRaw2-base":-2,"spRaw3-base":-2,"spRaw4-base":-2,"category":"accessory","displayName":"Exhibition","manaRegen":-4,"spellCostRaw1":-2,"spellCostRaw2":-2,"spellCostRaw3":-2,"spellCostRaw4":-2,"identified":false},
{"name":"Simulacrum","type":"necklace","level":105,"tier":"Fabled","majorIds":[],"strength":55,"defense":45,"health":-800,"earthDefense":-70,"fireDefense":-90,"sdRaw-base":150,"hprRaw-base":-150,"mr-base":5,"spd-base":8,"category":"accessory","displayName":"Simulacrum","spellDamageRaw":150,"healthRegenRaw":-150,"manaRegen":5,"speed":8,"identified":false} {"name":"Simulacrum","type":"necklace","level":105,"tier":"Fabled","majorIds":[],"strength":55,"defense":45,"health":-800,"earthDefense":-70,"fireDefense":-90,"sdRaw-base":150,"hprRaw-base":-150,"mr-base":5,"spd-base":8,"category":"accessory","displayName":"Simulacrum","spellDamageRaw":150,"healthRegenRaw":-150,"manaRegen":5,"speed":8,"identified":false},
{"name":"Medeis","type":"chestplate","level":100,"tier":"Unique","sockets":3,"majorIds":[],"dexterity":40,"intelligence":40,"defense":40,"dexterityPoints":10,"intelligencePoints":10,"defensePoints":10,"health":2950,"earthDefense":-100,"thunderDefense":75,"waterDefense":75,"fireDefense":75,"airDefense":-100,"tDamPct-base":8,"wDamPct-base":8,"fDamPct-base":8,"sdPct-base":8,"category":"armor","displayName":"Medeis","bonusEarthDamage":-75,"bonusThunderDamage":8,"bonusWaterDamage":8,"bonusFireDamage":8,"bonusAirDamage":-75,"spellDamage":8,"identified":false},
{"name":"Roulette","type":"dagger","level":79,"tier":"Rare","majorIds":[],"dexterity":40,"dexterityPoints":8,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-58","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SUPER_FAST","category":"weapon","displayName":"Roulette","basedps":29,"bonusThunderDamage":888,"xpBonus":8,"lootBonus":8,"identified":false},
{"name":"Prowess","type":"bracelet","level":100,"tier":"Legendary","majorIds":[],"quest":"The Qira Hive","strengthPoints":4,"dexterityPoints":4,"intelligencePoints":4,"defensePoints":4,"agilityPoints":4,"health":425,"category":"accessory","displayName":"Prowess","identified":true},
{"name":"Caesura","type":"helmet","level":93,"tier":"Unique","sockets":2,"majorIds":[],"strength":45,"dexterity":60,"intelligence":30,"strengthPoints":10,"intelligencePoints":15,"health":2450,"earthDefense":100,"thunderDefense":100,"waterDefense":-250,"category":"armor","displayName":"Caesura","bonusEarthDamage":25,"bonusThunderDamage":25,"spellDamage":10,"spellDamageRaw":231,"manaRegen":-15,"manaSteal":-15,"identified":false},
{"name":"Gigabyte","type":"necklace","level":93,"tier":"Legendary","strengthPoints":4,"dexterityPoints":4,"intelligencePoints":4,"defensePoints":4,"agilityPoints":4,"health":-512,"mr-base":-4,"identified":true,"category":"accessory","displayName":"Gigabyte","healthRegenRaw":48,"manaRegen":-4,"thorns":8,"speed":8},
{"name":"Pro Tempore","type":"boots","level":88,"tier":"Unique","sockets":4,"majorIds":[],"dexterity":40,"intelligence":50,"intelligencePoints":10,"health":2350,"thunderDefense":-50,"waterDefense":-50,"sdRaw-base":104,"category":"armor","displayName":"Pro Tempore","spellDamage":20,"spellDamageRaw":104,"manaRegen":10,"manaSteal":-15,"lifeSteal":165,"identified":false},
{"name":"Orange Lily","type":"bow","level":96,"tier":"Legendary","sockets":3,"strength":50,"intelligence":60,"damage":"75-140","earthDamage":"165-235","thunderDamage":"0-0","waterDamage":"165-235","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SLOW","identified":true,"category":"weapon","displayName":"Orange Lily","basedps":507.5,"bonusEarthDamage":20,"bonusWaterDamage":20,"bonusAirDamage":-150,"bonusAirDefense":-100,"manaRegen":10,"spellCostRaw3":-5,"spellCostRaw4":50},
{"name":"Brainwash","type":"helmet","level":96,"tier":"Rare","majorIds":[],"strength":40,"dexterity":70,"strengthPoints":13,"intelligencePoints":-50,"health":2800,"earthDefense":70,"thunderDefense":100,"waterDefense":-220,"mr-base":10,"ms-base":15,"category":"armor","displayName":"Brainwash","bonusThunderDamage":15,"bonusWaterDamage":-30,"spellDamage":10,"spellDamageRaw":190,"healthRegen":-40,"manaRegen":10,"manaSteal":15,"identified":false},
{"name":"Second Wind","type":"leggings","level":83,"tier":"Fabled","sockets":3,"majorIds":[],"defense":65,"agility":40,"agilityPoints":20,"health":6325,"earthDefense":-350,"thunderDefense":-350,"fireDefense":120,"airDefense":120,"ls-base":-475,"category":"armor","displayName":"Second Wind","attackSpeedBonus":1,"healthRegen":-30,"lifeSteal":-475,"speed":20,"identified":false},
{"name":"Cumulonimbus","type":"helmet","level":94,"tier":"Rare","sockets":3,"majorIds":[],"dexterity":30,"intelligence":30,"agility":30,"dexterityPoints":10,"intelligencePoints":10,"agilityPoints":10,"health":1800,"thunderDefense":70,"waterDefense":70,"airDefense":70,"sdPct-base":15,"category":"armor","displayName":"Cumulonimbus","bonusThunderDamage":10,"bonusWaterDamage":10,"bonusAirDamage":10,"spellDamage":15,"speed":25,"identified":false},
{"name":"Morrowind","type":"wand","level":96,"tier":"Legendary","sockets":3,"majorIds":[],"agility":45,"agilityPoints":14,"damage":"30-60","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"45-135","attackSpeed":"FAST","sdRaw-base":145,"category":"weapon","displayName":"Morrowind","basedps":135,"bonusEarthDamage":-15,"bonusAirDamage":23,"spellDamageRaw":145,"bonusAirDefense":23,"reflection":46,"speed":23,"identified":false},
{"name": "Anima-Infused Helmet", "displayName":"Boreal-Patterned Crown","type":"helmet","level":100,"tier":"Legendary","sockets":2,"quest":"The Qira Hive","dexterity":40,"intelligence":40,"agility":40,"strengthPoints":-30,"defensePoints":-30,"health":3000,"thunderDefense":150,"waterDefense":150,"airDefense":150,"identified":true,"category":"armor","displayName":"Boreal-Patterned Crown","bonusThunderDamage":25,"bonusWaterDamage":25,"bonusAirDamage":25,"damageBonus":-40,"spellDamage":20,"spellDamageRaw":300,"bonusThunderDefense":10,"bonusWaterDefense":10,"bonusAirDefense":10,"manaRegen":8},
{"name":"Corsair","type":"helmet","level":99,"tier":"Unique","sockets":2,"majorIds":[],"dexterity":55,"agility":35,"dexterityPoints":8,"health":2900,"earthDefense":-140,"thunderDefense":80,"airDefense":110,"ms-base":5,"spPct1-base":-10,"spPct4-base":-14,"category":"armor","displayName":"Corsair","bonusThunderDamage":10,"bonusAirDamage":12,"manaSteal":5,"speed":11,"spellCostPct1":-10,"spellCostPct4":-14,"emeraldStealing":4,"identified":false},
{"name":"Scaldsteppers","type":"boots","level":90,"tier":"Unique","sockets":2,"majorIds":[],"intelligence":40,"defense":30,"intelligencePoints":7,"health":2325,"thunderDefense":-100,"waterDefense":110,"fireDefense":80,"airDefense":-90,"spRaw3-base":-4,"category":"armor","displayName":"Scaldsteppers","bonusWaterDamage":10,"bonusFireDamage":10,"bonusAirDamage":-12,"spellDamage":20,"exploding":10,"spellCostRaw3":-4,"identified":false},
{"name":"Charging Flame","type":"spear","level":94,"tier":"Rare","sockets":2,"majorIds":[],"intelligence":40,"defense":40,"damage":"20-40","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"40-120","fireDamage":"20-140","airDamage":"0-0","attackSpeed":"NORMAL","mr-base":5,"spRaw2-base":-12,"category":"weapon","displayName":"Charging Flame","basedps":190,"bonusWaterDamage":12,"bonusFireDamage":12,"damageBonus":12,"spellDamage":12,"healthBonus":-1200,"bonusThunderDefense":-25,"manaRegen":5,"exploding":24,"spellCostRaw2":-12,"identified":false},
{"name":"Aphotic","type":"helmet","level":98,"tier":"Legendary","sockets":2,"majorIds":[],"intelligence":100,"dexterityPoints":-80,"intelligencePoints":5,"health":3200,"thunderDefense":-150,"waterDefense":150,"spRaw3-base":-7,"category":"armor","displayName":"Aphotic","spellDamage":50,"attackSpeedBonus":-6,"spellCostRaw3":-7,"identified":false},
{"name":"Silent Ballet","type":"relik","level":83,"tier":"Unique","majorIds":[],"strength":40,"agility":40,"damage":"0-0","earthDamage":"110-121","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"110-121","attackSpeed":"FAST","category":"weapon","displayName":"Silent Ballet","basedps":231,"damageBonus":40,"spellDamage":-40000,"spellDamageRaw":-40000,"spellCostPct1":-40,"spellCostPct2":-40,"spellCostPct3":-40,"spellCostPct4":-40,"spellCostRaw1":-40,"spellCostRaw2":-40,"spellCostRaw3":-40,"spellCostRaw4":-40,"identified":false},
{"name":"Rhythm of the Seasons","type":"spear","level":100,"tier":"Fabled","sockets":2,"majorIds":["RALLY"],"strength":80,"defense":60,"defensePoints":12,"damage":"40-50","earthDamage":"100-140","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"VERY_FAST","mr-base":15,"category":"weapon","displayName":"Rhythm of the Seasons","basedps":165,"bonusWaterDamage":25,"healthBonus":1800,"healthRegenRaw":-660,"manaRegen":15,"identified":false},
{"name":"Sorrow","type":"chestplate","level":72,"tier":"Rare","sockets":1,"intelligence":95,"health":1400,"thunderDefense":-150,"waterDefense":150,"identified":true,"category":"armor","displayName":"Sorrow","bonusWaterDamage":42,"spellDamage":8,"manaRegen":5,"manaSteal":-20,"spellCostRaw1":-8,"soulPoints":20},
{"name":"Condensation","type":"boots","level":87,"tier":"Unique","majorIds":[],"intelligence":75,"intelligencePoints":10,"health":2000,"thunderDefense":-120,"waterDefense":100,"spRaw3-base":-6,"category":"armor","displayName":"Condensation","damageBonus":-30,"spellDamage":30,"bonusThunderDefense":-20,"spellCostRaw3":-6,"identified":false},
{"name":"Augoeides","type":"chestplate","level":63,"tier":"Rare","majorIds":[],"intelligence":65,"health":1000,"earthDefense":20,"thunderDefense":20,"waterDefense":20,"fireDefense":20,"airDefense":20,"mr-base":5,"spRaw3-base":-5,"category":"armor","displayName":"Augoeides","damageBonusRaw":-52,"manaRegen":5,"reflection":30,"spellCostRaw3":-5,"xpBonus":5,"lootBonus":8,"soulPoints":10,"identified":false},
{"name":"Matryoshka Shell","type":"chestplate","level":55,"tier":"Legendary","sockets":18,"majorIds":[],"strength":10,"dexterity":10,"intelligence":10,"defense":10,"agility":10,"health":550,"earthDefense":50,"thunderDefense":50,"waterDefense":50,"fireDefense":50,"airDefense":50,"spRaw1-base":-5,"category":"armor","displayName":"Matryoshka Shell","bonusEarthDefense":20,"bonusThunderDefense":20,"bonusWaterDefense":20,"bonusFireDefense":20,"bonusAirDefense":20,"speed":10,"spellCostRaw1":-5,"xpBonus":20,"lootBonus":20,"identified":false},
{"name":"Pure","type":"wand","level":65,"tier":"Mythic","majorIds":["ENTROPY"],"intelligence":50,"agility":30,"damage":"0-5","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"20-45","fireDamage":"0-0","airDamage":"15-55","attackSpeed":"FAST","ms-base":30,"spRaw3-base":6,"category":"weapon","displayName":"Pure","basedps":70,"damageBonus":-100,"spellDamage":400,"manaSteal":30,"reflection":20,"spellCostRaw3":6,"xpBonus":30,"identified":false},
{"name":"Resurgence","type":"boots","level":91,"tier":"Mythic","sockets":4,"majorIds":[],"intelligence":65,"defense":90,"intelligencePoints":25,"health":4550,"waterDefense":175,"fireDefense":125,"mr-base":30,"category":"armor","displayName":"Resurgence","damageBonus":-45,"spellDamage":-35,"healthRegenRaw":390,"manaRegen":30,"speed":-14,"soulPoints":20,"identified":false},
{"name":"Galleon","type":"boots","level":92,"tier":"Mythic","sockets":3,"majorIds":[],"strength":65,"intelligence":60,"health":4500,"earthDefense":200,"waterDefense":250,"airDefense":-175,"ms-base":20,"category":"armor","displayName":"Galleon","bonusEarthDamage":36,"bonusWaterDamage":36,"damageBonus":45,"attackSpeedBonus":-1,"poison":4231,"manaSteal":20,"emeraldStealing":15,"lootBonus":20,"identified":false},
{"name":"Boreal","type":"boots","level":93,"tier":"Mythic","sockets":3,"majorIds":[],"defense":75,"agility":65,"health":5000,"fireDefense":250,"airDefense":375,"mr-base":10,"category":"armor","displayName":"Boreal","bonusEarthDamage":-75,"bonusThunderDamage":-75,"bonusFireDefense":50,"bonusAirDefense":50,"healthRegen":100,"healthRegenRaw":269,"manaRegen":10,"reflection":25,"speed":25,"identified":false},
{"name":"Freedom","type":"bow","level":93,"tier":"Mythic","sockets":4,"majorIds":[],"strength":40,"dexterity":40,"intelligence":40,"defense":40,"agility":40,"agilityPoints":30,"damage":"0-0","earthDamage":"85-109","thunderDamage":"45-149","waterDamage":"65-129","fireDamage":"75-119","airDamage":"55-139","attackSpeed":"NORMAL","mr-base":10,"category":"weapon","displayName":"Freedom","basedps":485,"damageBonusRaw":111,"spellDamageRaw":111,"healthBonus":1000,"manaRegen":10,"speed":15,"identified":false},
{"name":"Olympic","type":"relik","level":93,"tier":"Mythic","sockets":3,"majorIds":[],"agility":105,"agilityPoints":25,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"345-375","attackSpeed":"FAST","spRaw1-base":-10,"spRaw2-base":-10,"category":"weapon","displayName":"Olympic","basedps":360,"bonusAirDamage":20,"bonusAirDefense":30,"jumpHeight":6,"speed":35,"spellCostRaw1":-10,"spellCostRaw2":-10,"identified":false},
{"name":"Guardian","type":"spear","level":93,"tier":"Mythic","sockets":3,"majorIds":["GUARDIAN"],"defense":110,"defensePoints":20,"damage":"50-90","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"165-205","airDamage":"0-0","attackSpeed":"NORMAL","category":"weapon","displayName":"Guardian","basedps":255,"healthBonus":6000,"bonusEarthDefense":20,"bonusWaterDefense":20,"bonusFireDefense":20,"healthRegenRaw":585,"manaRegen":1,"thorns":25,"identified":false},
{"name":"Hadal","type":"relik","level":94,"tier":"Mythic","sockets":3,"majorIds":[],"intelligence":130,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"1750-2150","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SUPER_SLOW","mr-base":30,"spPct3-base":112,"spPct4-base":112,"category":"weapon","displayName":"Hadal","basedps":1950,"spellDamage":75,"manaRegen":30,"spellCostPct3":112,"spellCostPct4":112,"identified":false},
{"name":"Nullification","type":"dagger","level":95,"tier":"Mythic","sockets":3,"majorIds":[],"strength":30,"dexterity":30,"intelligence":30,"defense":30,"agility":30,"defensePoints":40,"damage":"0-0","earthDamage":"60-66","thunderDamage":"22-104","waterDamage":"46-80","fireDamage":"36-90","airDamage":"28-98","attackSpeed":"FAST","ms-base":16,"category":"weapon","displayName":"Nullification","basedps":315,"poison":-7000,"bonusEarthDefense":143,"bonusThunderDefense":143,"bonusWaterDefense":143,"bonusFireDefense":143,"bonusAirDefense":143,"manaSteal":16,"lifeSteal":495,"reflection":80,"identified":false},
{"name":"Idol","type":"spear","level":95,"tier":"Mythic","sockets":3,"majorIds":[],"intelligence":120,"intelligencePoints":26,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"230-330","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"NORMAL","mr-base":10,"spRaw2-base":-50,"category":"weapon","displayName":"Idol","basedps":280,"spellDamageRaw":264,"bonusWaterDefense":15,"manaRegen":10,"reflection":30,"spellCostRaw2":-50,"soulPoints":25,"identified":false},
{"name":"Dawnbreak","type":"boots","level":96,"tier":"Mythic","sockets":2,"majorIds":[],"dexterity":65,"defense":65,"health":4225,"thunderDefense":200,"waterDefense":-125,"fireDefense":200,"airDefense":-125,"ms-base":12,"category":"armor","displayName":"Dawnbreak","bonusThunderDamage":27,"bonusFireDamage":27,"damageBonusRaw":2700,"attackSpeedBonus":-20,"manaSteal":12,"lifeSteal":350,"exploding":23,"identified":false},
{"name":"Cataclysm","type":"dagger","level":96,"tier":"Mythic","sockets":3,"majorIds":[],"dexterity":120,"dexterityPoints":20,"damage":"40-140","earthDamage":"0-0","thunderDamage":"45-305","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SUPER_FAST","category":"weapon","displayName":"Cataclysm","basedps":265,"bonusThunderDamage":17,"healthBonus":-6000,"thorns":21,"spellCostRaw1":-1,"emeraldStealing":5,"identified":false},
{"name":"Grimtrap","type":"dagger","level":96,"tier":"Mythic","sockets":3,"majorIds":[],"strength":100,"strengthPoints":15,"damage":"175-235","earthDamage":"305-425","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SLOW","ms-base":-10,"spRaw4-base":-10,"category":"weapon","displayName":"Grimtrap","basedps":570,"poison":2000,"manaSteal":-10,"lifeSteal":650,"thorns":70,"spellCostRaw2":1,"spellCostRaw4":-10,"identified":false},
{"name":"Weathered","type":"dagger","level":96,"tier":"Mythic","sockets":3,"majorIds":["ROVINGASSASSIN"],"agility":110,"agilityPoints":15,"damage":"40-80","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"140-230","attackSpeed":"VERY_FAST","ms-base":16,"category":"weapon","displayName":"Weathered","basedps":245,"bonusAirDamage":20,"attackSpeedBonus":1,"manaSteal":16,"reflection":25,"exploding":-50,"speed":25,"identified":false},
{"name":"Thrundacrack","type":"spear","level":96,"tier":"Mythic","sockets":4,"majorIds":[],"dexterity":105,"dexterityPoints":35,"damage":"50-90","earthDamage":"0-0","thunderDamage":"50-220","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"VERY_FAST","spRaw3-base":-6,"category":"weapon","displayName":"Thrundacrack","basedps":205,"bonusThunderDamage":25,"bonusWaterDamage":60,"healthRegen":-60,"speed":9,"spellCostRaw3":-6,"identified":false},
{"name":"Lament","type":"wand","level":96,"tier":"Mythic","sockets":3,"majorIds":[],"intelligence":110,"intelligencePoints":20,"damage":"70-90","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"180-190","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SLOW","ms-base":40,"spPct1-base":-35,"category":"weapon","displayName":"Lament","basedps":265,"bonusWaterDamage":80,"manaSteal":40,"lifeSteal":-500,"spellCostPct1":-35,"identified":false},
{"name":"Toxoplasmosis","type":"relik","level":96,"tier":"Mythic","sockets":2,"majorIds":[],"strength":110,"strengthPoints":40,"damage":"0-0","earthDamage":"3-3","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"VERY_FAST","ms-base":18,"category":"weapon","displayName":"Toxoplasmosis","basedps":3,"poison":10000,"manaSteal":18,"lifeSteal":500,"speed":20,"lootBonus":20,"identified":false},
{"name":"Stardew","type":"boots","level":97,"tier":"Mythic","sockets":2,"majorIds":[],"dexterity":65,"intelligence":75,"health":4075,"earthDefense":-100,"thunderDefense":150,"waterDefense":150,"fireDefense":-100,"airDefense":-100,"mr-base":-9,"ms-base":15,"category":"armor","displayName":"Stardew","bonusThunderDamage":35,"bonusWaterDamage":35,"spellDamageRaw":313,"manaRegen":-9,"manaSteal":15,"reflection":25,"identified":false},
{"name":"Divzer","type":"bow","level":97,"tier":"Mythic","sockets":3,"majorIds":[],"dexterity":115,"dexterityPoints":37,"defensePoints":-39,"agilityPoints":-550,"damage":"48-50","earthDamage":"0-0","thunderDamage":"250-250","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SUPER_FAST","ms-base":30,"category":"weapon","displayName":"Divzer","basedps":299,"bonusWaterDamage":-550,"bonusFireDamage":-550,"damageBonusRaw":536,"spellDamageRaw":253,"attackSpeedBonus":1,"manaSteal":30,"lifeSteal":973,"identified":false},
{"name":"Inferno","type":"dagger","level":97,"tier":"Mythic","sockets":3,"majorIds":[],"defense":105,"defensePoints":15,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"855-1045","airDamage":"0-0","attackSpeed":"VERY_SLOW","category":"weapon","displayName":"Inferno","basedps":950,"bonusFireDamage":35,"damageBonus":25,"damageBonusRaw":560,"healthBonus":1500,"bonusWaterDefense":-40,"healthRegen":-45,"manaRegen":-1,"speed":25,"spellCostRaw1":-1,"identified":false},
{"name":"Nirvana","type":"dagger","level":97,"tier":"Mythic","sockets":3,"majorIds":["ARCANES"],"intelligence":110,"intelligencePoints":40,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"320-385","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"NORMAL","mr-base":10,"ms-base":-20,"category":"weapon","displayName":"Nirvana","basedps":352.5,"damageBonus":-80,"spellDamage":25,"healthBonus":-2000,"manaRegen":10,"manaSteal":-20,"reflection":15,"identified":false},
{"name":"Collapse","type":"spear","level":97,"tier":"Mythic","sockets":3,"majorIds":["FISSION"],"strength":35,"dexterity":35,"intelligence":35,"defense":35,"agility":35,"strengthPoints":45,"damage":"40-65","earthDamage":"0-310","thunderDamage":"0-310","waterDamage":"0-310","fireDamage":"0-310","airDamage":"0-310","attackSpeed":"VERY_SLOW","ms-base":18,"category":"weapon","displayName":"Collapse","basedps":827.5,"damageBonus":50,"bonusEarthDefense":-65,"bonusThunderDefense":-65,"bonusWaterDefense":-65,"bonusFireDefense":-65,"bonusAirDefense":-65,"manaSteal":18,"exploding":250,"identified":false},
{"name":"Gaia","type":"wand","level":97,"tier":"Mythic","sockets":3,"majorIds":[],"strength":105,"strengthPoints":25,"damage":"150-220","earthDamage":"380-490","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"VERY_SLOW","spRaw4-base":-9,"category":"weapon","displayName":"Gaia","basedps":620,"damageBonus":15,"damageBonusRaw":575,"spellDamageRaw":-275,"poison":2500,"thorns":15,"spellCostRaw4":-9,"identified":false},
{"name":"Absolution","type":"relik","level":97,"tier":"Mythic","majorIds":[],"defense":115,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"195-205","airDamage":"0-0","attackSpeed":"SUPER_FAST","mr-base":16,"spRaw1-base":-20,"category":"weapon","displayName":"Absolution","basedps":200,"bonusWaterDamage":200,"bonusFireDamage":20,"healthBonus":3000,"bonusEarthDefense":45,"bonusThunderDefense":45,"manaRegen":16,"spellCostRaw1":-20,"soulPoints":23,"identified":false},
{"name":"Spring","type":"bow","level":98,"tier":"Mythic","sockets":3,"majorIds":[],"intelligence":120,"strengthPoints":15,"dexterityPoints":-40,"intelligencePoints":15,"damage":"150-185","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"200-310","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"NORMAL","mr-base":30,"category":"weapon","displayName":"Spring","basedps":422.5,"bonusThunderDamage":-50,"bonusWaterDamage":20,"manaRegen":30,"identified":false},
{"name":"Monster","type":"wand","level":98,"tier":"Mythic","sockets":3,"majorIds":[],"defense":110,"defensePoints":40,"damage":"110-140","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"160-220","airDamage":"0-0","attackSpeed":"SLOW","ms-base":10,"spRaw1-base":4,"category":"weapon","displayName":"Monster","basedps":315,"bonusFireDamage":25,"damageBonus":40,"healthBonus":3000,"manaSteal":10,"lifeSteal":500,"spellCostRaw1":4,"identified":false},
{"name":"Revenant","type":"boots","level":99,"tier":"Mythic","sockets":3,"majorIds":[],"strength":70,"agility":70,"health":7000,"earthDefense":70,"airDefense":70,"ms-base":10,"spPct4-base":-28,"category":"armor","displayName":"Revenant","bonusEarthDamage":40,"bonusAirDamage":40,"damageBonus":-70,"damageBonusRaw":520,"healthBonus":-2500,"manaSteal":10,"reflection":120,"speed":40,"spellCostPct4":-28,"identified":false},
{"name":"Fatal","type":"wand","level":99,"tier":"Mythic","sockets":3,"majorIds":[],"dexterity":110,"dexterityPoints":25,"damage":"0-0","earthDamage":"0-0","thunderDamage":"1-360","waterDamage":"0-0","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"VERY_FAST","spPct1-base":28,"spPct2-base":-49,"category":"weapon","displayName":"Fatal","basedps":180.5,"spellDamage":25,"manaSteal":1,"speed":15,"spellCostPct1":28,"spellCostPct2":-49,"identified":false},
{"name":"Warp","type":"wand","level":99,"tier":"Mythic","sockets":3,"majorIds":[],"agility":130,"agilityPoints":20,"damage":"40-70","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"0-0","airDamage":"190-220","attackSpeed":"VERY_FAST","mr-base":-49,"spRaw1-base":4,"spRaw2-base":-299,"category":"weapon","displayName":"Warp","basedps":260,"bonusAirDamage":15,"healthRegen":-200,"healthRegenRaw":-600,"manaRegen":-49,"reflection":90,"exploding":50,"speed":180,"spellCostRaw1":4,"spellCostRaw2":-299,"identified":false},
{"name":"Oblivion","type":"dagger","level":101,"tier":"Mythic","sockets":4,"majorIds":[],"dexterity":75,"intelligence":65,"dexterityPoints":15,"damage":"1-200","earthDamage":"0-0","thunderDamage":"600-999","waterDamage":"600-999","fireDamage":"0-0","airDamage":"0-0","attackSpeed":"SUPER_SLOW","mr-base":-30,"ms-base":15,"spRaw2-base":-20,"category":"weapon","displayName":"Oblivion","basedps":1699.5,"spellDamageRaw":265,"manaRegen":-30,"manaSteal":15,"exploding":40,"spellCostRaw2":-20,"soulPoints":40,"identified":false},
{"name":"Epoch","type":"bow","level":102,"tier":"Mythic","sockets":3,"majorIds":[],"dexterity":70,"agility":70,"damage":"500-620","earthDamage":"0-0","thunderDamage":"480-640","waterDamage":"0-0","fireDamage":"0-0","airDamage":"520-600","attackSpeed":"SUPER_SLOW","sdPct-base":40,"category":"weapon","displayName":"Epoch","basedps":1680,"damageBonusRaw":769,"spellDamage":40,"manaSteal":-1,"lifeSteal":825,"speed":-20,"sprint":70,"spellCostRaw1":-1,"spellCostRaw4":-1,"identified":false},
{"name":"Fantasia","type":"relik","level":96,"tier":"Mythic","sockets":3,"majorIds":[],"strength":45,"dexterity":45,"intelligence":45,"defense":45,"agility":45,"intelligencePoints":50,"damage":"0-0","earthDamage":"200-340","thunderDamage":"260-280","waterDamage":"230-310","fireDamage":"215-325","airDamage":"245-295","attackSpeed":"VERY_SLOW","spPct1-base":-27,"spPct2-base":-27,"spPct3-base":-27,"spPct4-base":-27,"category":"weapon","displayName":"Fantasia","basedps":1350,"spellDamage":30,"manaRegen":-4,"manaSteal":-4,"spellCostPct1":-27,"spellCostPct2":-27,"spellCostPct3":-27,"spellCostPct4":-27,"identified":false},
{"name":"Slayer","type":"boots","level":94,"tier":"Mythic","sockets":2,"majorIds":[],"dexterity":75,"agility":60,"dexterityPoints":20,"health":3775,"waterDefense":-100,"spPct3-base":-30,"category":"armor","displayName":"Slayer","damageBonusRaw":285,"attackSpeedBonus":1,"healthRegenRaw":-270,"speed":27,"spellCostPct3":-30,"emeraldStealing":10,"identified":false},
{"name":"Immolation","type":"relik","level":101,"tier":"Mythic","sockets":3,"majorIds":[],"defense":80,"agility":80,"defensePoints":50,"agilityPoints":50,"damage":"0-0","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"0-0","fireDamage":"200-440","airDamage":"310-330","attackSpeed":"SLOW","spPct3-base":-14,"category":"weapon","displayName":"Immolation","basedps":640,"bonusWaterDamage":-1000,"bonusFireDamage":45,"bonusAirDamage":45,"healthBonus":-2750,"healthRegen":-180,"spellCostPct3":-14,"identified":false},
{"name":"Convergence","type":"spear","level":104,"tier":"Mythic","sockets":3,"majorIds":[],"intelligence":65,"defense":75,"damage":"70-90","earthDamage":"0-0","thunderDamage":"0-0","waterDamage":"100-120","fireDamage":"105-115","airDamage":"0-0","attackSpeed":"NORMAL","spPct3-base":-45,"category":"weapon","displayName":"Convergence","basedps":300,"bonusEarthDamage":55,"bonusThunderDamage":55,"bonusAirDefense":35,"healthRegen":43,"sprintRegen":43,"spellCostPct3":-45,"identified":false}
]} ]}

View file

@ -58,6 +58,11 @@ mul_keys = {
"ms": 50 "ms": 50
} }
def round_near(x, eps=1e-5):
if x - round(x) < eps:
return round(x)
return x
remap_items = [] remap_items = []
#old_items_map = dict() #old_items_map = dict()
import math import math
@ -67,7 +72,7 @@ for item in old_items:
# SUPER JANKY ROUNDING # SUPER JANKY ROUNDING
tentimes = round(item[k] * v) tentimes = round(item[k] * v)
rem = tentimes % 10 rem = tentimes % 10
val = math.floor(round(tentimes / 10)) val = math.floor(round_near(tentimes / 10))
if rem >= 5: if rem >= 5:
val += 1 val += 1
item[k] = val item[k] = val