Merge branch 'atree' into atree_active_box

This commit is contained in:
hppeng 2022-07-08 17:29:40 -07:00
commit c5191cfe99
10 changed files with 1700 additions and 1486 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) - dog (wynn2 ability tree help)
- 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

@ -468,22 +468,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':
@ -491,7 +493,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) {
@ -513,7 +515,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";
@ -534,7 +536,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
@ -553,7 +555,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;
} }

View file

@ -341,7 +341,6 @@ const atrees = {
"desc": "When you hit the ground with Arrow Bomb, leave a Trap that damages enemies. (Max 2 Traps)", "desc": "When you hit the ground with Arrow Bomb, leave a Trap that damages enemies. (Max 2 Traps)",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 2, "archetype_req": 2,
"base_abil": "Arrow Bomb",
"parents": ["Bryophyte Roots"], "parents": ["Bryophyte Roots"],
"dependencies": [], "dependencies": [],
"blockers": [], "blockers": [],
@ -357,10 +356,17 @@ const atrees = {
}, },
"effects": [ "effects": [
{ {
"type": "add_spell_prop", "type": "replace_spell",
"base_spell": 3, "name": "Basaltic Trap",
"target_part": "Basaltic Trap", "base_spell": 7,
"multipliers": [140, 30, 0, 0, 30, 0] "display": "Trap Damage",
"parts": [
{
"name": "Trap Damage",
"type": "damage",
"multipliers": [140, 30, 0, 0, 30, 0]
}
]
} }
] ]
}, },
@ -581,7 +587,7 @@ const atrees = {
"desc": "Your Traps will give you 2.85 Mana per second when you stay close to them.", "desc": "Your Traps will give you 2.85 Mana per second when you stay close to them.",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 5, "archetype_req": 5,
"base_abil": "Arrow Bomb", "base_abil": "Basaltic Trap",
"parents": ["More Traps", "Better Arrow Shield"], "parents": ["More Traps", "Better Arrow Shield"],
"dependencies": [], "dependencies": [],
"blockers": [], "blockers": [],
@ -794,6 +800,7 @@ const atrees = {
"desc": "Your Traps will be connected by a rope that deals damage to enemies every 0.2s.", "desc": "Your Traps will be connected by a rope that deals damage to enemies every 0.2s.",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 0, "archetype_req": 0,
"base_abil": "Basaltic Trap",
"parents": ["Grape Bomb"], "parents": ["Grape Bomb"],
"dependencies": ["Basaltic Trap"], "dependencies": ["Basaltic Trap"],
"blockers": [], "blockers": [],
@ -804,20 +811,16 @@ const atrees = {
}, },
"effects": [ "effects": [
{ {
"type": "replace_spell", "type": "add_spell_prop",
"name": "Tangled Traps", "base_spell": 7,
"base_spell": 7, "target_part": "Line Damage Tick",
"display": "DPS", "multipliers": [20, 0, 0, 0, 0, 20]
"parts": [ },
{ {
"name": "Damage Tick", "type": "add_spell_prop",
"multipliers": [20, 0, 0, 0, 0, 20] "base_spell": 7,
}, "target_part": "DPS",
{ "hits": { "Line Damage Tick": 5 }
"name": "DPS",
"hits": { "Damage Tick": 5 }
}
]
} }
] ]
}, },
@ -874,7 +877,7 @@ const atrees = {
"desc": "Allow you to place +6 Traps, but with reduced damage and range.", "desc": "Allow you to place +6 Traps, but with reduced damage and range.",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 10, "archetype_req": 10,
"base_abil": "Arrow Bomb", "base_abil": "Basaltic Trap",
"parents": ["Grape Bomb", "Cheaper Arrow Bomb (2)"], "parents": ["Grape Bomb", "Cheaper Arrow Bomb (2)"],
"dependencies": ["Basaltic Trap"], "dependencies": ["Basaltic Trap"],
"blockers": [], "blockers": [],
@ -884,8 +887,8 @@ const atrees = {
"effects": [ "effects": [
{ {
"type": "add_spell_prop", "type": "add_spell_prop",
"base_spell": 3, "base_spell": 8,
"target_part": "Basaltic Trap", "target_part": "Trap Damage",
"cost": 0, "cost": 0,
"multipliers": [-80, 0, 0, 0, 0, 0] "multipliers": [-80, 0, 0, 0, 0, 0]
}, },
@ -1262,7 +1265,7 @@ const atrees = {
"desc": "Increase the maximum amount of active Traps you can have by +2.", "desc": "Increase the maximum amount of active Traps you can have by +2.",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 0, "archetype_req": 0,
"base_abil": "Arrow Bomb", "base_abil": "Basaltic Trap",
"parents": ["Bouncing Bomb"], "parents": ["Bouncing Bomb"],
"dependencies": ["Basaltic Trap"], "dependencies": ["Basaltic Trap"],
"blockers": [], "blockers": [],
@ -1783,7 +1786,7 @@ const atrees = {
"desc": "Your Traps will deal +20% more damage for every second they are active (Max +80%)", "desc": "Your Traps will deal +20% more damage for every second they are active (Max +80%)",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 0, "archetype_req": 0,
"base_abil": "Arrow Bomb", "base_abil": "Basaltic Trap",
"parents": ["More Shields"], "parents": ["More Shields"],
"dependencies": ["Basaltic Trap"], "dependencies": ["Basaltic Trap"],
"blockers": [], "blockers": [],
@ -1814,7 +1817,7 @@ const atrees = {
"desc": "Add +80% Max Damage to Patient Hunter", "desc": "Add +80% Max Damage to Patient Hunter",
"archetype": "Trapper", "archetype": "Trapper",
"archetype_req": 0, "archetype_req": 0,
"base_abil": "Arrow Bomb", "base_abil": "Basaltic Trap",
"parents": ["Grape Bomb"], "parents": ["Grape Bomb"],
"dependencies": ["Patient Hunter"], "dependencies": ["Patient Hunter"],
"blockers": [], "blockers": [],

File diff suppressed because one or more lines are too long

View file

@ -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