diff --git a/builder/index.html b/builder/index.html index 37b62f6..008dc87 100644 --- a/builder/index.html +++ b/builder/index.html @@ -1,2 +1,2 @@ - WynnBuilder
Join the discord today to suggest new features, submit bug reports, and hangout/talk to devs!
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Level:
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Active boosts
Earth
Thunder
Water
Fire
Air
Curse (Active)
Concentration (Passive)
Offense
Defense
Overall
Input a weapon to see abilities!
\ No newline at end of file + WynnBuilder
Join the discord today to suggest new features, submit bug reports, and hangout/talk to devs!
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Level:
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Assign: 0
Original: 0
Active boosts
Earth
Thunder
Water
Fire
Air
Curse (Active)
Concentration (Passive)
Offense
Defense
Overall
Input a weapon to see abilities!
diff --git a/builder/index_full.html b/builder/index_full.html index 1280b6e..135c5c8 100644 --- a/builder/index_full.html +++ b/builder/index_full.html @@ -49,7 +49,7 @@
- +
@@ -76,7 +76,7 @@
- +
@@ -102,7 +102,7 @@
- +
@@ -129,7 +129,7 @@
- +
@@ -155,7 +155,7 @@
- +
@@ -182,7 +182,7 @@
- +
@@ -209,7 +209,7 @@
- +
@@ -236,7 +236,7 @@
- +
@@ -262,7 +262,7 @@
- +
@@ -611,7 +611,7 @@
- +
@@ -635,7 +635,7 @@
- +
@@ -659,7 +659,7 @@
- +
@@ -683,7 +683,7 @@
- +
@@ -707,7 +707,7 @@
- +
@@ -731,7 +731,7 @@
- +
@@ -755,7 +755,7 @@
- +
@@ -1253,7 +1253,7 @@ - + diff --git a/crafter/index.html b/crafter/index.html index 20e4a4c..34cacf7 100644 --- a/crafter/index.html +++ b/crafter/index.html @@ -39,7 +39,7 @@
- +
@@ -283,7 +283,7 @@ - + diff --git a/css/sq2bs.css b/css/sq2bs.css index 1e5751f..d9fdbca 100644 --- a/css/sq2bs.css +++ b/css/sq2bs.css @@ -100,17 +100,24 @@ input.equipment-input { font-weight: bold; background-color: hsl(0, 0%, 21%) !important; border-radius: 0.375rem !important; - border-color: rgba(33, 37, 41, 1) !important; min-height: calc(1.2 * var(--scaled-fontsize) + 2px); padding: 0rem 0.5rem; font-size: var(--scaled-fontsize); -} - -.equipment-input { --bs-gutter-y: 1rem; --bs-gutter-x: 3rem } +input.equipment-input:not(.is-invalid) { + border-color: rgba(33, 37, 41, 1) !important; +} + +.my-container { + position: fixed; /* Stay in place */ + left: var(--sidebar-width); + overflow-y: scroll; + height: 100%; +} + .text-right { float: right; } @@ -311,7 +318,6 @@ input.equipment-input { width: 3.5rem; } - .warning { font-size: .8rem; } @@ -482,3 +488,16 @@ a:hover { .ferricles{ color: #5be553; } + +.item-display-new-toggleable { + image-rendering: pixelated; + background-size: 1200% 100%; + aspect-ratio: 1/1; +} +.tome-image { + background-image: url('../media/items/common.png'); + image-rendering: pixelated; + background-size: 500% 100%; + background-position: 100% 0; + aspect-ratio: 1/1; +} diff --git a/dev/index.html b/dev/index.html index 0ee432b..9aea30c 100644 --- a/dev/index.html +++ b/dev/index.html @@ -959,7 +959,7 @@
-->
- + diff --git a/items_adv/items_2_help.html b/items_adv/items_2_help.html index 9e89d9d..4736c14 100644 --- a/items_adv/items_2_help.html +++ b/items_adv/items_2_help.html @@ -221,6 +221,6 @@ docsFns.append(genDocEntry(entry[0], entry[1], null, entry[2])); } - + diff --git a/js/atree.js b/js/atree.js index 0b83444..e63cc25 100644 --- a/js/atree.js +++ b/js/atree.js @@ -199,7 +199,6 @@ const atree_node = new (class extends ComputeNode { const atree_render = new (class extends ComputeNode { constructor() { super('builder-atree-render'); - this.fail_cb = true; this.UI_elem = document.getElementById("atree-ui"); this.list_elem = document.getElementById("atree-header"); } @@ -310,7 +309,7 @@ function abil_can_activate(atree_node, atree_state, reachable, archetype_count, } let failed_deps = []; for (const dep_id of ability.dependencies) { - if (!atree_state.get(dep_id).active) { failed_deps.push(dep_id) } + if (!reachable.has(dep_id)) { failed_deps.push(dep_id) } } if (failed_deps.length > 0) { const dep_strings = failed_deps.map(i => '"' + atree_state.get(i).ability.display_name + '"'); @@ -318,7 +317,7 @@ function abil_can_activate(atree_node, atree_state, reachable, archetype_count, } let blocking_ids = []; for (const blocker_id of ability.blockers) { - if (atree_state.get(blocker_id).active) { blocking_ids.push(blocker_id); } + if (reachable.has(blocker_id)) { blocking_ids.push(blocker_id); } } if (blocking_ids.length > 0) { const blockers_strings = blocking_ids.map(i => '"' + atree_state.get(i).ability.display_name + '"'); @@ -372,11 +371,11 @@ const atree_validate = new (class extends ComputeNode { const abil = node.ability; if (atree_state.get(abil.id).active) { atree_to_add.push([node, 'not reachable', false]); - atree_state.get(abil.id).img.src = '../media/atree/' + abil.display.icon + '_selected.png'; + atree_state.get(abil.id).img.style.backgroundPosition = atlasBGPositionCalc([atreeNodeAtlasPositions[abil.display.icon], 2], atreeNodeAtlasSize); } else { atree_not_present.push(abil.id); - atree_state.get(abil.id).img.src = '../media/atree/' + abil.display.icon + '_blocked.png'; + atree_state.get(abil.id).img.style.backgroundPosition = atlasBGPositionCalc([atreeNodeAtlasPositions[abil.display.icon], 0], atreeNodeAtlasSize); } } @@ -425,7 +424,7 @@ const atree_validate = new (class extends ComputeNode { const node = atree_state.get(node_id); const [success, hard_error, reason] = abil_can_activate(node, atree_state, reachable, archetype_count, ap_left); if (success) { - node.img.src = '../media/atree/'+node.ability.display.icon+'.png'; + node.img.style.backgroundPosition = atlasBGPositionCalc([atreeNodeAtlasPositions[node.ability.display.icon], 1], atreeNodeAtlasSize); } } @@ -977,7 +976,7 @@ function render_AT(UI_elem, list_elem, tree) { const parent_id = parent_abil.id; let connect_elem = document.createElement("div"); - connect_elem.style = "background-size: cover; width: 200%; height: 200%; position: absolute; top: -50%; left: -50%; image-rendering: pixelated;"; + connect_elem.style = "width: 112.5%; height: 112.5%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); image-rendering: pixelated; background-image: url('../media/atree/connectors.png'); background-size: 1700% 500%;" // connect up for (let i = ability.display.row - 1; i > parent_abil.display.row; i--) { const coord = i + "," + ability.display.col; @@ -1012,17 +1011,9 @@ function render_AT(UI_elem, list_elem, tree) { } // create node - let node_elem = document.createElement('div'); - let icon = ability.display.icon; - if (icon === undefined) { - icon = "node"; - } - let node_img = document.createElement('img'); - node_img.src = '../media/atree/'+icon+'.png'; - node_img.style = "width: 200%; height: 200%; position: absolute; top: -50%; left: -50%; image-rendering: pixelated; z-index: 1;"; - node_elem.appendChild(node_img); - - node_wrap.img = node_img; + let node_elem = document.getElementById("atree-row-" + ability.display.row).children[ability.display.col]; + node_wrap.img = make_elem("div", [], {style: "width: 200%; height: 200%; position: absolute; top: -50%; left: -50%; image-rendering: pixelated; z-index: 1; background-image: url('../media/atree/icons.png'); background-size: 900% 300%;"}) + node_elem.appendChild(node_wrap.img); // create hitbox // this is necessary since images exceed the size of their square, but should only be interactible within that square @@ -1060,8 +1051,6 @@ function render_AT(UI_elem, list_elem, tree) { delete node_wrap.tooltip_elem; } }); - - document.getElementById("atree-row-" + ability.display.row).children[ability.display.col].appendChild(node_elem); }; atree_render_connection(atree_connectors_map); @@ -1237,26 +1226,6 @@ function set_connector_type(connector_info) { // left right up down } } -// draw the connector onto the screen -function atree_render_connection(atree_connectors_map) { - for (let i of atree_connectors_map.keys()) { - let connector_info = atree_connectors_map.get(i); - let connector_elem = connector_info.connector; - let connector_img = document.createElement('img'); - set_connector_type(connector_info); - connector_img.src = '../media/atree/connect_'+connector_info.type+'.png'; - connector_img.style = "width: 100%; height: 100%;" - connector_elem.replaceChildren(connector_img); - connector_info.highlight = [0, 0, 0, 0]; - let target_elem = document.getElementById("atree-row-" + i.split(",")[0]).children[i.split(",")[1]]; - if (target_elem.children.length != 0) { - // janky special case... - connector_elem.style.display = 'none'; - } - target_elem.appendChild(connector_elem); - }; -}; - // toggle the state of a node. function atree_set_state(node_wrapper, new_state) { let icon = node_wrapper.ability.display.icon; @@ -1265,11 +1234,11 @@ function atree_set_state(node_wrapper, new_state) { } if (new_state) { node_wrapper.active = true; - node_wrapper.elem.children[0].src = "../media/atree/" + icon + "_selected.png"; + node_wrapper.img.style.backgroundPosition = atlasBGPositionCalc([atreeNodeAtlasPositions[icon], 2], atreeNodeAtlasSize); } else { node_wrapper.active = false; - node_wrapper.elem.children[0].src = "../media/atree/" + icon + ".png"; + node_wrapper.img.style.backgroundPosition = atlasBGPositionCalc([atreeNodeAtlasPositions[icon], 1], atreeNodeAtlasSize); } let atree_connectors_map = node_wrapper.all_connectors_ref; for (const parent of node_wrapper.parents) { @@ -1284,6 +1253,62 @@ function atree_set_state(node_wrapper, new_state) { } }; +// first key is connector type, second key is highlight, then [x, y] pair of 0-index positions in the tile atlas +const atreeConnectorAtlasPositions = { + "1100": {"0000": [0, 0], "1100": [1, 0]}, + "1010": {"0000": [2, 0], "1010": [3, 0]}, + "0110": {"0000": [4, 0], "0110": [5, 0]}, + "1001": {"0000": [6, 0], "1001": [7, 0]}, + "0101": {"0000": [8, 0], "0101": [9, 0]}, + "0011": {"0000": [10, 0], "0011": [11, 0]}, + "1101": {"0000": [0, 1], "1101": [1, 1], "1100": [2, 1], "1001": [3, 1], "0101": [4, 1]}, + "0111": {"0000": [5, 1], "0111": [6, 1], "0110": [7, 1], "0101": [8, 1], "0011": [9, 1]}, + "1110": {"0000": [0, 2], "1110": [1, 2], "1100": [2, 2], "1010": [3, 2], "0110": [4, 2]}, + "1011": {"0000": [5, 2], "1011": [6, 2], "1010": [7, 2], "1001": [8, 2], "0011": [9, 2]}, + "1111": {"0000": [0, 3], "1111": [1, 3], "1110": [2, 3], "1101": [3, 3], "1100": [4, 3], "1011": [5, 3], "1010": [6, 3], "1001": [7, 3], "0111": [8, 3], "0110": [9, 3], "0101": [10, 3], "0011": [11, 3]} +} +const atreeConnectorAtlasSize = [17, 5] +// just has the x position, y is based on state +const atreeNodeAtlasPositions = { + "node_0": 0, + "node_1": 1, + "node_2": 2, + "node_3": 3, + "node_archer": 4, + "node_warrior": 5, + "node_mage": 6, + "node_assassin": 7, + "node_shaman": 8 +} +const atreeNodeAtlasSize = [9, 3] +function atlasBGPositionCalc(pos, atlasSize) { + // https://css-tricks.com/focusing-background-image-precise-location-percentages/ + // p = (c + 0.5/z - 0.5) * z/(z - 1) + 0.5 + // z = num tiles in direction + // c = starting pos of tile in percent of total atlas (equal to index/z) + let x = ((pos[0]/atlasSize[0]) + 0.5/atlasSize[0] - 0.5) * atlasSize[0]/(atlasSize[0] - 1) + 0.5 + let y = ((pos[1]/atlasSize[1]) + 0.5/atlasSize[1] - 0.5) * atlasSize[1]/(atlasSize[1] - 1) + 0.5 + return (x * 100) + "% " + (y * 100) + "%" // multiply by 100 to convert decimal to percent +} + +// draw the connector onto the screen +function atree_render_connection(atree_connectors_map) { + for (let i of atree_connectors_map.keys()) { + let connector_info = atree_connectors_map.get(i); + let connector_elem = connector_info.connector; + set_connector_type(connector_info); + connector_info.highlight = [0, 0, 0, 0]; + connector_elem.style.backgroundPosition = atlasBGPositionCalc(atreeConnectorAtlasPositions[connector_info.type]["0000"], atreeConnectorAtlasSize); + let target_elem = document.getElementById("atree-row-" + i.split(",")[0]).children[i.split(",")[1]]; + if (target_elem.children.length != 0) { + // janky special case... + connector_elem.style.display = 'none'; + } + target_elem.appendChild(connector_elem); + }; +}; + +// update the connector (after being drawn the first time by atree_render_connection) function atree_set_edge(atree_connectors_map, parent, child, state) { const connectors = child.connectors.get(parent); const parent_row = parent.ability.display.row; @@ -1298,8 +1323,6 @@ function atree_set_edge(atree_connectors_map, parent, child, state) { let connector_info = atree_connectors_map.get(connector_label); let connector_elem = connector_info.connector; let highlight_state = connector_info.highlight; // left right up down - let connector_img_elem = document.createElement("img"); - connector_img_elem.style = "width: 100%; height: 100%;"; const ctype = connector_info.type; let num_1s = 0; for (let i = 0; i < 4; i++) { @@ -1327,23 +1350,16 @@ function atree_set_edge(atree_connectors_map, parent, child, state) { for (let i = 0; i < 4; i++) { render += highlight_state[i] === 0 ? "0" : "1"; } - if (render == "0000") { - connector_img_elem.src = "../media/atree/connect_" + ctype + ".png"; - } else { - connector_img_elem.src = "../media/atree/connect_" + ctype + "_" + render + ".png"; - } - connector_elem.replaceChildren(connector_img_elem); + connector_elem.style.backgroundPosition = atlasBGPositionCalc(atreeConnectorAtlasPositions[ctype][render], atreeConnectorAtlasSize); continue; - } - // lol bad overloading, [0] is just the whole state - highlight_state[0] += state_delta; - if (highlight_state[0] > 0) { - connector_img_elem.src = '../media/atree/connect_' + ctype + '_1.png'; - connector_elem.replaceChildren(connector_img_elem); - } - else { - connector_img_elem.src = '../media/atree/connect_'+ctype+'.png'; - connector_elem.replaceChildren(connector_img_elem); + } else { + // lol bad overloading, [0] is just the whole state + highlight_state[0] += state_delta; + if (highlight_state[0] > 0) { + connector_elem.style.backgroundPosition = atlasBGPositionCalc(atreeConnectorAtlasPositions[ctype][ctype], atreeConnectorAtlasSize); + } else { + connector_elem.style.backgroundPosition = atlasBGPositionCalc(atreeConnectorAtlasPositions[ctype]["0000"], atreeConnectorAtlasSize); + } } } } diff --git a/js/atree_constants.js b/js/atree_constants.js index f6570fa..939ad25 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -7665,21 +7665,14 @@ const atrees = { "type": "replace_spell", "name": "Backstab", "base_spell": 3, - "display": "Total Damage", + "display": "Backstab Damage", "parts": [ { - "name": "Per Hit", + "name": "Backstab Damage", "type": "damage", "multipliers": [ 200, 50, 0, 0, 0, 0 ] - }, - { - "name": "Total Damage", - "type": "total", - "hits": { - "Per Hit": 1 - } } ] } @@ -9139,8 +9132,23 @@ const atrees = { "bonuses": [ { "type": "stat", - "name": "dmgMult.Satsujin", - "value": 300 + "name": "damMult.Satsujin:3.Backstab Damage", + "value": 200 + }, + { + "type": "stat", + "name": "damMult.Satsujin:3.Per Hit", + "value": 200 + }, + { + "type": "stat", + "name": "damMult.Satsujin:3.Fatality", + "value": 200 + }, + { + "type": "stat", + "name": "damMult.Satsujin:0.Melee", + "value": 200 } ] } diff --git a/js/atree_constants_min.js b/js/atree_constants_min.js index 8b067f1..8f66739 100644 --- a/js/atree_constants_min.js +++ b/js/atree_constants_min.js @@ -1 +1 @@ -const atrees={"Archer":[{"display_name":"Arrow Shield","desc":"Create a shield around you that deal damage and knockback mobs when triggered. (2 Charges)","parents":[60,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":6,"icon":"node_archer"},"properties":{"charges":2,"duration":60,"aoe":5000},"effects":[{"type":"replace_spell","name":"Arrow Shield","cost":30,"base_spell":4,"display":"Total Damage","parts":[{"name":"Shield Damage","type":"damage","multipliers":[90,0,0,0,0,10]},{"name":"Total Damage","type":"total","hits":{"Shield Damage":2}}]}],"id":0},{"display_name":"Escape","desc":"Throw yourself backward to avoid danger. (Hold shift while escaping to cancel)","parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":7,"col":4,"icon":"node_archer"},"properties":{"aoe":0,"range":0},"effects":[{"type":"replace_spell","name":"Escape","cost":25,"base_spell":2,"display":"","parts":[]}],"id":1},{"display_name":"Arrow Bomb","desc":"Throw a long-range arrow that explodes and deal high damage in a large area. (Self-damage for 25% of your DPS)","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_archer"},"properties":{"aoe":4.5,"range":26},"effects":[{"type":"replace_spell","name":"Arrow Bomb","cost":50,"base_spell":3,"spell_type":"damage","display":"Total Damage","parts":[{"name":"Arrow Bomb","type":"damage","multipliers":[160,0,0,0,20,0]},{"name":"Total Damage","type":"total","hits":{"Arrow Bomb":1}}]}],"id":2},{"display_name":"Heart Shatter","desc":"If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage.","base_abil":2,"parents":[31],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Heart Shatter","multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Heart Shatter":1}}],"id":3},{"display_name":"Fire Creep","desc":"Arrow Bomb will leak a trail of fire for 6s, Damaging enemies that walk into it every 0.4s.","base_abil":2,"parents":[68,39,5],"dependencies":[],"blockers":[],"cost":2,"display":{"row":16,"col":6,"icon":"node_1"},"properties":{"aoe":0.8,"duration":6},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fire Creep","multipliers":[30,0,0,0,20,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Burn Damage","hits":{"Fire Creep":15}}],"id":4},{"display_name":"Bryophyte Roots","desc":"When you hit an enemy with Arrow Storm, create an area that slows them down and deals damage every 0.4s.","base_abil":7,"archetype":"Trapper","archetype_req":1,"parents":[4,35],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":16,"col":8,"icon":"node_1"},"properties":{"aoe":2,"duration":5},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Bryophyte Roots","cost":0,"multipliers":[40,20,0,0,0,0]},{"type":"add_spell_prop","base_spell":1,"target_part":"Total Roots Damage","hits":{"Bryophyte Roots":12}}],"id":5},{"display_name":"Nimble String","desc":"Arrow Storm throw out +6 arrows per stream and shoot twice as fast.","base_abil":7,"parents":[36,69],"dependencies":[7],"blockers":[68],"cost":2,"display":{"row":15,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Arrow","multipliers":[-15,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Stream","hits":{"Single Arrow":6}}],"id":6},{"display_name":"Arrow Storm","desc":"Shoot a stream of 8 arrows, dealing significant damage to close mobs and pushing them back.","parents":[58,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":2,"icon":"node_archer"},"properties":{"range":16},"effects":[{"type":"replace_spell","name":"Arrow Storm","cost":40,"base_spell":1,"spell_type":"damage","display":"Total Damage","parts":[{"name":"Single Arrow","multipliers":[30,0,10,0,0,0]},{"name":"Single Stream","hits":{"Single Arrow":8}},{"name":"Total Damage","hits":{"Single Stream":1}}]}],"id":7},{"display_name":"Guardian Angels","desc":"Your protective arrows from Arrow Shield will become sentient bows, dealing damage up to 8 times each to nearby enemies. (Arrow Shield will no longer push nearby enemies)","archetype":"Boltslinger","archetype_req":3,"base_abil":0,"parents":[59,67],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":19,"col":1,"icon":"node_3"},"properties":{"range":4,"duration":60,"shots":8,"charges":2},"effects":[{"type":"replace_spell","name":"Guardian Angels","base_spell":4,"display":"DPS","parts":[{"name":"Single Shot","type":"damage","multipliers":[30,0,0,0,0,10]},{"name":"Single Bow","type":"total","hits":{"Single Shot":8}},{"name":"DPS","type":"total","hits":{"Single Shot":2}},{"name":"Total Damage","type":"total","hits":{"Single Bow":2}}]}],"id":8},{"display_name":"Windy Feet","desc":"When casting Escape, give speed to yourself and nearby allies.","base_abil":1,"parents":[7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":1,"icon":"node_1"},"properties":{"aoe":8,"duration":120},"effects":[],"id":9},{"display_name":"Basaltic Trap","desc":"When you hit the ground with Arrow Bomb, leave a Trap that damages enemies. (Max 2 Traps)","archetype":"Trapper","archetype_req":2,"parents":[5],"dependencies":[],"blockers":[],"cost":2,"display":{"row":19,"col":8,"icon":"node_3"},"properties":{"aoe":7,"traps":2},"effects":[{"type":"replace_spell","name":"Basaltic Trap","base_spell":7,"display":"Trap Damage","parts":[{"name":"Trap Damage","type":"damage","multipliers":[140,30,0,0,30,0]}]}],"id":10},{"display_name":"Windstorm","desc":"Arrow Storm shoot +1 stream of arrows, and each stream shoots +2 arrows, effectively doubling its damage.","base_abil":7,"parents":[8,33],"dependencies":[],"blockers":[68],"cost":2,"display":{"row":21,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Arrow","multipliers":[-10,0,-2,0,0,2]},{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Stream":1}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Stream","cost":0,"hits":{"Single Arrow":2}}],"id":11},{"display_name":"Grappling Hook","base_abil":1,"desc":"When casting Escape, throw a hook that pulls you when hitting a block. If you hit an enemy, pull them towards you instead. (Escape will not throw you backward anymore)","archetype":"Trapper","archetype_req":0,"parents":[61,40,33],"dependencies":[],"blockers":[20],"cost":2,"display":{"row":21,"col":5,"icon":"node_2"},"properties":{"range":26},"effects":[],"id":12},{"display_name":"Implosion","desc":"Arrow bomb will pull enemies towards you. If a trap is nearby, it will pull them towards it instead. Increase Heart Shatter's damage.","archetype":"Trapper","archetype_req":0,"base_abil":2,"parents":[12,40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":22,"col":6,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Heart Shatter","multipliers":[40,0,0,0,0,0]}],"id":13},{"display_name":"Twain's Arc","desc":"When you have 2+ Focus, holding shift will summon the Twain's Arc. Charge it up to shoot a destructive long-range beam. (Damage is dealt as Main Attack Damage)","archetype":"Sharpshooter","archetype_req":4,"parents":[62,64],"dependencies":[61],"blockers":[],"cost":2,"display":{"row":25,"col":4,"icon":"node_2"},"properties":{"range":64,"focusReq":2},"effects":[{"type":"replace_spell","name":"Twain's Arc","base_spell":5,"scaling":"melee","use_atkspd":false,"display":"Single Shot","parts":[{"name":"Single Shot","type":"damage","multipliers":[200,0,0,0,0,0]}]}],"id":14},{"display_name":"Fierce Stomp","desc":"When using Escape, hold shift to quickly drop down and deal damage.","archetype":"Boltslinger","archetype_req":0,"base_abil":1,"parents":[42,64],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":1,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Fierce Stomp","cost":0,"multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Stomp Damage","cost":0,"hits":{"Fierce Stomp":1},"display":"Stomp Damage"}],"id":15},{"display_name":"Scorched Earth","desc":"Fire Creep become much stronger.","archetype":"Sharpshooter","archetype_req":0,"parents":[14],"dependencies":[4],"blockers":[],"cost":1,"display":{"row":26,"col":5,"icon":"node_1"},"properties":{"duration":2,"aoe":0.4},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fire Creep","multipliers":[10,0,0,0,5,0]}],"id":16},{"display_name":"Leap","desc":"When you double tap jump, leap foward. (2s Cooldown)","archetype":"Boltslinger","archetype_req":5,"parents":[42,55],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_1"},"properties":{"cooldown":2},"effects":[],"id":17},{"display_name":"Shocking Bomb","desc":"Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder.","archetype":"Sharpshooter","archetype_req":5,"base_abil":2,"parents":[14,44,55],"dependencies":[2],"blockers":[],"cost":2,"display":{"row":28,"col":4,"icon":"node_1"},"properties":{"gravity":0},"effects":[{"type":"convert_spell_conv","target_part":"all","base_spell":3,"conversion":"Thunder"}],"id":18},{"display_name":"Mana Trap","desc":"Your Traps will give you 2.85 Mana per second when you stay close to them.","archetype":"Trapper","archetype_req":5,"base_abil":10,"parents":[43,44],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":8,"icon":"node_3"},"properties":{"range":16,"manaRegen":2.85},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":10}],"id":19},{"display_name":"Escape Artist","desc":"When casting Escape, release 120 arrows towards the ground.","base_abil":1,"parents":[46,17],"dependencies":[],"blockers":[12],"cost":2,"display":{"row":31,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Per Arrow","multipliers":[20,0,10,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Max Damage (Escape Artist)","hits":{"Per Arrow":120},"display":"Max Damage (Escape Artist)"}],"id":20},{"display_name":"Initiator","desc":"If you do not damage an enemy for 5s or more, your next sucessful hit will deal +50% damage and add +1 Focus.","archetype":"Sharpshooter","archetype_req":5,"parents":[18,44,47],"dependencies":[61],"blockers":[],"cost":2,"display":{"row":31,"col":5,"icon":"node_2"},"properties":{},"effects":[],"id":21},{"display_name":"Call of the Hound","desc":"Arrow Shield summon a Hound that will attack and drag aggressive enemies towards your traps.","archetype":"Trapper","archetype_req":0,"base_abil":0,"parents":[21,47],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":32,"col":7,"icon":"node_2"},"properties":{},"effects":[{"type":"replace_spell","name":"Call of the Hound","base_spell":8,"display":"DPS","parts":[{"name":"Single Hit","multipliers":[40,0,0,0,0,0]},{"name":"DPS","hits":{"Single Hit":4}}]}],"id":22},{"display_name":"Arrow Hurricane","desc":"Arrow Storm will shoot +2 stream of arrows.","archetype":"Boltslinger","archetype_req":8,"base_abil":7,"parents":[48,20],"dependencies":[],"blockers":[68],"cost":2,"display":{"row":33,"col":0,"icon":"node_3"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Stream":2}}],"id":23},{"display_name":"Geyser Stomp","desc":"Fierce Stomp will create geysers, dealing more damage and vertical knockback.","base_abil":1,"parents":[56],"dependencies":[15],"blockers":[],"cost":2,"display":{"row":37,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Geyser Stomp","multipliers":[0,0,0,50,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Stomp Damage","hits":{"Geyser Stomp":1}},{"type":"raw_stat","bonuses":[{"type":"prop","abil":15,"name":"aoe","value":1}]}],"id":24},{"display_name":"Crepuscular Ray","desc":"If you have 5 Focus, casting Arrow Storm will make you levitate and shoot 20 homing arrows per second until you run out of Focus. While in that state, you will lose 1 Focus per second.","archetype":"Sharpshooter","archetype_req":10,"parents":[49],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":37,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Crepuscular Ray","base_spell":6,"display":"DPS","parts":[{"name":"Single Arrow","multipliers":[20,0,0,5,0,0]},{"name":"DPS","hits":{"Single Arrow":20}},{"name":"Total Damage","hits":{"DPS":7}}]}],"id":25},{"display_name":"Grape Bomb","desc":"Arrow bomb will throw 3 additional smaller bombs when exploding.","base_abil":2,"parents":[51],"dependencies":[],"blockers":[],"cost":2,"display":{"row":37,"col":7,"icon":"node_2"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Grape Bomb","multipliers":[30,0,0,0,10,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Grape Bomb":3}}],"id":26},{"display_name":"Tangled Traps","desc":"Your Traps will be connected by a rope that deals damage to enemies every 0.2s.","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[26],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":38,"col":6,"icon":"node_1"},"properties":{"attackSpeed":0.2},"effects":[{"type":"add_spell_prop","base_spell":7,"target_part":"Line Damage Tick","multipliers":[20,0,0,0,0,20]},{"type":"add_spell_prop","base_spell":7,"target_part":"DPS","hits":{"Line Damage Tick":5}}],"id":27},{"display_name":"Snow Storm","desc":"Enemies near you will be slowed down.","parents":[24,63],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":2,"icon":"node_2"},"properties":{"range":2.5,"slowness":0.3},"effects":[],"id":28},{"display_name":"All-Seeing Panoptes","desc":"Your bows from Guardian Angels become all-seeing, increasing their range, damage and letting them shoot up to +5 times each.","archetype":"Boltslinger","archetype_req":11,"base_abil":0,"parents":[28],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":40,"col":1,"icon":"node_3"},"properties":{"range":8,"shots":5},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Single Shot","multipliers":[0,0,0,0,10,0]},{"type":"add_spell_prop","base_spell":4,"target_part":"Single Bow","hits":{"Single Shot":5}}],"id":29},{"display_name":"Minefield","desc":"Allow you to place +6 Traps, but with reduced damage and range.","archetype":"Trapper","archetype_req":10,"base_abil":10,"parents":[26,53],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":40,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":7,"target_part":"Trap Damage","cost":0,"multipliers":[-80,0,0,0,0,0]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"aoe","value":-2},{"type":"prop","abil":10,"name":"traps","value":6}]}],"id":30},{"display_name":"Bow Proficiency I","desc":"Improve your Main Attack's damage and range when using a bow.","base_abil":999,"parents":[2],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[5,0,0,0,0,0]}],"id":31},{"display_name":"Cheaper Arrow Bomb","desc":"Reduce the Mana cost of Arrow Bomb.","base_abil":2,"parents":[31],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-10}],"id":32},{"display_name":"Cheaper Arrow Storm","desc":"Reduce the Mana cost of Arrow Storm.","base_abil":7,"parents":[12,11,61],"dependencies":[],"blockers":[],"cost":1,"display":{"row":21,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":33},{"display_name":"Cheaper Escape","desc":"Reduce the Mana cost of Escape.","base_abil":1,"parents":[7,0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":34},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases your base damage from all Earth attacks","archetype":"Trapper","archetype_req":0,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":35},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases your base damage from all Thunder attacks","archetype":"Boltslinger","archetype_req":0,"parents":[7,39,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":36},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases your base damage from all Water attacks","archetype":"Sharpshooter","archetype_req":0,"parents":[34,36,39],"dependencies":[],"blockers":[],"cost":1,"display":{"row":14,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":37},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Boltslinger","archetype_req":0,"parents":[7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":38},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Sharpshooter","archetype_req":0,"parents":[36,0,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":39},{"display_name":"More Shields","desc":"Give +2 charges to Arrow Shield.","base_abil":0,"parents":[12,10],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":21,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Shield Damage":2,"Single Bow":2}},{"type":"add_spell_prop","base_spell":4,"target_part":"DPS","behavior":"modify","hits":{"Single Shot":2}},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"name":"charges","value":2}]}],"id":40},{"display_name":"Stormy Feet","desc":"Windy Feet will last longer and add more speed.","archetype":"Boltslinger","base_abil":1,"parents":[11],"dependencies":[9],"blockers":[],"cost":1,"display":{"row":23,"col":1,"icon":"node_0"},"properties":{"duration":60},"effects":[],"id":41},{"display_name":"Refined Gunpowder","desc":"Increase the damage of Arrow Bomb.","base_abil":2,"parents":[11,64],"dependencies":[],"blockers":[],"cost":1,"display":{"row":25,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Arrow Bomb","multipliers":[50,0,0,0,0,0]}],"id":42},{"display_name":"More Traps","desc":"Increase the maximum amount of active Traps you can have by +2.","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[54],"dependencies":[10],"blockers":[],"cost":1,"display":{"row":26,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"traps","value":2}]}],"id":43},{"display_name":"Better Arrow Shield","desc":"Arrow Shield will gain additional area of effect, knockback and damage.","archetype":"Sharpshooter","archetype_req":0,"base_abil":0,"parents":[19,18,14],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":28,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Arrow Shield","behavior":"modify","multipliers":[40,0,0,0,0,0]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"behavior":"modify","name":"aoe","value":1}]}],"id":44},{"display_name":"Better Leap","desc":"Reduce leap's cooldown by 1s.","archetype":"Boltslinger","archetype_req":0,"base_abil":17,"parents":[17,55],"dependencies":[17],"blockers":[],"cost":1,"display":{"row":29,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":17,"name":"cooldown","value":-1}]}],"id":45},{"display_name":"Better Guardian Angels","desc":"Your Guardian Angels can shoot +4 arrows before disappearing.","archetype":"Boltslinger","archetype_req":0,"base_abil":0,"parents":[20,55],"dependencies":[8],"blockers":[],"cost":1,"display":{"row":31,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Single Bow","hits":{"Single Shot":4}}],"id":46},{"display_name":"Cheaper Arrow Storm (2)","desc":"Reduce the Mana cost of Arrow Storm.","base_abil":7,"parents":[21,19],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":47},{"display_name":"Precise Shot","desc":"+30% Critical Hit Damage","parents":[46,49,23],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"critDamPct","value":30}]}],"id":48},{"display_name":"Cheaper Arrow Shield","desc":"Reduce the Mana cost of Arrow Shield.","base_abil":0,"parents":[48,21],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":49},{"display_name":"Rocket Jump","desc":"Arrow Bomb's self-damage will knockback you farther away.","base_abil":2,"parents":[47,21],"dependencies":[2],"blockers":[],"cost":1,"display":{"row":33,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":50},{"display_name":"Cheaper Escape (2)","desc":"Reduce the Mana cost of Escape.","base_abil":1,"parents":[22,70],"dependencies":[],"blockers":[],"cost":1,"display":{"row":34,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":51},{"display_name":"Stronger Hook","desc":"Increase your Grappling Hook's range, speed and strength.","archetype":"Trapper","archetype_req":5,"base_abil":1,"parents":[51],"dependencies":[12],"blockers":[],"cost":1,"display":{"row":35,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":12,"name":"range","value":8}]}],"id":52},{"display_name":"Cheaper Arrow Bomb (2)","desc":"Reduce the Mana cost of Arrow Bomb.","base_abil":2,"parents":[63,30],"dependencies":[],"blockers":[],"cost":1,"display":{"row":40,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":53},{"display_name":"Bouncing Bomb","desc":"Arrow Bomb will bounce once when hitting a block or enemy","base_abil":2,"parents":[40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":7,"icon":"node_2"},"properties":{},"effects":[],"id":54},{"display_name":"Homing Shots","desc":"Your Main Attack arrows will follow nearby enemies and not be affected by gravity","archetype":"Sharpshooter","archetype_req":2,"base_abil":999,"parents":[17,18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_2"},"properties":{},"effects":[],"id":55},{"display_name":"Shrapnel Bomb","desc":"Arrow Bomb's explosion will fling 15 shrapnel, dealing damage in a large area","archetype":"Boltslinger","archetype_req":8,"base_abil":2,"parents":[23,48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Shrapnel Bomblet","multipliers":[40,0,0,0,20,0]}],"id":56},{"display_name":"Elusive","desc":"If you do not get hit for 8+ seconds, become immune to self-damage and remove Arrow Storm's recoil. (Dodging counts as not getting hit)","archetype":"Boltslinger","archetype_req":0,"parents":[24],"dependencies":[],"blockers":[],"cost":2,"display":{"row":38,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":57},{"display_name":"Double Shots","desc":"Double Main Attack arrows, but they deal -30% damage per arrow (harder to hit far enemies)","archetype":"Boltslinger","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[60],"cost":1,"display":{"row":7,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[-30,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"target_part":"Total Damage","hits":{"Single Shot":2},"display":"Total Damage"}],"id":58},{"display_name":"Triple Shots","desc":"Triple Main Attack arrows, but they deal -20% damage per arrow","archetype":"Boltslinger","archetype_req":0,"base_abil":999,"parents":[69,67],"dependencies":[58],"blockers":[],"cost":1,"display":{"row":17,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[-20,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"target_part":"Total Damage","hits":{"Single Shot":1},"display":"Total Damage"}],"id":59},{"display_name":"Power Shots","desc":"Main Attack arrows have increased speed and knockback","archetype":"Sharpshooter","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[58],"cost":1,"display":{"row":7,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":60},{"display_name":"Focus","desc":"When hitting an aggressive mob 5+ blocks away, gain +1 Focus (Max 3). Resets if you miss once","archetype":"Sharpshooter","archetype_req":2,"parents":[68],"dependencies":[],"blockers":[],"cost":2,"display":{"row":19,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","output":{"type":"stat","name":"damMult.Focus"},"scaling":[40],"slider_max":3}],"id":61},{"display_name":"More Focus","desc":"Add +2 max Focus","archetype":"Sharpshooter","archetype_req":0,"base_abil":61,"parents":[33,12],"dependencies":[61],"blockers":[],"cost":1,"display":{"row":22,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","slider_max":2,"output":{"type":"stat","name":"damMult.Focus"},"scaling":[-5]}],"id":62},{"display_name":"More Focus (2)","desc":"Add +2 max Focus","archetype":"Sharpshooter","archetype_req":0,"base_abil":61,"parents":[25,28],"dependencies":[61],"blockers":[],"cost":1,"display":{"row":39,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","slider_max":2,"output":{"type":"stat","name":"damMult.Focus"},"scaling":[-5]}],"id":63},{"display_name":"Traveler","desc":"For every 1% Walk Speed you have from items, gain +1 Raw Spell Damage (Max 100)","parents":[42,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":25,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"spd"}],"output":{"type":"stat","name":"sdRaw"},"scaling":[1],"max":100}],"id":64},{"display_name":"Patient Hunter","desc":"Your Traps will deal +20% more damage for every second they are active (Max +80%)","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[40],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":22,"col":8,"icon":"node_1"},"properties":{"max":80},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Trap Wait Time","slider_max":4,"output":{"type":"stat","name":"damMult.Basaltic:7.Trap Damage"},"slider_step":1,"scaling":[20]}],"id":65},{"display_name":"Stronger Patient Hunter","desc":"Add +80% Max Damage to Patient Hunter","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[26],"dependencies":[65],"blockers":[],"cost":1,"display":{"row":38,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Trap Wait Time","slider_max":4},{"type":"raw_stat","bonuses":[{"type":"prop","abil":65,"name":"max","value":80}]}],"id":66},{"display_name":"Frenzy","desc":"Every time you hit an enemy, briefly gain +6% Walk Speed (Max 200%). Decay -40% of the bonus every second","archetype":"Boltslinger","archetype_req":0,"parents":[59,6],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Hits dealt","output":{"type":"stat","name":"spd"},"scaling":[6],"max":160}],"id":67},{"display_name":"Phantom Ray","desc":"Condense Arrow Storm into a single ray that damages enemies 10 times per second","base_abil":7,"parents":[37,4],"dependencies":[7],"blockers":[11,6,23],"cost":2,"display":{"row":16,"col":4,"icon":"node_2"},"properties":{"range":16},"effects":[{"type":"replace_spell","name":"Phantom Ray","base_spell":1,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Single Arrow","type":"damage","multipliers":[25,0,5,0,0,0]},{"name":"Total Damage","type":"total","hits":{"Single Arrow":16}}]},{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":68},{"display_name":"Arrow Rain","desc":"When Arrow Shield loses its last charge, unleash 150 arrows raining down on enemies","base_abil":0,"parents":[6,38],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":15,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Arrow Rain (Per Arrow)","multipliers":[80,0,0,0,0,60]},{"type":"add_spell_prop","base_spell":4,"target_part":"Arrow Rain (Total)","hits":{"Arrow Rain (Per Arrow)":150}}],"id":69},{"display_name":"Decimator","desc":"Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 70%)","archetype":"Sharpshooter","archetype_req":0,"base_abil":7,"parents":[49,51],"dependencies":[68],"blockers":[],"cost":2,"display":{"row":34,"col":5,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Phantom Ray hits","slider_max":7,"output":{"type":"stat","name":"damMult.Decimator:1.Single Arrow"},"scaling":[10]}],"id":70}],"Warrior":[{"display_name":"Bash","desc":"Violently bash the ground, dealing high damage in a large area","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_warrior"},"properties":{"aoe":4,"range":3},"effects":[{"type":"replace_spell","name":"Bash","cost":45,"base_spell":1,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Single Hit","type":"damage","multipliers":[130,20,0,0,0,0]},{"name":"Total Damage","type":"total","hits":{"Single Hit":1}}]}],"id":0},{"display_name":"Spear Proficiency 1","desc":"Improve your Main Attack's damage and range w/ spear","base_abil":999,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{"melee_range":1},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[5,0,0,0,0,0]}],"id":1},{"display_name":"Cheaper Bash","desc":"Reduce the Mana cost of Bash","base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":2},{"display_name":"Double Bash","desc":"Bash will hit a second time at a farther range","parents":[1],"base_abil":0,"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{"range":3},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","cost":0,"hits":{"Single Hit":1}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","cost":0,"multipliers":[-50,0,0,0,0,0]}],"id":3},{"display_name":"Charge","desc":"Charge forward at high speed (hold shift to cancel)","parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":4,"icon":"node_warrior"},"properties":{},"effects":[{"type":"replace_spell","name":"Charge","cost":25,"base_spell":2,"spell_type":"damage","scaling":"spell","display":"","parts":[]}],"id":4},{"display_name":"Heavy Impact","desc":"After using Charge, violently crash down into the ground and deal damage","base_abil":4,"parents":[8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":1,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Heavy Impact","cost":0,"multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Contact Damage","display":"Contact Damage","hits":{"Heavy Impact":1}}],"id":5},{"display_name":"Vehement","desc":"For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%)","archetype":"Fallen","archetype_req":0,"parents":[4],"dependencies":[],"blockers":[7],"cost":1,"display":{"row":6,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"mdPct"},{"type":"stat","name":"mdRaw"}],"output":{"type":"stat","name":"spd"},"scaling":[2,2],"max":20}],"id":6},{"display_name":"Tougher Skin","desc":"Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)","archetype":"Paladin","archetype_req":0,"parents":[4],"dependencies":[],"blockers":[6],"cost":1,"display":{"row":6,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"defMult.Base","value":5}]},{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"hprRaw"},{"type":"stat","name":"hprPct"}],"output":{"type":"stat","name":"hpBonus"},"scaling":[10,10],"max":100}],"id":7},{"display_name":"Uppercut","desc":"Rocket enemies in the air and deal massive damage","parents":[6,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":2,"icon":"node_warrior"},"properties":{"aoe":3,"range":5},"effects":[{"type":"replace_spell","name":"Uppercut","cost":45,"base_spell":3,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Uppercut","multipliers":[200,40,40,0,0,0]},{"name":"Total Damage","hits":{"Uppercut":1}}]}],"id":8},{"display_name":"Cheaper Charge","desc":"Reduce the Mana cost of Charge","base_abil":4,"parents":[8,10],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":9},{"display_name":"War Scream","desc":"Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies","parents":[7,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":6,"icon":"node_warrior"},"properties":{"duration":30,"aoe":12,"defense_bonus":10},"effects":[{"type":"replace_spell","name":"War Scream","cost":35,"base_spell":4,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"War Scream","multipliers":[50,0,0,0,50,0]},{"name":"Total Damage","hits":{"War Scream":1}}]}],"id":10},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases base damage from all Earth attacks","archetype":"Fallen","archetype_req":0,"parents":[8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":11},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases base damage from all Thunder attacks","archetype":"Fallen","archetype_req":0,"parents":[8,14,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":12},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases base damage from all Water attacks","archetype":"Battle Monk","archetype_req":0,"parents":[9,12,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":11,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":13},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Battle Monk","archetype_req":0,"parents":[10,12,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":14},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Paladin","archetype_req":0,"parents":[10],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":15},{"display_name":"Quadruple Bash","desc":"Bash will hit 4 times at an even larger range","archetype":"Fallen","archetype_req":0,"base_abil":0,"parents":[11,17],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":0,"icon":"node_1"},"properties":{"range":6},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Hit":2}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","multipliers":[-20,0,0,0,0,0]}],"id":16},{"display_name":"Fireworks","desc":"Mobs hit by Uppercut will explode mid-air and receive additional damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[12,16],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fireworks","multipliers":[80,0,20,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Fireworks":1}}],"id":17},{"display_name":"Half-Moon Swipe","desc":"Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water","archetype":"Battle Monk","archetype_req":1,"base_abil":8,"parents":[13],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":13,"col":4,"icon":"node_1"},"properties":{"range":4},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","cost":-10,"multipliers":[-70,0,0,30,0,0]}],"id":18},{"display_name":"Flyby Jab","desc":"Damage enemies in your way when using Charge","base_abil":4,"parents":[14,20],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":6,"icon":"node_1"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Flyby Jab","multipliers":[20,0,0,0,0,40]},{"type":"add_spell_prop","base_spell":2,"target_part":"Contact Damage","display":"Contact Damage","hits":{"Flyby Jab":1}}],"id":19},{"display_name":"Flaming Uppercut","desc":"Uppercut will light mobs on fire, dealing damage every 0.6 seconds","archetype":"Paladin","archetype_req":0,"base_abil":8,"parents":[15,19],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":12,"col":8,"icon":"node_1"},"properties":{"duration":3,"tick":0.6},"effects":[{"type":"replace_spell","name":"Flaming Uppercut","base_spell":8,"display":"DPS","parts":[{"name":"Damage Tick","multipliers":[0,0,0,0,50,0]},{"name":"DPS","hits":{"Damage Tick":1.6666666666666667}},{"name":"Total Damage","hits":{"Damage Tick":5}}]}],"id":20},{"display_name":"Iron Lungs","desc":"War Scream deals more damage","archetype":"Paladin","archetype_req":0,"base_abil":10,"parents":[19,20],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"War Scream","cost":0,"multipliers":[30,0,0,0,0,30]}],"id":21},{"display_name":"Generalist","desc":"After casting 3 different spells in a row, your next spell will cost 5 mana","archetype":"Battle Monk","archetype_req":3,"parents":[23],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":2,"icon":"node_3"},"properties":{},"effects":[],"id":22},{"display_name":"Counter","desc":"When dodging a nearby enemy attack, get 30% chance to instantly attack back","archetype":"Battle Monk","archetype_req":0,"parents":[18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":4,"icon":"node_1"},"properties":{"chance":30},"effects":[{"type":"replace_spell","name":"Counter","base_spell":5,"display":"Counter Damage","parts":[{"name":"Counter Damage","multipliers":[60,0,20,0,0,20]}]}],"id":23},{"display_name":"Mantle of the Bovemists","desc":"When casting War Scream, create a holy shield around you that reduces all incoming damage by 70% for 3 hits (20s cooldown)","archetype":"Paladin","archetype_req":3,"parents":[21],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":15,"col":7,"icon":"node_3"},"properties":{"mantle_charge":3},"effects":[{"type":"raw_stat","toggle":"Activate Mantle","bonuses":[{"type":"stat","name":"defMult.Mantle","value":70}]}],"id":24},{"display_name":"Bak'al's Grasp","desc":"After casting War Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)","archetype":"Fallen","archetype_req":2,"parents":[16,17],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":16,"col":1,"icon":"node_3"},"properties":{"cooldown":15},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","slider_max":100,"slider_step":1,"output":{"type":"stat","name":"damRaw"},"max":120,"scaling":[2]}],"id":25},{"display_name":"Spear Proficiency 2","desc":"Improve your Main Attack's damage and range w/ spear","base_abil":999,"parents":[25,27],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":0,"icon":"node_0"},"properties":{"melee_range":1},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[5,0,0,0,0,0]}],"id":26},{"display_name":"Cheaper Uppercut","desc":"Reduce the Mana Cost of Uppercut","base_abil":8,"parents":[26,28,23],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":27},{"display_name":"Aerodynamics","desc":"During Charge, you can steer and change direction","archetype":"Battle Monk","archetype_req":0,"base_abil":4,"parents":[27,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":28},{"display_name":"Provoke","desc":"Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream","base_abil":10,"parents":[28,24],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":29},{"display_name":"Precise Strikes","desc":"+30% Critical Hit Damage","parents":[27,26],"dependencies":[],"blockers":[],"cost":1,"display":{"row":18,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"critDamPct","value":30}]}],"id":30},{"display_name":"Air Shout","desc":"War Scream will fire a projectile that can go through walls and deal damage multiple times","base_abil":10,"parents":[28,29],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":18,"col":6,"icon":"node_1"},"properties":{"attackRate":2},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Air Shout","multipliers":[40,0,0,0,0,10]}],"id":31},{"display_name":"Enraged Blow","desc":"While Corriupted, every 1% of Health you lose will increase your damage by +3% (Max 300%)","archetype":"Fallen","archetype_req":0,"base_abil":25,"parents":[26],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":20,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider_name":"Corrupted","slider":true,"output":{"type":"stat","name":"damMult.Enraged"},"scaling":[3]}],"id":32},{"display_name":"Flying Kick","desc":"When using Charge, mobs hit will halt your momentum and get knocked back","archetype":"Battle Monk","archetype_req":1,"base_abil":4,"parents":[27,34],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":3,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick","multipliers":[150,0,0,20,0,30]},{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick Max Damage","hits":{"Flying Kick":1},"display":"Flying Kick Max Damage"}],"id":33},{"display_name":"Stronger Mantle","desc":"Add +2 additional charges to Mantle of the Bovemists","archetype":"Paladin","archetype_req":0,"base_abil":24,"parents":[35,33],"dependencies":[24],"blockers":[],"cost":1,"display":{"row":20,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":24,"name":"mantle_charge","value":2}]}],"id":34},{"display_name":"Manachism","desc":"If you receive a hit that's less than 5% of your max HP, gain 10 Mana (1s Cooldown)","archetype":"Paladin","archetype_req":3,"parents":[34,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":8,"icon":"node_2"},"properties":{"cooldown":1},"effects":[],"id":35},{"display_name":"Boiling Blood","desc":"Bash leaves a trail of boiling blood behind its first explosion, slowing down and damaging enemies above it every 0.4 seconds","base_abil":0,"parents":[32,37],"dependencies":[],"blockers":[],"cost":2,"display":{"row":22,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Boiling Blood","cost":0,"multipliers":[25,0,0,0,5,0]}],"id":36},{"display_name":"Ragnarokkr","desc":"War Scream become deafening, increasing its duration and giving damage bonus to players","archetype":"Fallen","archetype_req":0,"base_abil":10,"parents":[36,33],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":22,"col":2,"icon":"node_2"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":10},{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"duration","value":90}]}],"id":37},{"display_name":"Ambidextrous","desc":"Increase your chance to attack with Counter by +30%","base_abil":23,"parents":[33,34,39],"dependencies":[23],"blockers":[],"cost":1,"display":{"row":22,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":23,"name":"chance","value":30}]}],"id":38},{"display_name":"Burning Heart","desc":"For every 100 Health Bonus you have from item IDs, gain +2% Fire Damage (Max 100%)","archetype":"Paladin","archetype_req":0,"parents":[38,40],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"hpBonus"}],"output":{"type":"stat","name":"fDamPct"},"scaling":[0.02],"max":100}],"id":39},{"display_name":"Stronger Bash","desc":"Increase the damage of Bash","base_abil":0,"parents":[39,35],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","multipliers":[30,0,0,0,0,0]}],"id":40},{"display_name":"Intoxicating Blood","desc":"After leaving Corrupted, gain 2% of the health lost back for each enemy killed while Corrupted","archetype":"Fallen","archetype_req":5,"base_abil":25,"parents":[37,36],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":23,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":41},{"display_name":"Comet","desc":"After being hit by Fireworks, enemies will crash into the ground and receive more damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[37],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":24,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Comet","cost":0,"multipliers":[80,20,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","cost":0,"hits":{"Comet":1}}],"id":42},{"display_name":"Collide","desc":"Mobs thrown into walls from Flying Kick will explode and receive additonal damage","archetype":"Battle Monk","archetype_req":4,"base_abil":4,"parents":[38,39],"dependencies":[33],"blockers":[],"cost":2,"display":{"row":23,"col":5,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Collide","cost":0,"multipliers":[150,0,0,0,50,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick Max Damage","hits":{"Collide":1}}],"id":43},{"display_name":"Rejuvenating Skin","desc":"Regain back 30% of the damage you take as healing over 30s","archetype":"Paladin","archetype_req":5,"parents":[39,40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":23,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":44},{"display_name":"Uncontainable Corruption","desc":"Reduce the cooldown of Bak'al's Grasp by -5s, and increase the raw damage gained for every 2% of health lost by +1","base_abil":25,"parents":[36,46],"dependencies":[25],"blockers":[],"cost":1,"display":{"row":26,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","output":{"type":"stat","name":"damRaw"},"scaling":[0.5]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":25,"name":"cooldown","value":-5}]}],"id":45},{"display_name":"Radiant Devotee","desc":"For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)","archetype":"Battle Monk","archetype_req":1,"parents":[47,45],"dependencies":[],"blockers":[],"cost":1,"display":{"row":26,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","inputs":[{"type":"stat","name":"ref"}],"output":{"type":"stat","name":"mr"},"scaling":[0.25],"max":10}],"id":46},{"display_name":"Whirlwind Strike","desc":"Uppercut will create a strong gust of air, launching you upward with enemies (Hold shift to stay grounded)","archetype":"Battle Monk","archetype_req":5,"base_abil":8,"parents":[38,46],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":26,"col":4,"icon":"node_1"},"properties":{"range":2},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","multipliers":[0,0,0,0,0,50]}],"id":47},{"display_name":"Mythril Skin","desc":"Gain +5% Base Resistance and become immune to knockback","archetype":"Paladin","archetype_req":6,"parents":[44],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"defMult.Base","value":5}]}],"id":48},{"display_name":"Armour Breaker","desc":"While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[45,46],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":27,"col":1,"icon":"node_2"},"properties":{"duration":8},"effects":[{"type":"raw_stat","toggle":"Activate Armor Breaker","bonuses":[{"type":"stat","name":"damMult.ArmorBreaker","value":30}]}],"id":49},{"display_name":"Shield Strike","desc":"When your Mantle of the Bovemist loses all charges, deal damage around you for each Mantle individually lost","archetype":"Paladin","archetype_req":0,"base_abil":24,"parents":[48,51],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":6,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Shield Strike","base_spell":6,"display":"Damage per Shield","parts":[{"name":"Damage per Shield","multipliers":[60,0,20,0,0,0]}]}],"id":50},{"display_name":"Sparkling Hope","desc":"Everytime you heal 5% of your max health, deal damage to all nearby enemies","archetype":"Paladin","archetype_req":0,"parents":[48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":8,"icon":"node_2"},"properties":{"aoe":6},"effects":[{"type":"replace_spell","name":"Sparkling Hope","base_spell":7,"display":"Damage Tick","parts":[{"name":"Damage Tick","multipliers":[10,0,5,0,0,0]}]}],"id":51},{"display_name":"Massive Bash","desc":"While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)","archetype":"Fallen","archetype_req":8,"base_abil":25,"parents":[53,45],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","output":{"type":"prop","abil":0,"name":"aoe"},"scaling":[0.3333333333333333],"max":10}],"id":52},{"display_name":"Tempest","desc":"War Scream will ripple the ground and deal damage 3 times in a large area","archetype":"Battle Monk","archetype_req":0,"base_abil":10,"parents":[52,54],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_1"},"properties":{"aoe":16},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Tempest","multipliers":[30,10,0,0,0,10]},{"type":"add_spell_prop","base_spell":4,"target_part":"Tempest Total Damage","hits":{"Tempest":3}},{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Tempest":3}}],"id":53},{"display_name":"Spirit of the Rabbit","desc":"Reduce the Mana cost of Charge and increase your Walk Speed by +20%","archetype":"Battle Monk","archetype_req":5,"base_abil":4,"parents":[53,47],"dependencies":[],"blockers":[],"cost":1,"display":{"row":28,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5},{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":20}]}],"id":54},{"display_name":"Massacre","desc":"While Corrupted, if your effective attack speed is Slow or lower, hitting an enemy with your Main Attack will add +1% to your Corrupted bar","archetype":"Fallen","archetype_req":5,"base_abil":999,"parents":[53,52],"dependencies":[],"blockers":[],"cost":2,"display":{"row":29,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":55},{"display_name":"Axe Kick","desc":"Increase the damage of Uppercut, but also increase its mana cost","base_abil":8,"parents":[53,54],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","cost":10,"multipliers":[100,0,0,0,0,0]}],"id":56},{"display_name":"Radiance","desc":"Bash will buff your allies' positive IDs. (15s Cooldown)","archetype":"Paladin","archetype_req":2,"base_abil":0,"parents":[54,58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":29,"col":5,"icon":"node_2"},"properties":{"cooldown":15},"effects":[],"id":57},{"display_name":"Cheaper Bash 2","desc":"Reduce the Mana cost of Bash","base_abil":0,"parents":[57,50,51],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":58},{"display_name":"Cheaper War Scream","desc":"Reduce the Mana cost of War Scream","base_abil":10,"parents":[52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":59},{"display_name":"Discombobulate","desc":"Every time you hit an enemy, briefly increase your elemental damage dealt to them by +3 (Additive, Max +80). This bonus decays -5 every second","archetype":"Battle Monk","archetype_req":11,"parents":[62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":2,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Hits dealt","slider_max":27,"output":[{"type":"stat","name":"eDamAddMin"},{"type":"stat","name":"eDamAddMax"},{"type":"stat","name":"tDamAddMin"},{"type":"stat","name":"tDamAddMax"},{"type":"stat","name":"wDamAddMin"},{"type":"stat","name":"wDamAddMax"},{"type":"stat","name":"fDamAddMin"},{"type":"stat","name":"fDamAddMax"},{"type":"stat","name":"aDamAddMin"},{"type":"stat","name":"aDamAddMax"}],"scaling":[3],"max":80}],"id":60},{"display_name":"Thunderclap","desc":"Bash will cast at the player's position and gain additional AoE.\n\n All elemental conversions become Thunder","archetype":"Battle Monk","archetype_req":8,"parents":[62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":5,"icon":"node_1"},"properties":{},"effects":[{"type":"convert_spell_conv","target_part":"all","base_spell":1,"conversion":"Thunder"},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"name":"aoe","value":3}]}],"id":61},{"display_name":"Cyclone","desc":"After casting War Scream, envelop yourself with a vortex that damages nearby enemies every 0.5s","archetype":"Battle Monk","archetype_req":0,"parents":[54],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":4,"icon":"node_1"},"properties":{"aoe":4,"duration":20},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Cyclone","multipliers":[10,0,0,0,5,10]},{"type":"add_spell_prop","base_spell":4,"target_part":"Cyclone Total Damage","hits":{"Cyclone":40}}],"id":62},{"display_name":"Second Chance","desc":"When you receive a fatal blow, survive and regain 30% of your Health (10m Cooldown)","archetype":"Paladin","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":63},{"display_name":"Blood Pact","desc":"If you do not have enough mana to cast a spell, spend health instead (0.6% health per mana)","archetype":"Fallen","archetype_req":10,"parents":[59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_3"},"properties":{"health_cost":0.6},"effects":[],"id":64},{"display_name":"Brink of Madness","desc":"If your health is 25% full or less, gain +40% Resistance","parents":[64,66],"dependencies":[],"blockers":[],"cost":2,"display":{"row":35,"col":4,"icon":"node_2"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Brink","bonuses":[{"type":"stat","name":"defMult.Brink","value":40}]}],"id":65},{"display_name":"Cheaper Uppercut 2","desc":"Reduce the Mana cost of Uppercut","base_abil":8,"parents":[63,65],"dependencies":[],"blockers":[],"cost":1,"display":{"row":35,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":66},{"display_name":"Martyr","desc":"When you receive a fatal blow, all nearby allies become invincible","archetype":"Paladin","archetype_req":0,"parents":[63],"dependencies":[],"blockers":[],"cost":2,"display":{"row":35,"col":8,"icon":"node_1"},"properties":{"duration":3,"aoe":12},"effects":[],"id":67},{"display_name":"Haemorrhage","desc":"Reduce Blood Pact's health cost. (0.3% health per mana)","archetype":"Fallen","archetype_req":0,"base_abil":64,"parents":[64],"dependencies":[64],"blockers":[],"cost":2,"display":{"row":35,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":64,"name":"health_cost","value":-0.3}]}],"id":68}],"Mage":[{"display_name":"Meteor","desc":"Summon a slow but powerful meteor from the sky, dealing massive damage in a large area","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_mage"},"properties":{"aoe":5,"range":18},"effects":[{"type":"replace_spell","name":"Meteor","cost":55,"base_spell":3,"display":"Total Damage","parts":[{"name":"Meteor Damage","multipliers":[300,100,0,0,0,0]},{"name":"Total Damage","hits":{"Meteor Damage":1}}]}],"id":0},{"display_name":"Teleport","desc":"Instantly teleport in the direction you're facing","parents":[4],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":4,"icon":"node_mage"},"properties":{"range":12},"effects":[{"type":"replace_spell","name":"Teleport","cost":25,"base_spell":2,"display":"","parts":[]}],"id":1},{"display_name":"Heal","desc":"Heal yourself and nearby allies in a large area around you. (When healing an ally, you cannot heal more than 30% of their max health)","parents":[14,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":2,"icon":"node_mage"},"properties":{"aoe":5},"effects":[{"type":"replace_spell","name":"Heal","cost":35,"base_spell":1,"display":"Heal","parts":[{"name":"Heal","power":0.1}]}],"id":2},{"display_name":"Ice Snake","desc":"Summon a fast-moving ice snake that reduces your enemies' speed and damage them.","parents":[13,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":6,"icon":"node_mage"},"properties":{"range":18,"effects":40,"duration":3},"effects":[{"type":"replace_spell","name":"Ice Snake","cost":35,"base_spell":4,"display":"Ice Snake Damage","parts":[{"name":"Ice Snake Damage","multipliers":[70,0,0,30,0,0]}]}],"id":3},{"display_name":"Shooting Star","desc":"Drastically increase the speed of your Meteor ability.","base_abil":3,"parents":[5],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":4},{"display_name":"Wand Proficiency I","desc":"Improve your Main Attack's damage and range when using a wand.","base_abil":999,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"mdPct","value":5}]}],"id":5},{"display_name":"Cheaper Meteor","desc":"Reduce the Mana cost of Meteor.","base_abil":0,"parents":[5],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-10}],"id":6},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases your base damage from all Earth attacks","archetype":"Arcanist","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":7},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases your base damage from all Thunder attacks","archetype":"Riftwalker","archetype_req":0,"parents":[2,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":8},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases your base damage from all Water attacks","archetype":"Light Bender","archetype_req":0,"parents":[12,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":11,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":9},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Riftwalker","archetype_req":0,"parents":[2],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":10},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Arcanist","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":11},{"display_name":"Cheaper Teleport","desc":"Reduce the Mana cost of Teleport.","base_abil":1,"parents":[2,3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":12},{"display_name":"Wisdom","desc":"For every 2% or 2 Raw Spell Damage you have from items, gain +1/5s mana regen (Max 5/5s)","archetype":"Arcanist","archetype_req":0,"parents":[1],"dependencies":[],"blockers":[14],"cost":1,"display":{"row":6,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"sdPct"},{"type":"stat","name":"sdRaw"}],"output":{"type":"stat","name":"mr"},"scaling":[0.5,0.5],"max":5}],"id":13},{"display_name":"Wand Proficiency II","desc":"Improve your Main Attack's damage and range when using a wand.","archetype":"Riftwalker","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"mdPct","value":5}]}],"id":14},{"display_name":"Wind Slash","desc":"When using Teleport, slash through the air and deal damage to enemies you pierce.","archetype":"Riftwalker","base_abil":1,"parents":[10,16],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":12,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Wind Slash","base_spell":2,"multipliers":[50,0,0,0,0,50]},{"type":"add_spell_prop","target_part":"Total Damage","base_spell":2,"display":"Total Damage","hits":{"Wind Slash":1}}],"id":15},{"display_name":"Thunderstorm","desc":"After casting Meteor, summon 3 lightning strikes and deal additional damage","base_abil":0,"parents":[15,8],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":12,"col":2,"icon":"node_1"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","target_part":"Lightning Damage","base_spell":3,"multipliers":[30,0,15,0,0,0]},{"type":"add_spell_prop","target_part":"Total Damage","base_spell":3,"hits":{"Lightning Damage":3}}],"id":16},{"display_name":"Stronger Meteor","desc":"Increase the damage of Meteor.","base_abil":0,"archetype":"Arcanist","archetype_req":2,"parents":[18],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Meteor Damage","behavior":"modify","multipliers":[30,90,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Lightning Damage","behavior":"modify","multipliers":[30,90,0,0,0,0]}],"id":17},{"display_name":"Burning Sigil","desc":"Meteor will leave a sigil that damages enemies every 0.4s.","base_abil":0,"parents":[11,7],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":7,"icon":"node_1"},"properties":{"aoe":7,"duration":8},"effects":[{"type":"replace_spell","name":"Burning Sigil","base_spell":6,"display":"DPS","parts":[{"name":"Tick Damage","multipliers":[15,0,0,0,25,0]},{"name":"DPS","hits":{"Tick Damage":2.5}},{"name":"Total Burn Damage","hits":{"Tick Damage":20}}]}],"id":18},{"display_name":"Sunshower","desc":"Heal emit a strong light, damaging nearby enemies.","archetype":"Light Bender","archetype_req":0,"base_abil":2,"parents":[9],"dependencies":[2],"blockers":[22],"cost":2,"display":{"row":13,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Sunshower Damage","multipliers":[70,0,0,30,0,0]}],"id":19},{"display_name":"Windsweeper","desc":"Your Main Attack will add +1 Winded to enemies you hit. (Max 5, 0.5s cooldown) Ice Snake will deal additional damage to enemies for every Winded they have","archetype":"Riftwalker","archetype_req":3,"parents":[15,16],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":15,"col":1,"icon":"node_3"},"properties":{"max":5},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":{"type":"stat","name":"nConvBase:4.Ice Snake Damage"},"scaling":[20],"slider_step":1,"slider_max":5},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":{"type":"stat","name":"wConvBase:4.Ice Snake Damage"},"scaling":[10]}],"id":20},{"display_name":"Ophanim","desc":"When casting Meteor, instead summon 2 orbs of light with 200 Health that will attack when you use your Main Attack. When they damage an enemy, they lose 20% of their Health. They can be healed back.","archetype":"Light Bender","archetype_req":2,"parents":[19],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":4,"icon":"node_3"},"properties":{"health":200},"effects":[{"type":"replace_spell","name":"Ophanim","base_spell":3,"display":"Per Melee (max)","parts":[{"name":"Per Orb","multipliers":[50,0,30,20,0,0]},{"name":"Per Melee (max)","hits":{"Per Orb":2}}]},{"type":"add_spell_prop","base_spell":3,"cost":30}],"id":21},{"display_name":"Arcane Transfer","desc":"Meteor and Ice Snake will add +5 Mana to a Mana Bank for every aggressive enemy you hit. Heal will now transfer the content of your Mana Bank into usable Mana instead of healing.","archetype":"Arcanist","archetype_req":2,"parents":[18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":7,"icon":"node_3"},"properties":{"bank":90},"effects":[{"type":"replace_spell","name":"Arcane Transfer","base_spell":1,"parts":[],"display":""}],"id":22},{"display_name":"Cheaper Heal","desc":"Reduce the Mana cost of Heal.","base_abil":2,"parents":[20,24],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":23},{"display_name":"Purification","desc":"Heal and Arcane Transfer will purify you of all negative effects and fire. (3s Cooldown)","base_abil":1,"parents":[21,23,25],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":4,"icon":"node_2"},"properties":{},"effects":[],"id":24},{"display_name":"Sentient Snake","desc":"Ice Snake will follow the direction you're facing, allowing you to control it.","base_abil":3,"parents":[22,24],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":17,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":25},{"display_name":"Eye Piercer","desc":"Teleport will blind enemies, confusing them for a short amount of time.","base_abil":1,"parents":[23],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":18,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":26},{"display_name":"Breathless","desc":"Meteor will deal additional damage to enemies for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[23,24],"dependencies":[20],"blockers":[],"cost":2,"display":{"row":18,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"nConvBase:3.Meteor Damage"},{"type":"stat","name":"nConvBase:3.Meteor Damage"},{"type":"stat","name":"nConvBase:3.Lightning Damage"}],"scaling":[15]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"eConvBase:3.Meteor Damage"},{"type":"stat","name":"eConvBase:3.Per Orb"},{"type":"stat","name":"eConvBase:3.Lightning Damage"}],"scaling":[10]}],"id":27},{"display_name":"Larger Heal","desc":"Increase your Heal's range.","base_abil":1,"archetype":"Light Bender","archetype_req":0,"parents":[24,25],"dependencies":[2],"blockers":[22],"cost":1,"display":{"row":18,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":2,"name":"aoe","value":2}]}],"id":28},{"display_name":"Larger Mana Bank","desc":"Increase your maximum Mana Bank by +30.","base_abil":1,"archetype":"Arcanist","archetype_req":0,"parents":[25],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":18,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":22,"name":"bank","value":30}]}],"id":29},{"display_name":"Cheaper Ice Snake","desc":"Reduce the Mana cost of Ice Snake.","base_abil":3,"parents":[26,32],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":30},{"display_name":"Cheaper Teleport II","desc":"Reduce the Mana cost of Teleport.","base_abil":1,"parents":[32,24],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":31},{"display_name":"Fortitude","desc":"After healing 120% of your max health within 10s, apply a damage bonus to each player you've healed. (15s Cooldown)","base_abil":2,"archetype":"Light Bender","archetype_req":0,"parents":[30,31],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":2,"icon":"node_2"},"properties":{"duration":5},"effects":[],"id":32},{"display_name":"Pyrokinesis","desc":"When your Mana Bank reaches 30, your Main Attack will stop and explode when it hits an enemy. (Damage is dealt as Main Attack Damage)","base_abil":4,"archetype":"Arcanist","archetype_req":4,"parents":[25],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":7,"icon":"node_2"},"properties":{},"__TODO":"replace_spell pyrokinesis damage","effects":[],"id":33},{"display_name":"Seance","desc":"For every 5/3s Lifesteal you have from items, gain 1% Spell Damage (Max 50%)","archetype":"","archetype_req":0,"parents":[33,36],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"ls"}],"output":{"type":"stat","name":"sdPct"},"scaling":[0.2],"max":50}],"id":34},{"display_name":"Blink","desc":"Teleport will trigger 2 times in quick successions","base_abil":1,"archetype":"Riftwalker","archetype_req":0,"parents":[32,30],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":21,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":1,"name":"range","value":-4}]},{"type":"add_spell_prop","behavior":"modify","target_part":"Total Damage","base_spell":2,"hits":{"Wind Slash":1,"Explosion Damage":1}}],"id":35},{"display_name":"Snake Nest","desc":"Ice Snake will summon 3 snakes.","base_abil":3,"parents":[34,31,40],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":22,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":36},{"display_name":"Arcane Restoration","desc":"Pyrokinesis will add +1 Mana every 1s to your Mana Bank when hitting an aggressive enemy.","base_abil":999,"archetype":"Arcanist","archetype_req":0,"parents":[34,36],"dependencies":[33],"blockers":[],"cost":2,"display":{"row":23,"col":6,"icon":"node_1"},"properties":{"duration":4},"effects":[],"id":37},{"display_name":"Fluid Healing","desc":"For every 1% Water Damage Bonus you have, buff Heal's healing power by +0.3%.","archetype":"Light Bender","archetype_req":0,"base_abil":2,"parents":[40,39],"dependencies":[],"blockers":[],"cost":2,"display":{"row":23,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"round":false,"inputs":[{"type":"stat","name":"wDamPct"}],"output":{"type":"stat","name":"healPct"},"scaling":[0.3]}],"id":38},{"display_name":"Transonic Warp","desc":"Teleport will deal additional damage to enemies for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":5,"parents":[30],"dependencies":[3,20],"blockers":[],"cost":2,"display":{"row":23,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"nConvBase:2.Wind Slash"},{"type":"stat","name":"nConvBase:2.Explosion Damage"}],"scaling":[20]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"tConvBase:2.Wind Slash"},{"type":"stat","name":"tConvBase:2.Explosion Damage"}],"scaling":[5]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"aConvBase:2.Wind Slash"},{"type":"stat","name":"aConvBase:2.Explosion Damage"}],"scaling":[5]}],"id":39},{"display_name":"Healthier Ophanim I","desc":"Increase the health of your orbs from Ophanim by +800 and reduce the damage they take when hitting an enemy by -5%.","archetype":"Light Bender","archetype_req":0,"base_abil":21,"parents":[32,31],"dependencies":[21],"blockers":[],"cost":1,"display":{"row":22,"col":3,"icon":"node_0"},"properties":{},"effects":[],"id":40},{"display_name":"Orphion's Pulse","desc":"Heal will trigger 2 more times, increasing the overall healing.","archetype":"Light Bender","base_abil":2,"parents":[40,36],"dependencies":[2],"blockers":[22],"cost":2,"display":{"row":23,"col":4,"icon":"node_1"},"properties":{"aoe":5},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Second and Third Pulses","power":0.15},{"type":"add_spell_prop","base_spell":1,"display":"Total Heal","target_part":"Total Heal","hits":{"Heal":1,"Second and Third Pulses":2}}],"id":41},{"display_name":"Diffusion","desc":"If you kill an enemy with Winded on them, the leftover Winded will spread to nearby enemies.","archetype":"Riftwalker","archetype_req":6,"base_abil":20,"parents":[39,38],"dependencies":[20],"blockers":[],"cost":2,"display":{"row":25,"col":1,"icon":"node_3"},"properties":{"aoe":5},"effects":[],"id":42},{"display_name":"Lightweaver","desc":"After healing 50% of your max health within 10s, summon a rotating orb that damages all enemies it touches for 20s. (Max 3 Orbs)","archetype":"Light Bender","archetype_req":7,"parents":[41],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Lightweaver","base_spell":5,"display":"Orb Damage","parts":[{"name":"Single Orb","type":"damage","multipliers":[30,0,0,0,20,0]},{"name":"Orb Damage","type":"total","hits":{"Single Orb":3}}]}],"id":43},{"display_name":"Arcane Speed","desc":"After casting Heal or Arcane Transfer, gain +80% speed for 3s. (8s Cooldown)","base_abil":2,"parents":[43,45],"dependencies":[2],"blockers":[],"cost":2,"display":{"row":25,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":44},{"display_name":"Larger Mana Bank II","desc":"Increase your maximum Mana Bank by +30.","base_abil":1,"archetype":"Arcanist","archetype_req":0,"parents":[34,44],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":25,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":45},{"display_name":"Psychokinesis","desc":"Meteor will launch directly from you as a slow projectile.","base_abil":3,"archetype":"Arcanist","archetype_req":5,"parents":[45,44],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":26,"col":7,"icon":"node_1"},"properties":{"range":20},"effects":[],"id":46},{"display_name":"More Winded","desc":"Incrase your maximum Winded by +5.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[42],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":26,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":20,"name":"max","value":5}]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","slider_max":5}],"id":47},{"display_name":"Cheaper Ice Snake II","desc":"Reduce the Mana cost of Ice Snake.","base_abil":3,"parents":[42,52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":27,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":48},{"display_name":"Cheaper Meteor II","desc":"Reduce the Mana cost of Meteor.","base_abil":0,"parents":[52,43,44],"dependencies":[],"blockers":[],"cost":1,"display":{"row":27,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":49},{"display_name":"Chaos Explosion","desc":"When your Mana Bank reaches 120, casting Arcane Transfer will rapidly unleash the last 3 spells you've cast in order.","base_abil":22,"archetype":"Arcanist","archetype_req":8,"parents":[45],"dependencies":[22],"blockers":[],"cost":2,"display":{"row":27,"col":8,"icon":"node_3"},"properties":{},"effects":[],"id":50},{"display_name":"Arcane Power","desc":"Meteor and Ice Snake will add +2 Mana to your Mana Bank for each aggressive mob you hit.","base_abil":22,"archetype":"Arcanist","archetype_req":0,"parents":[56],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":29,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":51},{"display_name":"Explosive Entrance","desc":"Deal Damage in an area on the location you Teleport to.","base_abil":1,"parents":[48,49],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":27,"col":3,"icon":"node_1"},"properties":{"aoe":3},"effects":[{"type":"add_spell_prop","target_part":"Explosion Damage","base_spell":2,"multipliers":[50,0,0,0,30,0]},{"type":"add_spell_prop","behavior":"modify","target_part":"Total Damage","base_spell":2,"hits":{"Explosion Damage":1}}],"id":52},{"display_name":"Gust","desc":"Ice Snake will add +1 Winded to enemies and deal more damage.","base_abil":3,"archetype":"Riftwalker","archetype_req":7,"parents":[48,52],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Ice Snake Damage","base_spell":4,"multipliers":[0,0,0,0,0,20]}],"id":53},{"display_name":"Time Dilation","desc":"When sprinting, create an area that increases the speed of all allies the longer they run in it. (Step out or stop running to cancel)","archetype":"Riftwalker","archetype_req":7,"parents":[48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_2"},"properties":{},"effects":[],"id":54},{"display_name":"Better Ophanim","desc":"Increase your maximum orbs from Ophanim by +1.","archetype":"Light Bender","archetype_req":0,"base_abil":21,"parents":[52,49],"dependencies":[21],"blockers":[],"cost":1,"display":{"row":28,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Per Melee (max)","hits":{"Per Orb":1}}],"id":55},{"display_name":"Arctic Snake","desc":"Ice Snake will freeze enemies completely for 2s.","base_abil":3,"parents":[50],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":28,"col":7,"icon":"node_1"},"properties":{},"effects":[],"id":56},{"display_name":"Devitalize","desc":"Enemies will deal -2% damage for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":5,"parents":[58,59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":57},{"display_name":"More Winded II","desc":"Incrase your maximum Winded by +5.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[54,59],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":31,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":20,"name":"max","value":5}]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","slider_max":5}],"id":58},{"display_name":"Dynamic Faith","desc":"For every 2% Sprint you have from items, gain +1% Thunder Damage (Max 100%)","parents":[58,61],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"sprint"}],"output":{"type":"stat","name":"tDamPct"},"scaling":[0.5],"max":100}],"id":59},{"display_name":"Divination","desc":"Increase your maximum orbs from Ophanim by +3 and reduce their damage.","base_abil":21,"archetype":"Light Bender","archetype_req":0,"parents":[59,61],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":32,"col":3,"icon":"node_2"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Per Orb","multipliers":[-30,0,-10,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Per Melee (max)","hits":{"Per Orb":3}}],"id":60},{"display_name":"Healthier Ophanim II","desc":"Increase the health of your orbs from Ophanim by +3000.","base_abil":21,"archetype":"Light Bender","archetype_req":0,"parents":[55],"dependencies":[40],"blockers":[],"cost":1,"display":{"row":31,"col":4,"icon":"node_0"},"properties":{},"effects":[],"id":61},{"display_name":"Sunflare","desc":"After healing 400% of your max health within 10s, your next Heal will make every nearby ally temporarily immune.","archetype":"Light Bender","archetype_req":12,"base_abil":2,"parents":[61],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":5,"icon":"node_3"},"properties":{"aoe":12,"duration":5},"effects":[],"id":62},{"display_name":"Larger Mana Bank III","desc":"Increase your maximum Mana Bank by +30.","archetype":"Arcanist","archetype_req":0,"base_abil":22,"parents":[56],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":31,"col":7,"icon":"node_0"},"properties":{},"effects":[],"id":63},{"display_name":"Arcane Overflow","desc":"Arcane Transfer will allow you to overflow your mana over its maximum limits.","archetype":"Arcanist","archetype_req":12,"base_abil":22,"parents":[63],"dependencies":[22],"blockers":[],"cost":2,"display":{"row":33,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":64},{"display_name":"Memory Recollection","desc":"Chaos Explosion will cast +2 spells.","archetype":"Arcanist","archetype_req":0,"base_abil":22,"parents":[64],"dependencies":[50],"blockers":[],"cost":1,"display":{"row":34,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":65},{"display_name":"Manastorm","desc":"If you have more than 100 Mana, casting a spell will give you +10 mana over 5s.","archetype":"Arcanist","archetype_req":1,"parents":[69,64,62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":66},{"display_name":"Better Lightweaver","desc":"Increase your Max Orbs by +2.","archetype":"Light Bender","archetype_req":0,"base_abil":43,"parents":[69,66],"dependencies":[43],"blockers":[],"cost":1,"display":{"row":35,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Orb Damage","base_spell":5,"hits":{"Single Orb":2}}],"id":67},{"display_name":"Timelock","desc":"Holding shift and casting Heal will absorb all Winded on nearby enemies and make you Timelocked. While Timelocked, your mana will not be depleted and you become immovable from outside forces. Enemies will recieve Winded damage from all absorbed stacks. (Max 30)","archetype":"Riftwalker","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":0,"icon":"node_3"},"properties":{},"effects":[],"id":68},{"display_name":"Cheaper Heal II","desc":"Reduce the Mana cost of Heal.","base_abil":2,"parents":[68,66],"dependencies":[],"blockers":[],"cost":1,"display":{"row":34,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":69}],"Assassin":[{"display_name":"Spin Attack","desc":"Slash rapidly around you, damaging enemies in a large area.","archetype":"","archetype_req":0,"parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Spin Attack","cost":45,"base_spell":1,"spell_type":"damage","scaling":"spell","use_atkspd":true,"display":"Spin Attack","parts":[{"name":"Spin Attack","type":"damage","multipliers":[120,0,30,0,0,0]}]}],"id":0},{"display_name":"Dagger Proficiency I","desc":"Increase your speed by +5% and improve your Main Attack’s damage when using a dagger.","archetype":"","archetype_req":0,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":5},{"type":"stat","name":"mdPct","value":5}]}],"id":1},{"display_name":"Cheaper Spin Attack","desc":"Reduce the Mana cost of Spin Attack.","archetype":"","archetype_req":0,"base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":2},{"display_name":"Double Spin","desc":"Spin Attack will activate a second time with a larger area of effect.","archetype":"","archetype_req":0,"base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Spin Attack":1},"display":"Total Damage"}],"id":3},{"display_name":"Poisoned Blade","desc":"For every 2% or 2 Raw Main Attack Damage you have from items, gain +5/3s Poison Damage (Max 50/3s)","archetype":"Shadestepper","archetype_req":0,"parents":[5],"dependencies":[],"blockers":[6],"cost":1,"display":{"row":7,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"mdPct"},{"type":"stat","name":"mdRaw"}],"output":[{"type":"stat","name":"poison"}],"scaling":[2.5,2.5],"max":50}],"id":4},{"display_name":"Dash","desc":"Dash in the direction you're facing.","archetype":"","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":7,"col":4,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Dash","cost":20,"base_spell":2,"display":"Total Damage","parts":[{"name":"None","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":5},{"display_name":"Double Slice","desc":"Your Main Attack will attack twice, but deal -40% damage per hit.","archetype":"Acrobat","archetype_req":0,"base_abil":999,"parents":[5],"dependencies":[],"blockers":[4],"cost":1,"display":{"row":7,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[-40,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"display":"Total Damage","target_part":"Total Damage","hits":{"Melee":2}}],"id":6},{"display_name":"Smoke Bomb","desc":"Throw a bomb that slouly emits smoke, damaging all enemies in it every 0.5s.","archetype":"","archetype_req":0,"parents":[4,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":2,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Smoke Bomb","cost":40,"base_spell":4,"display":"Total Damage","parts":[{"name":"Per Tick","type":"damage","multipliers":[25,5,0,0,0,5]},{"name":"Per Bomb","type":"total","hits":{"Per Tick":10}},{"name":"Total Damage","type":"total","hits":{"Per Bomb":1}}]}],"id":7},{"display_name":"Cheaper Dash","desc":"Reduce the Mana cost of Dash","archetype":"","archetype_req":0,"base_abil":5,"parents":[7,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":8},{"display_name":"Multihit","desc":"Unleash a rapid flurry of 8 hits to enemies facing you, dealing overwhelming damage","archetype":"","archetype_req":0,"parents":[6,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":6,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Multihit","cost":45,"base_spell":3,"display":"Total Damage","parts":[{"name":"Per Hit","type":"damage","multipliers":[25,0,0,10,0,0]},{"name":"Total Damage","type":"total","hits":{"Per Hit":8}}]}],"id":9},{"display_name":"Earth Mastery","desc":"Increases base damage from all Earth attacks","archetype":"Shadestepper","archetype_req":0,"base_abil":998,"parents":[7,11],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":10},{"display_name":"Thunder Mastery","desc":"Increases base damage from all Thunder attacks","archetype":"Shadestepper","archetype_req":0,"base_abil":998,"parents":[10,7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":11},{"display_name":"Fire Mastery","desc":"Increases base damage from all Fire attacks","archetype":"Trickster","archetype_req":0,"base_abil":998,"parents":[8,13],"dependencies":[],"blockers":[],"cost":1,"display":{"row":14,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":12},{"display_name":"Water Mastery","desc":"Increases base damage from all Water attacks","archetype":"Acrobat","archetype_req":0,"base_abil":998,"parents":[8,9,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":13},{"display_name":"Air Mastery","desc":"Increases base damage from all Air attacks","archetype":"Acrobat","archetype_req":0,"base_abil":998,"parents":[13,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":14},{"display_name":"Backstab","desc":"Multihit will deal a single devastating hit. If you strike the enemy from behind, deal double damage","archetype":"Shadestepper","archetype_req":2,"base_abil":9,"parents":[10,11],"dependencies":[9],"blockers":[44,16],"cost":2,"display":{"row":15,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Backstab","base_spell":3,"display":"Total Damage","parts":[{"name":"Per Hit","type":"damage","multipliers":[200,50,0,0,0,0]},{"name":"Total Damage","type":"total","hits":{"Per Hit":1}}]}],"id":15},{"display_name":"Fatality","desc":"Multihit will deal an additional final slash","archetype":"","archetype_req":0,"base_abil":9,"parents":[13,14],"dependencies":[9],"blockers":[15],"cost":2,"display":{"row":15,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fatality","multipliers":[100,0,0,0,0,50]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Fatality":1}}],"id":16},{"display_name":"Vanish","desc":"Dash will vanish you into the shadows and make you invisible to enemies (5s Cooldown). You cannot heal or gain mana while in that state (Attack or get hit to cancel)","archetype":"","archetype_req":0,"base_abil":5,"parents":[15,18],"dependencies":[5],"blockers":[],"cost":2,"display":{"row":16,"col":2,"icon":"node_2"},"properties":{"duration":5,"cooldown":5},"effects":[],"id":17},{"display_name":"Sticky Bomb","desc":"Smoke Bomb will stick to enemies and deal additional damage","archetype":"Trickster","archetype_req":0,"base_abil":7,"parents":[17,12],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":16,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Per Tick","multipliers":[0,0,0,0,10,0]}],"id":18},{"display_name":"Righting Reflex","desc":"When you hold shift while airborne, slowly glide and become immune to fall damage (Max 5s)","archetype":"Acrobat","archetype_req":0,"parents":[16],"dependencies":[],"blockers":[],"cost":2,"display":{"row":16,"col":6,"icon":"node_2"},"properties":{},"effects":[],"id":19},{"display_name":"Surprise Strike","desc":"While using Vanish, your next attack will deal +60% more damage for a single hit only","archetype":"Shadestepper","archetype_req":3,"base_abil":5,"parents":[17],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":19,"col":2,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Surprise Strike","bonuses":[{"type":"stat","name":"damMult.SurpriseStrike","value":60}]}],"id":20},{"display_name":"Mirror Image","desc":"After leaving Vanish, summon 3 Clones that will follow you and protect you. (20s Cooldown)","archetype":"Trickster","archetype_req":2,"base_abil":5,"parents":[18],"dependencies":[17],"blockers":[22],"cost":2,"display":{"row":19,"col":4,"icon":"node_3"},"properties":{"clone":3},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"defMult.Clone","value":80}]}],"id":21},{"display_name":"Lacerate","desc":"Spin Attack will lunge you forward, deal 3 strikes and lunge you forward again.","archetype":"Acrobat","archetype_req":2,"base_abil":0,"parents":[16],"dependencies":[],"blockers":[21],"cost":2,"display":{"row":19,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Lacerate","base_spell":1,"display":"Total Damage","parts":[{"name":"Per Hit","type":"damage","multipliers":[50,0,0,10,0,20]},{"name":"Total Damage","type":"total","hits":{"Per Hit":3}}]}],"id":22},{"display_name":"Silent Killer","desc":"After killing an enemy, reset Vanish's cooldown","archetype":"","archetype_req":0,"base_abil":5,"parents":[20],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":20,"col":1,"icon":"node_2"},"properties":{},"effects":[],"id":23},{"display_name":"Shenanigans","desc":"For every 2% Stealing you have from items, gain +1/3s Mana Steal (Max 8/3s)","archetype":"Trickster","archetype_req":0,"parents":[21],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"eSteal"}],"output":[{"type":"stat","name":"ms"}],"scaling":[0.5],"max":8}],"id":24},{"display_name":"Wall of Smoke","desc":"Smoke Bomb will throw +2 bombs, damaging more often in a larger area","archetype":"","archetype_req":0,"base_abil":7,"parents":[22],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":20,"col":8,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Per Bomb":2}},{"type":"add_spell_prop","base_spell":4,"target_part":"Per Tick","multipliers":[-20,0,0,0,0,0]}],"id":25},{"display_name":"Better Smoke Bomb","desc":"Increase the range and area of effect of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[23,27],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":22,"col":0,"icon":"node_0"},"properties":{},"effects":[],"id":26},{"display_name":"Shadow Travel","desc":"Vanish will increase your speed by +100%","archetype":"Shadestepper","archetype_req":0,"base_abil":5,"parents":[26,23,28],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":22,"col":2,"icon":"node_1"},"properties":{},"effects":[],"id":27},{"display_name":"Cheaper Multihit","desc":"Reduce the Mana cost of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[24,27,29],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":28},{"display_name":"Dagger Proficiency II","desc":"Increase your Main Attack's range and add +5 raw damage to all attacks","archetype":"","archetype_req":0,"base_abil":999,"parents":[28,25],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"damRaw","value":5}]}],"id":29},{"display_name":"Last Laugh","desc":"When losing a Clone, it will cast Spin Attack before dying","archetype":"Trickster","archetype_req":3,"base_abil":5,"parents":[27,28],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":23,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":30},{"display_name":"Cheaper Smoke Bomb","desc":"Reduce the Mana cost of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[26,32],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":25,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":31},{"display_name":"Blazing Powder","desc":"Spin Attack will blind enemies and deal additional damage","archetype":"","archetype_req":0,"base_abil":0,"parents":[31,27,28],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":3,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Spin Attack","multipliers":[0,0,0,0,20,0]}],"id":32},{"display_name":"Weightless","desc":"When you hit an enemy while airborne, gain +0.5 Mana (1.25+ blocks off the ground to be airborne)","archetype":"Acrobat","archetype_req":4,"parents":[28,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":7,"icon":"node_2"},"properties":{},"effects":[],"id":33},{"display_name":"Black Hole","desc":"Smoke Bomb will pull nearby enemies","archetype":"","archetype_req":0,"base_abil":7,"parents":[31,32],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":34},{"display_name":"Sandbagging","desc":"Anytime you get hit for less than 5% of your max hp, reduce your abilities cooldown by -2s. (1s Cooldown)","archetype":"Trickster","archetype_req":0,"parents":[32,36],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":35},{"display_name":"Hop","desc":"When you double tap jump, leap forward. (2s Cooldown)","archetype":"Acrobat","archetype_req":0,"parents":[35,33],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":6,"icon":"node_1"},"properties":{"cooldown":2},"effects":[],"id":36},{"display_name":"Dancing Blade","desc":"Deal damage to mobs you Dash through","archetype":"","archetype_req":0,"base_abil":5,"parents":[33],"dependencies":[5],"blockers":[],"cost":2,"display":{"row":26,"col":8,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Dancing Blade","multipliers":[80,0,0,0,0,20],"display":"Dancing Blade"}],"id":37},{"display_name":"Violent Vortex","desc":"If you deal more damage than 2x of your max health in a single hit, deal 20% of the damage to other nearby enemies","archetype":"Shadestepper","archetype_req":0,"parents":[31],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Violent Vortex","base_spell":5,"display":"Total Damage","parts":[{"name":"Total Damage","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":38},{"display_name":"Delirious Gas","desc":"While inside Smoke Bomb, increase your damage by +40% and gain Lure for 20s","archetype":"Trickster","archetype_req":4,"base_abil":7,"parents":[35],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":27,"col":3,"icon":"node_2"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Delirious Gas","bonuses":[{"type":"stat","name":"damMult.DeliriousGas","value":40}]}],"id":39},{"display_name":"Marked","desc":"Smoke Bomb will add +1 Mark to enemies it hits. (Max 5, 0.5s Cooldown) Marked enemies will take +10% damage for each mark they have.","archetype":"Shadestepper","archetype_req":5,"parents":[38],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":1,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","slider_step":1,"slider_max":5,"output":[{"type":"stat","name":"damMult.Marked"}],"scaling":[10]}],"id":40},{"display_name":"Echo","desc":"Your Clones will mimic your spells and abilities. While they are active, deal -60% damage.","archetype":"Trickster","archetype_req":6,"base_abil":5,"parents":[35,42],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":28,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"damMult.Echo","value":-60}]}],"id":41},{"display_name":"Shurikens","desc":"After using Dash, your next Main Attack will throw 3 shurikens","archetype":"Acrobat","archetype_req":0,"base_abil":5,"parents":[41,43],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":6,"icon":"node_2"},"properties":{},"effects":[{"type":"replace_spell","name":"Shurikens","base_spell":6,"display":"Total Damage","parts":[{"name":"Per Shuriken","type":"damage","multipliers":[90,0,0,0,10,0]},{"name":"Total Damage","type":"total","hits":{"Per Shuriken":3}}]}],"id":42},{"display_name":"Far Reach","desc":"Increase the range of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[37,42],"dependencies":[],"blockers":[],"cost":1,"display":{"row":28,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":43},{"display_name":"Stronger Multihit","desc":"Increases Multihit's amount of hits by +3","archetype":"","archetype_req":0,"base_abil":9,"parents":[41,42],"dependencies":[],"blockers":[15],"cost":1,"display":{"row":29,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Per Hit":3}}],"id":44},{"display_name":"Psithurism","desc":"Increase your Walk Speed by +20% and your Jump Height by +1","archetype":"Acrobat","archetype_req":5,"parents":[42,43],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":20},{"type":"stat","name":"jh","value":1}]}],"id":45},{"display_name":"Ambush","desc":"Increase Surprise Strike's damage by +40%","archetype":"Shadestepper","archetype_req":4,"base_abil":5,"parents":[40],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":31,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Surprise Strike","bonuses":[{"type":"stat","name":"damMult.SurpriseStrike","value":40}]}],"id":46},{"display_name":"Cheaper Dash 2","desc":"Reduce the Mana cost of Dash","archetype":"","archetype_req":0,"base_abil":5,"parents":[41],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":47},{"display_name":"Parry","desc":"After dodging damage, if you cast a spell within 1.5s, it will be free. (3s Cooldown)","archetype":"Acrobat","archetype_req":5,"parents":[49],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":6,"icon":"node_2"},"properties":{},"effects":[],"id":48},{"display_name":"Cheaper Spin Attack 2","desc":"Reduce the Mana cost of Spin Attack","archetype":"","archetype_req":0,"base_abil":0,"parents":[43,48],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":49},{"display_name":"Death Magnet","desc":"After leaving Vanish, pull all nearby Marked mobs towards you","archetype":"Shadestepper","archetype_req":5,"base_abil":5,"parents":[51,46],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":33,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":50},{"display_name":"Cheaper Multihit 2","desc":"Reduce the Mana cost of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[50,46,52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":51},{"display_name":"Hoodwink","desc":"When hitting enemies with Spin Attack, shorten the duration of your negative effects by 30% and transfer it onto enemies Lure can be transferred to the feeble minded. (Bosses and special enemies are immune)","archetype":"Trickster","archetype_req":1,"base_abil":0,"parents":[51,47,53],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":33,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":52},{"display_name":"Choke Bomb","desc":"Smoke Bomb will slow down enemies while in the smoke","archetype":"Trickster","archetype_req":0,"base_abil":7,"parents":[52,54,48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":33,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":53},{"display_name":"Wall Jump","desc":"Reduce Hop's cooldown by 1s. When you Hop into a wall, bounce backward. (Hold shift to cancel)","archetype":"Acrobat","archetype_req":5,"parents":[53,49],"dependencies":[36],"blockers":[],"cost":2,"display":{"row":33,"col":8,"icon":"node_1"},"properties":{},"effects":[],"id":54},{"display_name":"Fatal Spin","desc":"Spin Attack will add +1 Mark to all enemies it hits and gain additional area of effect","archetype":"Shadestepper","archetype_req":8,"base_abil":0,"parents":[50,51],"dependencies":[40],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":55},{"display_name":"Stronger Lacerate","desc":"Lacerate will deal +1 slash","archetype":"Acrobat","archetype_req":0,"base_abil":0,"parents":[53,54],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":34,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Per Hit":1}}],"id":56},{"display_name":"Stronger Vortex","desc":"If you deal more damage than 3x of your max health in a single hit, deal 60% of the damage to other nearby enemies","archetype":"Shadestepper","archetype_req":4,"parents":[55],"dependencies":[38],"blockers":[],"cost":1,"display":{"row":35,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"replace_spell","name":"Violent Vortex","base_spell":5,"display":"Total Damage","parts":[{"name":"Total Damage","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":57},{"display_name":"Harvester","desc":"After killing an enemy, gain +5 Mana for each leftover Marks it had","archetype":"Shadestepper","archetype_req":0,"parents":[55,59],"dependencies":[40],"blockers":[],"cost":2,"display":{"row":37,"col":1,"icon":"node_2"},"properties":{},"effects":[],"id":58},{"display_name":"Cheaper Smoke Bomb 2","desc":"Reduce the Mana cost of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[58,52,60],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":37,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":59},{"display_name":"Blade Fury","desc":"Multihit will be easier to aim and enemies hit will stay locked in front of you","archetype":"Acrobat","archetype_req":0,"base_abil":9,"parents":[56,59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":37,"col":7,"icon":"node_1"},"properties":{},"effects":[],"id":60},{"display_name":"More Marks","desc":"Add +2 max Marks","archetype":"Shadestepper","archetype_req":0,"base_abil":40,"parents":[58,59],"dependencies":[40],"blockers":[],"cost":1,"display":{"row":38,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","slider_max":2}],"id":61},{"display_name":"Stronger Clones","desc":"Improve your damage while your Clones are active by +20%","archetype":"Trickster","archetype_req":7,"base_abil":5,"parents":[59,60],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":38,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"damMult.Echo","value":20}]}],"id":62},{"display_name":"Ricochets","desc":"When hitting an enemy with your Shurikens, they will bounce to the nearest enemy","archetype":"Acrobat","archetype_req":6,"base_abil":5,"parents":[60],"dependencies":[42],"blockers":[],"cost":2,"display":{"row":38,"col":8,"icon":"node_1"},"properties":{},"effects":[],"id":63},{"display_name":"Satsujin","desc":"If an enemy has 3 Marks and 70% of their health or more, your next Multihit or Main Attack will deal triple damage. (30s Cooldown, per enemy)","archetype":"Shadestepper","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":1,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Satsujin","bonuses":[{"type":"stat","name":"dmgMult.Satsujin","value":300}]}],"id":64},{"display_name":"Forbidden Art","desc":"Summon +3 additional Clones. (+20s Cooldown)","archetype":"Trickster","archetype_req":8,"base_abil":5,"parents":[59],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":39,"col":4,"icon":"node_2"},"properties":{},"effects":[],"id":65},{"display_name":"Diversion","desc":"Anytime a Lured enemy gets killed, every nearby ally gets +40% health as extra overflowing health. (3s Cooldown). Decay -4% of the bonus every second.","archetype":"Trickster","archetype_req":11,"base_abil":7,"parents":[65],"dependencies":[39],"blockers":[],"cost":2,"display":{"row":40,"col":5,"icon":"node_3"},"properties":{},"effects":[],"id":66},{"display_name":"Jasmine Bloom","desc":"After spending 40 Mana, bloom an area under you that damages enemies below it every 0.4s After every bloom, reset the duration and increase the radius (Max 10 Blocks)","archetype":"Acrobat","archetype_req":12,"parents":[60],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Jasmine Bloom","base_spell":7,"display":"Per Hit","parts":[{"name":"Per Hit","type":"damage","multipliers":[60,5,0,15,0,0]}]}],"id":67},{"display_name":"Better Ricochets","desc":"Add +1 Max Bounce to Ricochets","archetype":"Acrobat","archetype_req":0,"base_abil":5,"parents":[67],"dependencies":[63],"blockers":[],"cost":1,"display":{"row":40,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":68},{"display_name":"Devour","desc":"Harvester will give +5 Mana","archetype":"Shadestepper","archetype_req":0,"parents":[64],"dependencies":[58],"blockers":[],"cost":1,"display":{"row":41,"col":0,"icon":"node_0"},"properties":{},"effects":[],"id":69},{"display_name":"Better Marked","desc":"Increase Marked's damage bonus by +5%","archetype":"","archetype_req":0,"base_abil":40,"parents":[64],"dependencies":[],"blockers":[],"cost":1,"display":{"row":41,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","output":[{"type":"stat","name":"damMult.Marked"}],"scaling":[5]}],"id":70}]} \ No newline at end of file +const atrees={"Archer":[{"display_name":"Arrow Shield","desc":"Create a shield around you that deal damage and knockback mobs when triggered. (2 Charges)","parents":[60,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":6,"icon":"node_archer"},"properties":{"charges":2,"duration":60,"aoe":5000},"effects":[{"type":"replace_spell","name":"Arrow Shield","cost":30,"base_spell":4,"display":"Total Damage","parts":[{"name":"Shield Damage","type":"damage","multipliers":[90,0,0,0,0,10]},{"name":"Total Damage","type":"total","hits":{"Shield Damage":2}}]}],"id":0},{"display_name":"Escape","desc":"Throw yourself backward to avoid danger. (Hold shift while escaping to cancel)","parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":7,"col":4,"icon":"node_archer"},"properties":{"aoe":0,"range":0},"effects":[{"type":"replace_spell","name":"Escape","cost":25,"base_spell":2,"display":"","parts":[]}],"id":1},{"display_name":"Arrow Bomb","desc":"Throw a long-range arrow that explodes and deal high damage in a large area. (Self-damage for 25% of your DPS)","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_archer"},"properties":{"aoe":4.5,"range":26},"effects":[{"type":"replace_spell","name":"Arrow Bomb","cost":50,"base_spell":3,"spell_type":"damage","display":"Total Damage","parts":[{"name":"Arrow Bomb","type":"damage","multipliers":[160,0,0,0,20,0]},{"name":"Total Damage","type":"total","hits":{"Arrow Bomb":1}}]}],"id":2},{"display_name":"Heart Shatter","desc":"If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage.","base_abil":2,"parents":[31],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Heart Shatter","multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Heart Shatter":1}}],"id":3},{"display_name":"Fire Creep","desc":"Arrow Bomb will leak a trail of fire for 6s, Damaging enemies that walk into it every 0.4s.","base_abil":2,"parents":[68,39,5],"dependencies":[],"blockers":[],"cost":2,"display":{"row":16,"col":6,"icon":"node_1"},"properties":{"aoe":0.8,"duration":6},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fire Creep","multipliers":[30,0,0,0,20,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Burn Damage","hits":{"Fire Creep":15}}],"id":4},{"display_name":"Bryophyte Roots","desc":"When you hit an enemy with Arrow Storm, create an area that slows them down and deals damage every 0.4s.","base_abil":7,"archetype":"Trapper","archetype_req":1,"parents":[4,35],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":16,"col":8,"icon":"node_1"},"properties":{"aoe":2,"duration":5},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Bryophyte Roots","cost":0,"multipliers":[40,20,0,0,0,0]},{"type":"add_spell_prop","base_spell":1,"target_part":"Total Roots Damage","hits":{"Bryophyte Roots":12}}],"id":5},{"display_name":"Nimble String","desc":"Arrow Storm throw out +6 arrows per stream and shoot twice as fast.","base_abil":7,"parents":[36,69],"dependencies":[7],"blockers":[68],"cost":2,"display":{"row":15,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Arrow","multipliers":[-15,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Stream","hits":{"Single Arrow":6}}],"id":6},{"display_name":"Arrow Storm","desc":"Shoot a stream of 8 arrows, dealing significant damage to close mobs and pushing them back.","parents":[58,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":2,"icon":"node_archer"},"properties":{"range":16},"effects":[{"type":"replace_spell","name":"Arrow Storm","cost":40,"base_spell":1,"spell_type":"damage","display":"Total Damage","parts":[{"name":"Single Arrow","multipliers":[30,0,10,0,0,0]},{"name":"Single Stream","hits":{"Single Arrow":8}},{"name":"Total Damage","hits":{"Single Stream":1}}]}],"id":7},{"display_name":"Guardian Angels","desc":"Your protective arrows from Arrow Shield will become sentient bows, dealing damage up to 8 times each to nearby enemies. (Arrow Shield will no longer push nearby enemies)","archetype":"Boltslinger","archetype_req":3,"base_abil":0,"parents":[59,67],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":19,"col":1,"icon":"node_3"},"properties":{"range":4,"duration":60,"shots":8,"charges":2},"effects":[{"type":"replace_spell","name":"Guardian Angels","base_spell":4,"display":"DPS","parts":[{"name":"Single Shot","type":"damage","multipliers":[30,0,0,0,0,10]},{"name":"Single Bow","type":"total","hits":{"Single Shot":8}},{"name":"DPS","type":"total","hits":{"Single Shot":2}},{"name":"Total Damage","type":"total","hits":{"Single Bow":2}}]}],"id":8},{"display_name":"Windy Feet","desc":"When casting Escape, give speed to yourself and nearby allies.","base_abil":1,"parents":[7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":1,"icon":"node_1"},"properties":{"aoe":8,"duration":120},"effects":[],"id":9},{"display_name":"Basaltic Trap","desc":"When you hit the ground with Arrow Bomb, leave a Trap that damages enemies. (Max 2 Traps)","archetype":"Trapper","archetype_req":2,"parents":[5],"dependencies":[],"blockers":[],"cost":2,"display":{"row":19,"col":8,"icon":"node_3"},"properties":{"aoe":7,"traps":2},"effects":[{"type":"replace_spell","name":"Basaltic Trap","base_spell":7,"display":"Trap Damage","parts":[{"name":"Trap Damage","type":"damage","multipliers":[140,30,0,0,30,0]}]}],"id":10},{"display_name":"Windstorm","desc":"Arrow Storm shoot +1 stream of arrows, and each stream shoots +2 arrows, effectively doubling its damage.","base_abil":7,"parents":[8,33],"dependencies":[],"blockers":[68],"cost":2,"display":{"row":21,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Arrow","multipliers":[-10,0,-2,0,0,2]},{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Stream":1}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Stream","cost":0,"hits":{"Single Arrow":2}}],"id":11},{"display_name":"Grappling Hook","base_abil":1,"desc":"When casting Escape, throw a hook that pulls you when hitting a block. If you hit an enemy, pull them towards you instead. (Escape will not throw you backward anymore)","archetype":"Trapper","archetype_req":0,"parents":[61,40,33],"dependencies":[],"blockers":[20],"cost":2,"display":{"row":21,"col":5,"icon":"node_2"},"properties":{"range":26},"effects":[],"id":12},{"display_name":"Implosion","desc":"Arrow bomb will pull enemies towards you. If a trap is nearby, it will pull them towards it instead. Increase Heart Shatter's damage.","archetype":"Trapper","archetype_req":0,"base_abil":2,"parents":[12,40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":22,"col":6,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Heart Shatter","multipliers":[40,0,0,0,0,0]}],"id":13},{"display_name":"Twain's Arc","desc":"When you have 2+ Focus, holding shift will summon the Twain's Arc. Charge it up to shoot a destructive long-range beam. (Damage is dealt as Main Attack Damage)","archetype":"Sharpshooter","archetype_req":4,"parents":[62,64],"dependencies":[61],"blockers":[],"cost":2,"display":{"row":25,"col":4,"icon":"node_2"},"properties":{"range":64,"focusReq":2},"effects":[{"type":"replace_spell","name":"Twain's Arc","base_spell":5,"scaling":"melee","use_atkspd":false,"display":"Single Shot","parts":[{"name":"Single Shot","type":"damage","multipliers":[200,0,0,0,0,0]}]}],"id":14},{"display_name":"Fierce Stomp","desc":"When using Escape, hold shift to quickly drop down and deal damage.","archetype":"Boltslinger","archetype_req":0,"base_abil":1,"parents":[42,64],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":1,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Fierce Stomp","cost":0,"multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Stomp Damage","cost":0,"hits":{"Fierce Stomp":1},"display":"Stomp Damage"}],"id":15},{"display_name":"Scorched Earth","desc":"Fire Creep become much stronger.","archetype":"Sharpshooter","archetype_req":0,"parents":[14],"dependencies":[4],"blockers":[],"cost":1,"display":{"row":26,"col":5,"icon":"node_1"},"properties":{"duration":2,"aoe":0.4},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fire Creep","multipliers":[10,0,0,0,5,0]}],"id":16},{"display_name":"Leap","desc":"When you double tap jump, leap foward. (2s Cooldown)","archetype":"Boltslinger","archetype_req":5,"parents":[42,55],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_1"},"properties":{"cooldown":2},"effects":[],"id":17},{"display_name":"Shocking Bomb","desc":"Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder.","archetype":"Sharpshooter","archetype_req":5,"base_abil":2,"parents":[14,44,55],"dependencies":[2],"blockers":[],"cost":2,"display":{"row":28,"col":4,"icon":"node_1"},"properties":{"gravity":0},"effects":[{"type":"convert_spell_conv","target_part":"all","base_spell":3,"conversion":"Thunder"}],"id":18},{"display_name":"Mana Trap","desc":"Your Traps will give you 2.85 Mana per second when you stay close to them.","archetype":"Trapper","archetype_req":5,"base_abil":10,"parents":[43,44],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":8,"icon":"node_3"},"properties":{"range":16,"manaRegen":2.85},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":10}],"id":19},{"display_name":"Escape Artist","desc":"When casting Escape, release 120 arrows towards the ground.","base_abil":1,"parents":[46,17],"dependencies":[],"blockers":[12],"cost":2,"display":{"row":31,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Per Arrow","multipliers":[20,0,10,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Max Damage (Escape Artist)","hits":{"Per Arrow":120},"display":"Max Damage (Escape Artist)"}],"id":20},{"display_name":"Initiator","desc":"If you do not damage an enemy for 5s or more, your next sucessful hit will deal +50% damage and add +1 Focus.","archetype":"Sharpshooter","archetype_req":5,"parents":[18,44,47],"dependencies":[61],"blockers":[],"cost":2,"display":{"row":31,"col":5,"icon":"node_2"},"properties":{},"effects":[],"id":21},{"display_name":"Call of the Hound","desc":"Arrow Shield summon a Hound that will attack and drag aggressive enemies towards your traps.","archetype":"Trapper","archetype_req":0,"base_abil":0,"parents":[21,47],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":32,"col":7,"icon":"node_2"},"properties":{},"effects":[{"type":"replace_spell","name":"Call of the Hound","base_spell":8,"display":"DPS","parts":[{"name":"Single Hit","multipliers":[40,0,0,0,0,0]},{"name":"DPS","hits":{"Single Hit":4}}]}],"id":22},{"display_name":"Arrow Hurricane","desc":"Arrow Storm will shoot +2 stream of arrows.","archetype":"Boltslinger","archetype_req":8,"base_abil":7,"parents":[48,20],"dependencies":[],"blockers":[68],"cost":2,"display":{"row":33,"col":0,"icon":"node_3"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Stream":2}}],"id":23},{"display_name":"Geyser Stomp","desc":"Fierce Stomp will create geysers, dealing more damage and vertical knockback.","base_abil":1,"parents":[56],"dependencies":[15],"blockers":[],"cost":2,"display":{"row":37,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Geyser Stomp","multipliers":[0,0,0,50,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Stomp Damage","hits":{"Geyser Stomp":1}},{"type":"raw_stat","bonuses":[{"type":"prop","abil":15,"name":"aoe","value":1}]}],"id":24},{"display_name":"Crepuscular Ray","desc":"If you have 5 Focus, casting Arrow Storm will make you levitate and shoot 20 homing arrows per second until you run out of Focus. While in that state, you will lose 1 Focus per second.","archetype":"Sharpshooter","archetype_req":10,"parents":[49],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":37,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Crepuscular Ray","base_spell":6,"display":"DPS","parts":[{"name":"Single Arrow","multipliers":[20,0,0,5,0,0]},{"name":"DPS","hits":{"Single Arrow":20}},{"name":"Total Damage","hits":{"DPS":7}}]}],"id":25},{"display_name":"Grape Bomb","desc":"Arrow bomb will throw 3 additional smaller bombs when exploding.","base_abil":2,"parents":[51],"dependencies":[],"blockers":[],"cost":2,"display":{"row":37,"col":7,"icon":"node_2"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Grape Bomb","multipliers":[30,0,0,0,10,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Grape Bomb":3}}],"id":26},{"display_name":"Tangled Traps","desc":"Your Traps will be connected by a rope that deals damage to enemies every 0.2s.","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[26],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":38,"col":6,"icon":"node_1"},"properties":{"attackSpeed":0.2},"effects":[{"type":"add_spell_prop","base_spell":7,"target_part":"Line Damage Tick","multipliers":[20,0,0,0,0,20]},{"type":"add_spell_prop","base_spell":7,"target_part":"DPS","hits":{"Line Damage Tick":5}}],"id":27},{"display_name":"Snow Storm","desc":"Enemies near you will be slowed down.","parents":[24,63],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":2,"icon":"node_2"},"properties":{"range":2.5,"slowness":0.3},"effects":[],"id":28},{"display_name":"All-Seeing Panoptes","desc":"Your bows from Guardian Angels become all-seeing, increasing their range, damage and letting them shoot up to +5 times each.","archetype":"Boltslinger","archetype_req":11,"base_abil":0,"parents":[28],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":40,"col":1,"icon":"node_3"},"properties":{"range":8,"shots":5},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Single Shot","multipliers":[0,0,0,0,10,0]},{"type":"add_spell_prop","base_spell":4,"target_part":"Single Bow","hits":{"Single Shot":5}}],"id":29},{"display_name":"Minefield","desc":"Allow you to place +6 Traps, but with reduced damage and range.","archetype":"Trapper","archetype_req":10,"base_abil":10,"parents":[26,53],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":40,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":7,"target_part":"Trap Damage","cost":0,"multipliers":[-80,0,0,0,0,0]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"aoe","value":-2},{"type":"prop","abil":10,"name":"traps","value":6}]}],"id":30},{"display_name":"Bow Proficiency I","desc":"Improve your Main Attack's damage and range when using a bow.","base_abil":999,"parents":[2],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[5,0,0,0,0,0]}],"id":31},{"display_name":"Cheaper Arrow Bomb","desc":"Reduce the Mana cost of Arrow Bomb.","base_abil":2,"parents":[31],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-10}],"id":32},{"display_name":"Cheaper Arrow Storm","desc":"Reduce the Mana cost of Arrow Storm.","base_abil":7,"parents":[12,11,61],"dependencies":[],"blockers":[],"cost":1,"display":{"row":21,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":33},{"display_name":"Cheaper Escape","desc":"Reduce the Mana cost of Escape.","base_abil":1,"parents":[7,0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":34},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases your base damage from all Earth attacks","archetype":"Trapper","archetype_req":0,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":35},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases your base damage from all Thunder attacks","archetype":"Boltslinger","archetype_req":0,"parents":[7,39,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":36},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases your base damage from all Water attacks","archetype":"Sharpshooter","archetype_req":0,"parents":[34,36,39],"dependencies":[],"blockers":[],"cost":1,"display":{"row":14,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":37},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Boltslinger","archetype_req":0,"parents":[7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":38},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Sharpshooter","archetype_req":0,"parents":[36,0,34],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":39},{"display_name":"More Shields","desc":"Give +2 charges to Arrow Shield.","base_abil":0,"parents":[12,10],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":21,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Shield Damage":2,"Single Bow":2}},{"type":"add_spell_prop","base_spell":4,"target_part":"DPS","behavior":"modify","hits":{"Single Shot":2}},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"name":"charges","value":2}]}],"id":40},{"display_name":"Stormy Feet","desc":"Windy Feet will last longer and add more speed.","archetype":"Boltslinger","base_abil":1,"parents":[11],"dependencies":[9],"blockers":[],"cost":1,"display":{"row":23,"col":1,"icon":"node_0"},"properties":{"duration":60},"effects":[],"id":41},{"display_name":"Refined Gunpowder","desc":"Increase the damage of Arrow Bomb.","base_abil":2,"parents":[11,64],"dependencies":[],"blockers":[],"cost":1,"display":{"row":25,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Arrow Bomb","multipliers":[50,0,0,0,0,0]}],"id":42},{"display_name":"More Traps","desc":"Increase the maximum amount of active Traps you can have by +2.","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[54],"dependencies":[10],"blockers":[],"cost":1,"display":{"row":26,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"traps","value":2}]}],"id":43},{"display_name":"Better Arrow Shield","desc":"Arrow Shield will gain additional area of effect, knockback and damage.","archetype":"Sharpshooter","archetype_req":0,"base_abil":0,"parents":[19,18,14],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":28,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Arrow Shield","behavior":"modify","multipliers":[40,0,0,0,0,0]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"behavior":"modify","name":"aoe","value":1}]}],"id":44},{"display_name":"Better Leap","desc":"Reduce leap's cooldown by 1s.","archetype":"Boltslinger","archetype_req":0,"base_abil":17,"parents":[17,55],"dependencies":[17],"blockers":[],"cost":1,"display":{"row":29,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":17,"name":"cooldown","value":-1}]}],"id":45},{"display_name":"Better Guardian Angels","desc":"Your Guardian Angels can shoot +4 arrows before disappearing.","archetype":"Boltslinger","archetype_req":0,"base_abil":0,"parents":[20,55],"dependencies":[8],"blockers":[],"cost":1,"display":{"row":31,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Single Bow","hits":{"Single Shot":4}}],"id":46},{"display_name":"Cheaper Arrow Storm (2)","desc":"Reduce the Mana cost of Arrow Storm.","base_abil":7,"parents":[21,19],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":47},{"display_name":"Precise Shot","desc":"+30% Critical Hit Damage","parents":[46,49,23],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"critDamPct","value":30}]}],"id":48},{"display_name":"Cheaper Arrow Shield","desc":"Reduce the Mana cost of Arrow Shield.","base_abil":0,"parents":[48,21],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":49},{"display_name":"Rocket Jump","desc":"Arrow Bomb's self-damage will knockback you farther away.","base_abil":2,"parents":[47,21],"dependencies":[2],"blockers":[],"cost":1,"display":{"row":33,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":50},{"display_name":"Cheaper Escape (2)","desc":"Reduce the Mana cost of Escape.","base_abil":1,"parents":[22,70],"dependencies":[],"blockers":[],"cost":1,"display":{"row":34,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":51},{"display_name":"Stronger Hook","desc":"Increase your Grappling Hook's range, speed and strength.","archetype":"Trapper","archetype_req":5,"base_abil":1,"parents":[51],"dependencies":[12],"blockers":[],"cost":1,"display":{"row":35,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":12,"name":"range","value":8}]}],"id":52},{"display_name":"Cheaper Arrow Bomb (2)","desc":"Reduce the Mana cost of Arrow Bomb.","base_abil":2,"parents":[63,30],"dependencies":[],"blockers":[],"cost":1,"display":{"row":40,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":53},{"display_name":"Bouncing Bomb","desc":"Arrow Bomb will bounce once when hitting a block or enemy","base_abil":2,"parents":[40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":7,"icon":"node_2"},"properties":{},"effects":[],"id":54},{"display_name":"Homing Shots","desc":"Your Main Attack arrows will follow nearby enemies and not be affected by gravity","archetype":"Sharpshooter","archetype_req":2,"base_abil":999,"parents":[17,18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_2"},"properties":{},"effects":[],"id":55},{"display_name":"Shrapnel Bomb","desc":"Arrow Bomb's explosion will fling 15 shrapnel, dealing damage in a large area","archetype":"Boltslinger","archetype_req":8,"base_abil":2,"parents":[23,48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Shrapnel Bomblet","multipliers":[40,0,0,0,20,0]}],"id":56},{"display_name":"Elusive","desc":"If you do not get hit for 8+ seconds, become immune to self-damage and remove Arrow Storm's recoil. (Dodging counts as not getting hit)","archetype":"Boltslinger","archetype_req":0,"parents":[24],"dependencies":[],"blockers":[],"cost":2,"display":{"row":38,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":57},{"display_name":"Double Shots","desc":"Double Main Attack arrows, but they deal -30% damage per arrow (harder to hit far enemies)","archetype":"Boltslinger","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[60],"cost":1,"display":{"row":7,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[-30,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"target_part":"Total Damage","hits":{"Single Shot":2},"display":"Total Damage"}],"id":58},{"display_name":"Triple Shots","desc":"Triple Main Attack arrows, but they deal -20% damage per arrow","archetype":"Boltslinger","archetype_req":0,"base_abil":999,"parents":[69,67],"dependencies":[58],"blockers":[],"cost":1,"display":{"row":17,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Single Shot","multipliers":[-20,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"target_part":"Total Damage","hits":{"Single Shot":1},"display":"Total Damage"}],"id":59},{"display_name":"Power Shots","desc":"Main Attack arrows have increased speed and knockback","archetype":"Sharpshooter","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[58],"cost":1,"display":{"row":7,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":60},{"display_name":"Focus","desc":"When hitting an aggressive mob 5+ blocks away, gain +1 Focus (Max 3). Resets if you miss once","archetype":"Sharpshooter","archetype_req":2,"parents":[68],"dependencies":[],"blockers":[],"cost":2,"display":{"row":19,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","output":{"type":"stat","name":"damMult.Focus"},"scaling":[40],"slider_max":3}],"id":61},{"display_name":"More Focus","desc":"Add +2 max Focus","archetype":"Sharpshooter","archetype_req":0,"base_abil":61,"parents":[33,12],"dependencies":[61],"blockers":[],"cost":1,"display":{"row":22,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","slider_max":2,"output":{"type":"stat","name":"damMult.Focus"},"scaling":[-5]}],"id":62},{"display_name":"More Focus (2)","desc":"Add +2 max Focus","archetype":"Sharpshooter","archetype_req":0,"base_abil":61,"parents":[25,28],"dependencies":[61],"blockers":[],"cost":1,"display":{"row":39,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Focus","slider_max":2,"output":{"type":"stat","name":"damMult.Focus"},"scaling":[-5]}],"id":63},{"display_name":"Traveler","desc":"For every 1% Walk Speed you have from items, gain +1 Raw Spell Damage (Max 100)","parents":[42,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":25,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"spd"}],"output":{"type":"stat","name":"sdRaw"},"scaling":[1],"max":100}],"id":64},{"display_name":"Patient Hunter","desc":"Your Traps will deal +20% more damage for every second they are active (Max +80%)","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[40],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":22,"col":8,"icon":"node_1"},"properties":{"max":80},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Trap Wait Time","slider_max":4,"output":{"type":"stat","name":"damMult.Basaltic:7.Trap Damage"},"slider_step":1,"scaling":[20]}],"id":65},{"display_name":"Stronger Patient Hunter","desc":"Add +80% Max Damage to Patient Hunter","archetype":"Trapper","archetype_req":0,"base_abil":10,"parents":[26],"dependencies":[65],"blockers":[],"cost":1,"display":{"row":38,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Trap Wait Time","slider_max":4},{"type":"raw_stat","bonuses":[{"type":"prop","abil":65,"name":"max","value":80}]}],"id":66},{"display_name":"Frenzy","desc":"Every time you hit an enemy, briefly gain +6% Walk Speed (Max 200%). Decay -40% of the bonus every second","archetype":"Boltslinger","archetype_req":0,"parents":[59,6],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Hits dealt","output":{"type":"stat","name":"spd"},"scaling":[6],"max":160}],"id":67},{"display_name":"Phantom Ray","desc":"Condense Arrow Storm into a single ray that damages enemies 10 times per second","base_abil":7,"parents":[37,4],"dependencies":[7],"blockers":[11,6,23],"cost":2,"display":{"row":16,"col":4,"icon":"node_2"},"properties":{"range":16},"effects":[{"type":"replace_spell","name":"Phantom Ray","base_spell":1,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Single Arrow","type":"damage","multipliers":[25,0,5,0,0,0]},{"name":"Total Damage","type":"total","hits":{"Single Arrow":16}}]},{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":68},{"display_name":"Arrow Rain","desc":"When Arrow Shield loses its last charge, unleash 150 arrows raining down on enemies","base_abil":0,"parents":[6,38],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":15,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Arrow Rain (Per Arrow)","multipliers":[80,0,0,0,0,60]},{"type":"add_spell_prop","base_spell":4,"target_part":"Arrow Rain (Total)","hits":{"Arrow Rain (Per Arrow)":150}}],"id":69},{"display_name":"Decimator","desc":"Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 70%)","archetype":"Sharpshooter","archetype_req":0,"base_abil":7,"parents":[49,51],"dependencies":[68],"blockers":[],"cost":2,"display":{"row":34,"col":5,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Phantom Ray hits","slider_max":7,"output":{"type":"stat","name":"damMult.Decimator:1.Single Arrow"},"scaling":[10]}],"id":70}],"Warrior":[{"display_name":"Bash","desc":"Violently bash the ground, dealing high damage in a large area","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_warrior"},"properties":{"aoe":4,"range":3},"effects":[{"type":"replace_spell","name":"Bash","cost":45,"base_spell":1,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Single Hit","type":"damage","multipliers":[130,20,0,0,0,0]},{"name":"Total Damage","type":"total","hits":{"Single Hit":1}}]}],"id":0},{"display_name":"Spear Proficiency 1","desc":"Improve your Main Attack's damage and range w/ spear","base_abil":999,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{"melee_range":1},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[5,0,0,0,0,0]}],"id":1},{"display_name":"Cheaper Bash","desc":"Reduce the Mana cost of Bash","base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":2},{"display_name":"Double Bash","desc":"Bash will hit a second time at a farther range","parents":[1],"base_abil":0,"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{"range":3},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","cost":0,"hits":{"Single Hit":1}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","cost":0,"multipliers":[-50,0,0,0,0,0]}],"id":3},{"display_name":"Charge","desc":"Charge forward at high speed (hold shift to cancel)","parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":4,"icon":"node_warrior"},"properties":{},"effects":[{"type":"replace_spell","name":"Charge","cost":25,"base_spell":2,"spell_type":"damage","scaling":"spell","display":"","parts":[]}],"id":4},{"display_name":"Heavy Impact","desc":"After using Charge, violently crash down into the ground and deal damage","base_abil":4,"parents":[8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":1,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Heavy Impact","cost":0,"multipliers":[100,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Contact Damage","display":"Contact Damage","hits":{"Heavy Impact":1}}],"id":5},{"display_name":"Vehement","desc":"For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%)","archetype":"Fallen","archetype_req":0,"parents":[4],"dependencies":[],"blockers":[7],"cost":1,"display":{"row":6,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"mdPct"},{"type":"stat","name":"mdRaw"}],"output":{"type":"stat","name":"spd"},"scaling":[2,2],"max":20}],"id":6},{"display_name":"Tougher Skin","desc":"Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)","archetype":"Paladin","archetype_req":0,"parents":[4],"dependencies":[],"blockers":[6],"cost":1,"display":{"row":6,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"defMult.Base","value":5}]},{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"hprRaw"},{"type":"stat","name":"hprPct"}],"output":{"type":"stat","name":"hpBonus"},"scaling":[10,10],"max":100}],"id":7},{"display_name":"Uppercut","desc":"Rocket enemies in the air and deal massive damage","parents":[6,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":2,"icon":"node_warrior"},"properties":{"aoe":3,"range":5},"effects":[{"type":"replace_spell","name":"Uppercut","cost":45,"base_spell":3,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"Uppercut","multipliers":[200,40,40,0,0,0]},{"name":"Total Damage","hits":{"Uppercut":1}}]}],"id":8},{"display_name":"Cheaper Charge","desc":"Reduce the Mana cost of Charge","base_abil":4,"parents":[8,10],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":9},{"display_name":"War Scream","desc":"Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies","parents":[7,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":6,"icon":"node_warrior"},"properties":{"duration":30,"aoe":12,"defense_bonus":10},"effects":[{"type":"replace_spell","name":"War Scream","cost":35,"base_spell":4,"spell_type":"damage","scaling":"spell","display":"Total Damage","parts":[{"name":"War Scream","multipliers":[50,0,0,0,50,0]},{"name":"Total Damage","hits":{"War Scream":1}}]}],"id":10},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases base damage from all Earth attacks","archetype":"Fallen","archetype_req":0,"parents":[8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":11},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases base damage from all Thunder attacks","archetype":"Fallen","archetype_req":0,"parents":[8,14,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":12},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases base damage from all Water attacks","archetype":"Battle Monk","archetype_req":0,"parents":[9,12,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":11,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":13},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Battle Monk","archetype_req":0,"parents":[10,12,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":14},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Paladin","archetype_req":0,"parents":[10],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":15},{"display_name":"Quadruple Bash","desc":"Bash will hit 4 times at an even larger range","archetype":"Fallen","archetype_req":0,"base_abil":0,"parents":[11,17],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":0,"icon":"node_1"},"properties":{"range":6},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Single Hit":2}},{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","multipliers":[-20,0,0,0,0,0]}],"id":16},{"display_name":"Fireworks","desc":"Mobs hit by Uppercut will explode mid-air and receive additional damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[12,16],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fireworks","multipliers":[80,0,20,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Fireworks":1}}],"id":17},{"display_name":"Half-Moon Swipe","desc":"Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water","archetype":"Battle Monk","archetype_req":1,"base_abil":8,"parents":[13],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":13,"col":4,"icon":"node_1"},"properties":{"range":4},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","cost":-10,"multipliers":[-70,0,0,30,0,0]}],"id":18},{"display_name":"Flyby Jab","desc":"Damage enemies in your way when using Charge","base_abil":4,"parents":[14,20],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":6,"icon":"node_1"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Flyby Jab","multipliers":[20,0,0,0,0,40]},{"type":"add_spell_prop","base_spell":2,"target_part":"Contact Damage","display":"Contact Damage","hits":{"Flyby Jab":1}}],"id":19},{"display_name":"Flaming Uppercut","desc":"Uppercut will light mobs on fire, dealing damage every 0.6 seconds","archetype":"Paladin","archetype_req":0,"base_abil":8,"parents":[15,19],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":12,"col":8,"icon":"node_1"},"properties":{"duration":3,"tick":0.6},"effects":[{"type":"replace_spell","name":"Flaming Uppercut","base_spell":8,"display":"DPS","parts":[{"name":"Damage Tick","multipliers":[0,0,0,0,50,0]},{"name":"DPS","hits":{"Damage Tick":1.6666666666666667}},{"name":"Total Damage","hits":{"Damage Tick":5}}]}],"id":20},{"display_name":"Iron Lungs","desc":"War Scream deals more damage","archetype":"Paladin","archetype_req":0,"base_abil":10,"parents":[19,20],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"War Scream","cost":0,"multipliers":[30,0,0,0,0,30]}],"id":21},{"display_name":"Generalist","desc":"After casting 3 different spells in a row, your next spell will cost 5 mana","archetype":"Battle Monk","archetype_req":3,"parents":[23],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":2,"icon":"node_3"},"properties":{},"effects":[],"id":22},{"display_name":"Counter","desc":"When dodging a nearby enemy attack, get 30% chance to instantly attack back","archetype":"Battle Monk","archetype_req":0,"parents":[18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":4,"icon":"node_1"},"properties":{"chance":30},"effects":[{"type":"replace_spell","name":"Counter","base_spell":5,"display":"Counter Damage","parts":[{"name":"Counter Damage","multipliers":[60,0,20,0,0,20]}]}],"id":23},{"display_name":"Mantle of the Bovemists","desc":"When casting War Scream, create a holy shield around you that reduces all incoming damage by 70% for 3 hits (20s cooldown)","archetype":"Paladin","archetype_req":3,"parents":[21],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":15,"col":7,"icon":"node_3"},"properties":{"mantle_charge":3},"effects":[{"type":"raw_stat","toggle":"Activate Mantle","bonuses":[{"type":"stat","name":"defMult.Mantle","value":70}]}],"id":24},{"display_name":"Bak'al's Grasp","desc":"After casting War Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)","archetype":"Fallen","archetype_req":2,"parents":[16,17],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":16,"col":1,"icon":"node_3"},"properties":{"cooldown":15},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","slider_max":100,"slider_step":1,"output":{"type":"stat","name":"damRaw"},"max":120,"scaling":[2]}],"id":25},{"display_name":"Spear Proficiency 2","desc":"Improve your Main Attack's damage and range w/ spear","base_abil":999,"parents":[25,27],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":0,"icon":"node_0"},"properties":{"melee_range":1},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[5,0,0,0,0,0]}],"id":26},{"display_name":"Cheaper Uppercut","desc":"Reduce the Mana Cost of Uppercut","base_abil":8,"parents":[26,28,23],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":27},{"display_name":"Aerodynamics","desc":"During Charge, you can steer and change direction","archetype":"Battle Monk","archetype_req":0,"base_abil":4,"parents":[27,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":28},{"display_name":"Provoke","desc":"Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream","base_abil":10,"parents":[28,24],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":29},{"display_name":"Precise Strikes","desc":"+30% Critical Hit Damage","parents":[27,26],"dependencies":[],"blockers":[],"cost":1,"display":{"row":18,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"critDamPct","value":30}]}],"id":30},{"display_name":"Air Shout","desc":"War Scream will fire a projectile that can go through walls and deal damage multiple times","base_abil":10,"parents":[28,29],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":18,"col":6,"icon":"node_1"},"properties":{"attackRate":2},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Air Shout","multipliers":[40,0,0,0,0,10]}],"id":31},{"display_name":"Enraged Blow","desc":"While Corriupted, every 1% of Health you lose will increase your damage by +3% (Max 300%)","archetype":"Fallen","archetype_req":0,"base_abil":25,"parents":[26],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":20,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider_name":"Corrupted","slider":true,"output":{"type":"stat","name":"damMult.Enraged"},"scaling":[3]}],"id":32},{"display_name":"Flying Kick","desc":"When using Charge, mobs hit will halt your momentum and get knocked back","archetype":"Battle Monk","archetype_req":1,"base_abil":4,"parents":[27,34],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":3,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick","multipliers":[150,0,0,20,0,30]},{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick Max Damage","hits":{"Flying Kick":1},"display":"Flying Kick Max Damage"}],"id":33},{"display_name":"Stronger Mantle","desc":"Add +2 additional charges to Mantle of the Bovemists","archetype":"Paladin","archetype_req":0,"base_abil":24,"parents":[35,33],"dependencies":[24],"blockers":[],"cost":1,"display":{"row":20,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":24,"name":"mantle_charge","value":2}]}],"id":34},{"display_name":"Manachism","desc":"If you receive a hit that's less than 5% of your max HP, gain 10 Mana (1s Cooldown)","archetype":"Paladin","archetype_req":3,"parents":[34,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":8,"icon":"node_2"},"properties":{"cooldown":1},"effects":[],"id":35},{"display_name":"Boiling Blood","desc":"Bash leaves a trail of boiling blood behind its first explosion, slowing down and damaging enemies above it every 0.4 seconds","base_abil":0,"parents":[32,37],"dependencies":[],"blockers":[],"cost":2,"display":{"row":22,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Boiling Blood","cost":0,"multipliers":[25,0,0,0,5,0]}],"id":36},{"display_name":"Ragnarokkr","desc":"War Scream become deafening, increasing its duration and giving damage bonus to players","archetype":"Fallen","archetype_req":0,"base_abil":10,"parents":[36,33],"dependencies":[10],"blockers":[],"cost":2,"display":{"row":22,"col":2,"icon":"node_2"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":10},{"type":"raw_stat","bonuses":[{"type":"prop","abil":10,"name":"duration","value":90}]}],"id":37},{"display_name":"Ambidextrous","desc":"Increase your chance to attack with Counter by +30%","base_abil":23,"parents":[33,34,39],"dependencies":[23],"blockers":[],"cost":1,"display":{"row":22,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":23,"name":"chance","value":30}]}],"id":38},{"display_name":"Burning Heart","desc":"For every 100 Health Bonus you have from item IDs, gain +2% Fire Damage (Max 100%)","archetype":"Paladin","archetype_req":0,"parents":[38,40],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"hpBonus"}],"output":{"type":"stat","name":"fDamPct"},"scaling":[0.02],"max":100}],"id":39},{"display_name":"Stronger Bash","desc":"Increase the damage of Bash","base_abil":0,"parents":[39,35],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Single Hit","multipliers":[30,0,0,0,0,0]}],"id":40},{"display_name":"Intoxicating Blood","desc":"After leaving Corrupted, gain 2% of the health lost back for each enemy killed while Corrupted","archetype":"Fallen","archetype_req":5,"base_abil":25,"parents":[37,36],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":23,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":41},{"display_name":"Comet","desc":"After being hit by Fireworks, enemies will crash into the ground and receive more damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[37],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":24,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Comet","cost":0,"multipliers":[80,20,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","cost":0,"hits":{"Comet":1}}],"id":42},{"display_name":"Collide","desc":"Mobs thrown into walls from Flying Kick will explode and receive additonal damage","archetype":"Battle Monk","archetype_req":4,"base_abil":4,"parents":[38,39],"dependencies":[33],"blockers":[],"cost":2,"display":{"row":23,"col":5,"icon":"node_1"},"properties":{"aoe":4},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Collide","cost":0,"multipliers":[150,0,0,0,50,0]},{"type":"add_spell_prop","base_spell":2,"target_part":"Flying Kick Max Damage","hits":{"Collide":1}}],"id":43},{"display_name":"Rejuvenating Skin","desc":"Regain back 30% of the damage you take as healing over 30s","archetype":"Paladin","archetype_req":5,"parents":[39,40],"dependencies":[],"blockers":[],"cost":2,"display":{"row":23,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":44},{"display_name":"Uncontainable Corruption","desc":"Reduce the cooldown of Bak'al's Grasp by -5s, and increase the raw damage gained for every 2% of health lost by +1","base_abil":25,"parents":[36,46],"dependencies":[25],"blockers":[],"cost":1,"display":{"row":26,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","output":{"type":"stat","name":"damRaw"},"scaling":[0.5]},{"type":"raw_stat","bonuses":[{"type":"prop","abil":25,"name":"cooldown","value":-5}]}],"id":45},{"display_name":"Radiant Devotee","desc":"For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)","archetype":"Battle Monk","archetype_req":1,"parents":[47,45],"dependencies":[],"blockers":[],"cost":1,"display":{"row":26,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","inputs":[{"type":"stat","name":"ref"}],"output":{"type":"stat","name":"mr"},"scaling":[0.25],"max":10}],"id":46},{"display_name":"Whirlwind Strike","desc":"Uppercut will create a strong gust of air, launching you upward with enemies (Hold shift to stay grounded)","archetype":"Battle Monk","archetype_req":5,"base_abil":8,"parents":[38,46],"dependencies":[8],"blockers":[],"cost":2,"display":{"row":26,"col":4,"icon":"node_1"},"properties":{"range":2},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","multipliers":[0,0,0,0,0,50]}],"id":47},{"display_name":"Mythril Skin","desc":"Gain +5% Base Resistance and become immune to knockback","archetype":"Paladin","archetype_req":6,"parents":[44],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"defMult.Base","value":5}]}],"id":48},{"display_name":"Armour Breaker","desc":"While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage","archetype":"Fallen","archetype_req":0,"base_abil":8,"parents":[45,46],"dependencies":[25],"blockers":[],"cost":2,"display":{"row":27,"col":1,"icon":"node_2"},"properties":{"duration":8},"effects":[{"type":"raw_stat","toggle":"Activate Armor Breaker","bonuses":[{"type":"stat","name":"damMult.ArmorBreaker","value":30}]}],"id":49},{"display_name":"Shield Strike","desc":"When your Mantle of the Bovemist loses all charges, deal damage around you for each Mantle individually lost","archetype":"Paladin","archetype_req":0,"base_abil":24,"parents":[48,51],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":6,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Shield Strike","base_spell":6,"display":"Damage per Shield","parts":[{"name":"Damage per Shield","multipliers":[60,0,20,0,0,0]}]}],"id":50},{"display_name":"Sparkling Hope","desc":"Everytime you heal 5% of your max health, deal damage to all nearby enemies","archetype":"Paladin","archetype_req":0,"parents":[48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":8,"icon":"node_2"},"properties":{"aoe":6},"effects":[{"type":"replace_spell","name":"Sparkling Hope","base_spell":7,"display":"Damage Tick","parts":[{"name":"Damage Tick","multipliers":[10,0,5,0,0,0]}]}],"id":51},{"display_name":"Massive Bash","desc":"While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)","archetype":"Fallen","archetype_req":8,"base_abil":25,"parents":[53,45],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Corrupted","output":{"type":"prop","abil":0,"name":"aoe"},"scaling":[0.3333333333333333],"max":10}],"id":52},{"display_name":"Tempest","desc":"War Scream will ripple the ground and deal damage 3 times in a large area","archetype":"Battle Monk","archetype_req":0,"base_abil":10,"parents":[52,54],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_1"},"properties":{"aoe":16},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Tempest","multipliers":[30,10,0,0,0,10]},{"type":"add_spell_prop","base_spell":4,"target_part":"Tempest Total Damage","hits":{"Tempest":3}},{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Tempest":3}}],"id":53},{"display_name":"Spirit of the Rabbit","desc":"Reduce the Mana cost of Charge and increase your Walk Speed by +20%","archetype":"Battle Monk","archetype_req":5,"base_abil":4,"parents":[53,47],"dependencies":[],"blockers":[],"cost":1,"display":{"row":28,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5},{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":20}]}],"id":54},{"display_name":"Massacre","desc":"While Corrupted, if your effective attack speed is Slow or lower, hitting an enemy with your Main Attack will add +1% to your Corrupted bar","archetype":"Fallen","archetype_req":5,"base_abil":999,"parents":[53,52],"dependencies":[],"blockers":[],"cost":2,"display":{"row":29,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":55},{"display_name":"Axe Kick","desc":"Increase the damage of Uppercut, but also increase its mana cost","base_abil":8,"parents":[53,54],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":3,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Uppercut","cost":10,"multipliers":[100,0,0,0,0,0]}],"id":56},{"display_name":"Radiance","desc":"Bash will buff your allies' positive IDs. (15s Cooldown)","archetype":"Paladin","archetype_req":2,"base_abil":0,"parents":[54,58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":29,"col":5,"icon":"node_2"},"properties":{"cooldown":15},"effects":[],"id":57},{"display_name":"Cheaper Bash 2","desc":"Reduce the Mana cost of Bash","base_abil":0,"parents":[57,50,51],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":58},{"display_name":"Cheaper War Scream","desc":"Reduce the Mana cost of War Scream","base_abil":10,"parents":[52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":59},{"display_name":"Discombobulate","desc":"Every time you hit an enemy, briefly increase your elemental damage dealt to them by +3 (Additive, Max +80). This bonus decays -5 every second","archetype":"Battle Monk","archetype_req":11,"parents":[62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":2,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Hits dealt","slider_max":27,"output":[{"type":"stat","name":"eDamAddMin"},{"type":"stat","name":"eDamAddMax"},{"type":"stat","name":"tDamAddMin"},{"type":"stat","name":"tDamAddMax"},{"type":"stat","name":"wDamAddMin"},{"type":"stat","name":"wDamAddMax"},{"type":"stat","name":"fDamAddMin"},{"type":"stat","name":"fDamAddMax"},{"type":"stat","name":"aDamAddMin"},{"type":"stat","name":"aDamAddMax"}],"scaling":[3],"max":80}],"id":60},{"display_name":"Thunderclap","desc":"Bash will cast at the player's position and gain additional AoE.\n\n All elemental conversions become Thunder","archetype":"Battle Monk","archetype_req":8,"parents":[62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":5,"icon":"node_1"},"properties":{},"effects":[{"type":"convert_spell_conv","target_part":"all","base_spell":1,"conversion":"Thunder"},{"type":"raw_stat","bonuses":[{"type":"prop","abil":0,"name":"aoe","value":3}]}],"id":61},{"display_name":"Cyclone","desc":"After casting War Scream, envelop yourself with a vortex that damages nearby enemies every 0.5s","archetype":"Battle Monk","archetype_req":0,"parents":[54],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":4,"icon":"node_1"},"properties":{"aoe":4,"duration":20},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Cyclone","multipliers":[10,0,0,0,5,10]},{"type":"add_spell_prop","base_spell":4,"target_part":"Cyclone Total Damage","hits":{"Cyclone":40}}],"id":62},{"display_name":"Second Chance","desc":"When you receive a fatal blow, survive and regain 30% of your Health (10m Cooldown)","archetype":"Paladin","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":63},{"display_name":"Blood Pact","desc":"If you do not have enough mana to cast a spell, spend health instead (0.6% health per mana)","archetype":"Fallen","archetype_req":10,"parents":[59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_3"},"properties":{"health_cost":0.6},"effects":[],"id":64},{"display_name":"Brink of Madness","desc":"If your health is 25% full or less, gain +40% Resistance","parents":[64,66],"dependencies":[],"blockers":[],"cost":2,"display":{"row":35,"col":4,"icon":"node_2"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Brink","bonuses":[{"type":"stat","name":"defMult.Brink","value":40}]}],"id":65},{"display_name":"Cheaper Uppercut 2","desc":"Reduce the Mana cost of Uppercut","base_abil":8,"parents":[63,65],"dependencies":[],"blockers":[],"cost":1,"display":{"row":35,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":66},{"display_name":"Martyr","desc":"When you receive a fatal blow, all nearby allies become invincible","archetype":"Paladin","archetype_req":0,"parents":[63],"dependencies":[],"blockers":[],"cost":2,"display":{"row":35,"col":8,"icon":"node_1"},"properties":{"duration":3,"aoe":12},"effects":[],"id":67},{"display_name":"Haemorrhage","desc":"Reduce Blood Pact's health cost. (0.3% health per mana)","archetype":"Fallen","archetype_req":0,"base_abil":64,"parents":[64],"dependencies":[64],"blockers":[],"cost":2,"display":{"row":35,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":64,"name":"health_cost","value":-0.3}]}],"id":68}],"Mage":[{"display_name":"Meteor","desc":"Summon a slow but powerful meteor from the sky, dealing massive damage in a large area","parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_mage"},"properties":{"aoe":5,"range":18},"effects":[{"type":"replace_spell","name":"Meteor","cost":55,"base_spell":3,"display":"Total Damage","parts":[{"name":"Meteor Damage","multipliers":[300,100,0,0,0,0]},{"name":"Total Damage","hits":{"Meteor Damage":1}}]}],"id":0},{"display_name":"Teleport","desc":"Instantly teleport in the direction you're facing","parents":[4],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":4,"icon":"node_mage"},"properties":{"range":12},"effects":[{"type":"replace_spell","name":"Teleport","cost":25,"base_spell":2,"display":"","parts":[]}],"id":1},{"display_name":"Heal","desc":"Heal yourself and nearby allies in a large area around you. (When healing an ally, you cannot heal more than 30% of their max health)","parents":[14,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":2,"icon":"node_mage"},"properties":{"aoe":5},"effects":[{"type":"replace_spell","name":"Heal","cost":35,"base_spell":1,"display":"Heal","parts":[{"name":"Heal","power":0.1}]}],"id":2},{"display_name":"Ice Snake","desc":"Summon a fast-moving ice snake that reduces your enemies' speed and damage them.","parents":[13,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":6,"icon":"node_mage"},"properties":{"range":18,"effects":40,"duration":3},"effects":[{"type":"replace_spell","name":"Ice Snake","cost":35,"base_spell":4,"display":"Ice Snake Damage","parts":[{"name":"Ice Snake Damage","multipliers":[70,0,0,30,0,0]}]}],"id":3},{"display_name":"Shooting Star","desc":"Drastically increase the speed of your Meteor ability.","base_abil":3,"parents":[5],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":4},{"display_name":"Wand Proficiency I","desc":"Improve your Main Attack's damage and range when using a wand.","base_abil":999,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"mdPct","value":5}]}],"id":5},{"display_name":"Cheaper Meteor","desc":"Reduce the Mana cost of Meteor.","base_abil":0,"parents":[5],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-10}],"id":6},{"display_name":"Earth Mastery","base_abil":998,"desc":"Increases your base damage from all Earth attacks","archetype":"Arcanist","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":7},{"display_name":"Thunder Mastery","base_abil":998,"desc":"Increases your base damage from all Thunder attacks","archetype":"Riftwalker","archetype_req":0,"parents":[2,12],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":8},{"display_name":"Water Mastery","base_abil":998,"desc":"Increases your base damage from all Water attacks","archetype":"Light Bender","archetype_req":0,"parents":[12,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":11,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":9},{"display_name":"Air Mastery","base_abil":998,"desc":"Increases base damage from all Air attacks","archetype":"Riftwalker","archetype_req":0,"parents":[2],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":10},{"display_name":"Fire Mastery","base_abil":998,"desc":"Increases base damage from all Fire attacks","archetype":"Arcanist","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":10,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":11},{"display_name":"Cheaper Teleport","desc":"Reduce the Mana cost of Teleport.","base_abil":1,"parents":[2,3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":8,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":12},{"display_name":"Wisdom","desc":"For every 2% or 2 Raw Spell Damage you have from items, gain +1/5s mana regen (Max 5/5s)","archetype":"Arcanist","archetype_req":0,"parents":[1],"dependencies":[],"blockers":[14],"cost":1,"display":{"row":6,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"sdPct"},{"type":"stat","name":"sdRaw"}],"output":{"type":"stat","name":"mr"},"scaling":[0.5,0.5],"max":5}],"id":13},{"display_name":"Wand Proficiency II","desc":"Improve your Main Attack's damage and range when using a wand.","archetype":"Riftwalker","archetype_req":0,"base_abil":999,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":6,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"mdPct","value":5}]}],"id":14},{"display_name":"Wind Slash","desc":"When using Teleport, slash through the air and deal damage to enemies you pierce.","archetype":"Riftwalker","base_abil":1,"parents":[10,16],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":12,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Wind Slash","base_spell":2,"multipliers":[50,0,0,0,0,50]},{"type":"add_spell_prop","target_part":"Total Damage","base_spell":2,"display":"Total Damage","hits":{"Wind Slash":1}}],"id":15},{"display_name":"Thunderstorm","desc":"After casting Meteor, summon 3 lightning strikes and deal additional damage","base_abil":0,"parents":[15,8],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":12,"col":2,"icon":"node_1"},"properties":{"aoe":2},"effects":[{"type":"add_spell_prop","target_part":"Lightning Damage","base_spell":3,"multipliers":[30,0,15,0,0,0]},{"type":"add_spell_prop","target_part":"Total Damage","base_spell":3,"hits":{"Lightning Damage":3}}],"id":16},{"display_name":"Stronger Meteor","desc":"Increase the damage of Meteor.","base_abil":0,"archetype":"Arcanist","archetype_req":2,"parents":[18],"dependencies":[0],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Meteor Damage","behavior":"modify","multipliers":[30,90,0,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Lightning Damage","behavior":"modify","multipliers":[30,90,0,0,0,0]}],"id":17},{"display_name":"Burning Sigil","desc":"Meteor will leave a sigil that damages enemies every 0.4s.","base_abil":0,"parents":[11,7],"dependencies":[],"blockers":[],"cost":2,"display":{"row":12,"col":7,"icon":"node_1"},"properties":{"aoe":7,"duration":8},"effects":[{"type":"replace_spell","name":"Burning Sigil","base_spell":6,"display":"DPS","parts":[{"name":"Tick Damage","multipliers":[15,0,0,0,25,0]},{"name":"DPS","hits":{"Tick Damage":2.5}},{"name":"Total Burn Damage","hits":{"Tick Damage":20}}]}],"id":18},{"display_name":"Sunshower","desc":"Heal emit a strong light, damaging nearby enemies.","archetype":"Light Bender","archetype_req":0,"base_abil":2,"parents":[9],"dependencies":[2],"blockers":[22],"cost":2,"display":{"row":13,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Sunshower Damage","multipliers":[70,0,0,30,0,0]}],"id":19},{"display_name":"Windsweeper","desc":"Your Main Attack will add +1 Winded to enemies you hit. (Max 5, 0.5s cooldown) Ice Snake will deal additional damage to enemies for every Winded they have","archetype":"Riftwalker","archetype_req":3,"parents":[15,16],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":15,"col":1,"icon":"node_3"},"properties":{"max":5},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":{"type":"stat","name":"nConvBase:4.Ice Snake Damage"},"scaling":[20],"slider_step":1,"slider_max":5},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":{"type":"stat","name":"wConvBase:4.Ice Snake Damage"},"scaling":[10]}],"id":20},{"display_name":"Ophanim","desc":"When casting Meteor, instead summon 2 orbs of light with 200 Health that will attack when you use your Main Attack. When they damage an enemy, they lose 20% of their Health. They can be healed back.","archetype":"Light Bender","archetype_req":2,"parents":[19],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":4,"icon":"node_3"},"properties":{"health":200},"effects":[{"type":"replace_spell","name":"Ophanim","base_spell":3,"display":"Per Melee (max)","parts":[{"name":"Per Orb","multipliers":[50,0,30,20,0,0]},{"name":"Per Melee (max)","hits":{"Per Orb":2}}]},{"type":"add_spell_prop","base_spell":3,"cost":30}],"id":21},{"display_name":"Arcane Transfer","desc":"Meteor and Ice Snake will add +5 Mana to a Mana Bank for every aggressive enemy you hit. Heal will now transfer the content of your Mana Bank into usable Mana instead of healing.","archetype":"Arcanist","archetype_req":2,"parents":[18],"dependencies":[],"blockers":[],"cost":2,"display":{"row":15,"col":7,"icon":"node_3"},"properties":{"bank":90},"effects":[{"type":"replace_spell","name":"Arcane Transfer","base_spell":1,"parts":[],"display":""}],"id":22},{"display_name":"Cheaper Heal","desc":"Reduce the Mana cost of Heal.","base_abil":2,"parents":[20,24],"dependencies":[],"blockers":[],"cost":1,"display":{"row":17,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":23},{"display_name":"Purification","desc":"Heal and Arcane Transfer will purify you of all negative effects and fire. (3s Cooldown)","base_abil":1,"parents":[21,23,25],"dependencies":[],"blockers":[],"cost":2,"display":{"row":17,"col":4,"icon":"node_2"},"properties":{},"effects":[],"id":24},{"display_name":"Sentient Snake","desc":"Ice Snake will follow the direction you're facing, allowing you to control it.","base_abil":3,"parents":[22,24],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":17,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":25},{"display_name":"Eye Piercer","desc":"Teleport will blind enemies, confusing them for a short amount of time.","base_abil":1,"parents":[23],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":18,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":26},{"display_name":"Breathless","desc":"Meteor will deal additional damage to enemies for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[23,24],"dependencies":[20],"blockers":[],"cost":2,"display":{"row":18,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"nConvBase:3.Meteor Damage"},{"type":"stat","name":"nConvBase:3.Meteor Damage"},{"type":"stat","name":"nConvBase:3.Lightning Damage"}],"scaling":[15]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"eConvBase:3.Meteor Damage"},{"type":"stat","name":"eConvBase:3.Per Orb"},{"type":"stat","name":"eConvBase:3.Lightning Damage"}],"scaling":[10]}],"id":27},{"display_name":"Larger Heal","desc":"Increase your Heal's range.","base_abil":1,"archetype":"Light Bender","archetype_req":0,"parents":[24,25],"dependencies":[2],"blockers":[22],"cost":1,"display":{"row":18,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":2,"name":"aoe","value":2}]}],"id":28},{"display_name":"Larger Mana Bank","desc":"Increase your maximum Mana Bank by +30.","base_abil":1,"archetype":"Arcanist","archetype_req":0,"parents":[25],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":18,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":22,"name":"bank","value":30}]}],"id":29},{"display_name":"Cheaper Ice Snake","desc":"Reduce the Mana cost of Ice Snake.","base_abil":3,"parents":[26,32],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":30},{"display_name":"Cheaper Teleport II","desc":"Reduce the Mana cost of Teleport.","base_abil":1,"parents":[32,24],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":31},{"display_name":"Fortitude","desc":"After healing 120% of your max health within 10s, apply a damage bonus to each player you've healed. (15s Cooldown)","base_abil":2,"archetype":"Light Bender","archetype_req":0,"parents":[30,31],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":2,"icon":"node_2"},"properties":{"duration":5},"effects":[],"id":32},{"display_name":"Pyrokinesis","desc":"When your Mana Bank reaches 30, your Main Attack will stop and explode when it hits an enemy. (Damage is dealt as Main Attack Damage)","base_abil":4,"archetype":"Arcanist","archetype_req":4,"parents":[25],"dependencies":[],"blockers":[],"cost":2,"display":{"row":20,"col":7,"icon":"node_2"},"properties":{},"__TODO":"replace_spell pyrokinesis damage","effects":[],"id":33},{"display_name":"Seance","desc":"For every 5/3s Lifesteal you have from items, gain 1% Spell Damage (Max 50%)","archetype":"","archetype_req":0,"parents":[33,36],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"ls"}],"output":{"type":"stat","name":"sdPct"},"scaling":[0.2],"max":50}],"id":34},{"display_name":"Blink","desc":"Teleport will trigger 2 times in quick successions","base_abil":1,"archetype":"Riftwalker","archetype_req":0,"parents":[32,30],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":21,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":1,"name":"range","value":-4}]},{"type":"add_spell_prop","behavior":"modify","target_part":"Total Damage","base_spell":2,"hits":{"Wind Slash":1,"Explosion Damage":1}}],"id":35},{"display_name":"Snake Nest","desc":"Ice Snake will summon 3 snakes.","base_abil":3,"parents":[34,31,40],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":22,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":36},{"display_name":"Arcane Restoration","desc":"Pyrokinesis will add +1 Mana every 1s to your Mana Bank when hitting an aggressive enemy.","base_abil":999,"archetype":"Arcanist","archetype_req":0,"parents":[34,36],"dependencies":[33],"blockers":[],"cost":2,"display":{"row":23,"col":6,"icon":"node_1"},"properties":{"duration":4},"effects":[],"id":37},{"display_name":"Fluid Healing","desc":"For every 1% Water Damage Bonus you have, buff Heal's healing power by +0.3%.","archetype":"Light Bender","archetype_req":0,"base_abil":2,"parents":[40,39],"dependencies":[],"blockers":[],"cost":2,"display":{"row":23,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"round":false,"inputs":[{"type":"stat","name":"wDamPct"}],"output":{"type":"stat","name":"healPct"},"scaling":[0.3]}],"id":38},{"display_name":"Transonic Warp","desc":"Teleport will deal additional damage to enemies for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":5,"parents":[30],"dependencies":[3,20],"blockers":[],"cost":2,"display":{"row":23,"col":0,"icon":"node_2"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"nConvBase:2.Wind Slash"},{"type":"stat","name":"nConvBase:2.Explosion Damage"}],"scaling":[20]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"tConvBase:2.Wind Slash"},{"type":"stat","name":"tConvBase:2.Explosion Damage"}],"scaling":[5]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","output":[{"type":"stat","name":"aConvBase:2.Wind Slash"},{"type":"stat","name":"aConvBase:2.Explosion Damage"}],"scaling":[5]}],"id":39},{"display_name":"Healthier Ophanim I","desc":"Increase the health of your orbs from Ophanim by +800 and reduce the damage they take when hitting an enemy by -5%.","archetype":"Light Bender","archetype_req":0,"base_abil":21,"parents":[32,31],"dependencies":[21],"blockers":[],"cost":1,"display":{"row":22,"col":3,"icon":"node_0"},"properties":{},"effects":[],"id":40},{"display_name":"Orphion's Pulse","desc":"Heal will trigger 2 more times, increasing the overall healing.","archetype":"Light Bender","base_abil":2,"parents":[40,36],"dependencies":[2],"blockers":[22],"cost":2,"display":{"row":23,"col":4,"icon":"node_1"},"properties":{"aoe":5},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Second and Third Pulses","power":0.15},{"type":"add_spell_prop","base_spell":1,"display":"Total Heal","target_part":"Total Heal","hits":{"Heal":1,"Second and Third Pulses":2}}],"id":41},{"display_name":"Diffusion","desc":"If you kill an enemy with Winded on them, the leftover Winded will spread to nearby enemies.","archetype":"Riftwalker","archetype_req":6,"base_abil":20,"parents":[39,38],"dependencies":[20],"blockers":[],"cost":2,"display":{"row":25,"col":1,"icon":"node_3"},"properties":{"aoe":5},"effects":[],"id":42},{"display_name":"Lightweaver","desc":"After healing 50% of your max health within 10s, summon a rotating orb that damages all enemies it touches for 20s. (Max 3 Orbs)","archetype":"Light Bender","archetype_req":7,"parents":[41],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Lightweaver","base_spell":5,"display":"Orb Damage","parts":[{"name":"Single Orb","type":"damage","multipliers":[30,0,0,0,20,0]},{"name":"Orb Damage","type":"total","hits":{"Single Orb":3}}]}],"id":43},{"display_name":"Arcane Speed","desc":"After casting Heal or Arcane Transfer, gain +80% speed for 3s. (8s Cooldown)","base_abil":2,"parents":[43,45],"dependencies":[2],"blockers":[],"cost":2,"display":{"row":25,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":44},{"display_name":"Larger Mana Bank II","desc":"Increase your maximum Mana Bank by +30.","base_abil":1,"archetype":"Arcanist","archetype_req":0,"parents":[34,44],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":25,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":45},{"display_name":"Psychokinesis","desc":"Meteor will launch directly from you as a slow projectile.","base_abil":3,"archetype":"Arcanist","archetype_req":5,"parents":[45,44],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":26,"col":7,"icon":"node_1"},"properties":{"range":20},"effects":[],"id":46},{"display_name":"More Winded","desc":"Incrase your maximum Winded by +5.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[42],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":26,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":20,"name":"max","value":5}]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","slider_max":5}],"id":47},{"display_name":"Cheaper Ice Snake II","desc":"Reduce the Mana cost of Ice Snake.","base_abil":3,"parents":[42,52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":27,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":48},{"display_name":"Cheaper Meteor II","desc":"Reduce the Mana cost of Meteor.","base_abil":0,"parents":[52,43,44],"dependencies":[],"blockers":[],"cost":1,"display":{"row":27,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":49},{"display_name":"Chaos Explosion","desc":"When your Mana Bank reaches 120, casting Arcane Transfer will rapidly unleash the last 3 spells you've cast in order.","base_abil":22,"archetype":"Arcanist","archetype_req":8,"parents":[45],"dependencies":[22],"blockers":[],"cost":2,"display":{"row":27,"col":8,"icon":"node_3"},"properties":{},"effects":[],"id":50},{"display_name":"Arcane Power","desc":"Meteor and Ice Snake will add +2 Mana to your Mana Bank for each aggressive mob you hit.","base_abil":22,"archetype":"Arcanist","archetype_req":0,"parents":[56],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":29,"col":6,"icon":"node_0"},"properties":{},"effects":[],"id":51},{"display_name":"Explosive Entrance","desc":"Deal Damage in an area on the location you Teleport to.","base_abil":1,"parents":[48,49],"dependencies":[1],"blockers":[],"cost":2,"display":{"row":27,"col":3,"icon":"node_1"},"properties":{"aoe":3},"effects":[{"type":"add_spell_prop","target_part":"Explosion Damage","base_spell":2,"multipliers":[50,0,0,0,30,0]},{"type":"add_spell_prop","behavior":"modify","target_part":"Total Damage","base_spell":2,"hits":{"Explosion Damage":1}}],"id":52},{"display_name":"Gust","desc":"Ice Snake will add +1 Winded to enemies and deal more damage.","base_abil":3,"archetype":"Riftwalker","archetype_req":7,"parents":[48,52],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":28,"col":2,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Ice Snake Damage","base_spell":4,"multipliers":[0,0,0,0,0,20]}],"id":53},{"display_name":"Time Dilation","desc":"When sprinting, create an area that increases the speed of all allies the longer they run in it. (Step out or stop running to cancel)","archetype":"Riftwalker","archetype_req":7,"parents":[48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":0,"icon":"node_2"},"properties":{},"effects":[],"id":54},{"display_name":"Better Ophanim","desc":"Increase your maximum orbs from Ophanim by +1.","archetype":"Light Bender","archetype_req":0,"base_abil":21,"parents":[52,49],"dependencies":[21],"blockers":[],"cost":1,"display":{"row":28,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Per Melee (max)","hits":{"Per Orb":1}}],"id":55},{"display_name":"Arctic Snake","desc":"Ice Snake will freeze enemies completely for 2s.","base_abil":3,"parents":[50],"dependencies":[3],"blockers":[],"cost":2,"display":{"row":28,"col":7,"icon":"node_1"},"properties":{},"effects":[],"id":56},{"display_name":"Devitalize","desc":"Enemies will deal -2% damage for every Winded they have.","base_abil":20,"archetype":"Riftwalker","archetype_req":5,"parents":[58,59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":57},{"display_name":"More Winded II","desc":"Incrase your maximum Winded by +5.","base_abil":20,"archetype":"Riftwalker","archetype_req":0,"parents":[54,59],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":31,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"prop","abil":20,"name":"max","value":5}]},{"type":"stat_scaling","slider":true,"slider_name":"Winded","slider_max":5}],"id":58},{"display_name":"Dynamic Faith","desc":"For every 2% Sprint you have from items, gain +1% Thunder Damage (Max 100%)","parents":[58,61],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"sprint"}],"output":{"type":"stat","name":"tDamPct"},"scaling":[0.5],"max":100}],"id":59},{"display_name":"Divination","desc":"Increase your maximum orbs from Ophanim by +3 and reduce their damage.","base_abil":21,"archetype":"Light Bender","archetype_req":0,"parents":[59,61],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":32,"col":3,"icon":"node_2"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Per Orb","multipliers":[-30,0,-10,0,0,0]},{"type":"add_spell_prop","base_spell":3,"target_part":"Per Melee (max)","hits":{"Per Orb":3}}],"id":60},{"display_name":"Healthier Ophanim II","desc":"Increase the health of your orbs from Ophanim by +3000.","base_abil":21,"archetype":"Light Bender","archetype_req":0,"parents":[55],"dependencies":[40],"blockers":[],"cost":1,"display":{"row":31,"col":4,"icon":"node_0"},"properties":{},"effects":[],"id":61},{"display_name":"Sunflare","desc":"After healing 400% of your max health within 10s, your next Heal will make every nearby ally temporarily immune.","archetype":"Light Bender","archetype_req":12,"base_abil":2,"parents":[61],"dependencies":[],"blockers":[],"cost":2,"display":{"row":32,"col":5,"icon":"node_3"},"properties":{"aoe":12,"duration":5},"effects":[],"id":62},{"display_name":"Larger Mana Bank III","desc":"Increase your maximum Mana Bank by +30.","archetype":"Arcanist","archetype_req":0,"base_abil":22,"parents":[56],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":31,"col":7,"icon":"node_0"},"properties":{},"effects":[],"id":63},{"display_name":"Arcane Overflow","desc":"Arcane Transfer will allow you to overflow your mana over its maximum limits.","archetype":"Arcanist","archetype_req":12,"base_abil":22,"parents":[63],"dependencies":[22],"blockers":[],"cost":2,"display":{"row":33,"col":7,"icon":"node_3"},"properties":{},"effects":[],"id":64},{"display_name":"Memory Recollection","desc":"Chaos Explosion will cast +2 spells.","archetype":"Arcanist","archetype_req":0,"base_abil":22,"parents":[64],"dependencies":[50],"blockers":[],"cost":1,"display":{"row":34,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":65},{"display_name":"Manastorm","desc":"If you have more than 100 Mana, casting a spell will give you +10 mana over 5s.","archetype":"Arcanist","archetype_req":1,"parents":[69,64,62],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":5,"icon":"node_1"},"properties":{},"effects":[],"id":66},{"display_name":"Better Lightweaver","desc":"Increase your Max Orbs by +2.","archetype":"Light Bender","archetype_req":0,"base_abil":43,"parents":[69,66],"dependencies":[43],"blockers":[],"cost":1,"display":{"row":35,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","target_part":"Orb Damage","base_spell":5,"hits":{"Single Orb":2}}],"id":67},{"display_name":"Timelock","desc":"Holding shift and casting Heal will absorb all Winded on nearby enemies and make you Timelocked. While Timelocked, your mana will not be depleted and you become immovable from outside forces. Enemies will recieve Winded damage from all absorbed stacks. (Max 30)","archetype":"Riftwalker","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":34,"col":0,"icon":"node_3"},"properties":{},"effects":[],"id":68},{"display_name":"Cheaper Heal II","desc":"Reduce the Mana cost of Heal.","base_abil":2,"parents":[68,66],"dependencies":[],"blockers":[],"cost":1,"display":{"row":34,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":69}],"Assassin":[{"display_name":"Spin Attack","desc":"Slash rapidly around you, damaging enemies in a large area.","archetype":"","archetype_req":0,"parents":[],"dependencies":[],"blockers":[],"cost":1,"display":{"row":0,"col":4,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Spin Attack","cost":45,"base_spell":1,"spell_type":"damage","scaling":"spell","use_atkspd":true,"display":"Spin Attack","parts":[{"name":"Spin Attack","type":"damage","multipliers":[120,0,30,0,0,0]}]}],"id":0},{"display_name":"Dagger Proficiency I","desc":"Increase your speed by +5% and improve your Main Attack’s damage when using a dagger.","archetype":"","archetype_req":0,"parents":[0],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":5},{"type":"stat","name":"mdPct","value":5}]}],"id":1},{"display_name":"Cheaper Spin Attack","desc":"Reduce the Mana cost of Spin Attack.","archetype":"","archetype_req":0,"base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":2,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-10}],"id":2},{"display_name":"Double Spin","desc":"Spin Attack will activate a second time with a larger area of effect.","archetype":"","archetype_req":0,"base_abil":0,"parents":[1],"dependencies":[],"blockers":[],"cost":1,"display":{"row":4,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Spin Attack":1},"display":"Total Damage"}],"id":3},{"display_name":"Poisoned Blade","desc":"For every 2% or 2 Raw Main Attack Damage you have from items, gain +5/3s Poison Damage (Max 50/3s)","archetype":"Shadestepper","archetype_req":0,"parents":[5],"dependencies":[],"blockers":[6],"cost":1,"display":{"row":7,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"mdPct"},{"type":"stat","name":"mdRaw"}],"output":[{"type":"stat","name":"poison"}],"scaling":[2.5,2.5],"max":50}],"id":4},{"display_name":"Dash","desc":"Dash in the direction you're facing.","archetype":"","archetype_req":0,"parents":[3],"dependencies":[],"blockers":[],"cost":1,"display":{"row":7,"col":4,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Dash","cost":20,"base_spell":2,"display":"Total Damage","parts":[{"name":"None","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":5},{"display_name":"Double Slice","desc":"Your Main Attack will attack twice, but deal -40% damage per hit.","archetype":"Acrobat","archetype_req":0,"base_abil":999,"parents":[5],"dependencies":[],"blockers":[4],"cost":1,"display":{"row":7,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":0,"target_part":"Melee","multipliers":[-40,0,0,0,0,0]},{"type":"add_spell_prop","base_spell":0,"display":"Total Damage","target_part":"Total Damage","hits":{"Melee":2}}],"id":6},{"display_name":"Smoke Bomb","desc":"Throw a bomb that slouly emits smoke, damaging all enemies in it every 0.5s.","archetype":"","archetype_req":0,"parents":[4,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":2,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Smoke Bomb","cost":40,"base_spell":4,"display":"Total Damage","parts":[{"name":"Per Tick","type":"damage","multipliers":[25,5,0,0,0,5]},{"name":"Per Bomb","type":"total","hits":{"Per Tick":10}},{"name":"Total Damage","type":"total","hits":{"Per Bomb":1}}]}],"id":7},{"display_name":"Cheaper Dash","desc":"Reduce the Mana cost of Dash","archetype":"","archetype_req":0,"base_abil":5,"parents":[7,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":8},{"display_name":"Multihit","desc":"Unleash a rapid flurry of 8 hits to enemies facing you, dealing overwhelming damage","archetype":"","archetype_req":0,"parents":[6,8],"dependencies":[],"blockers":[],"cost":1,"display":{"row":9,"col":6,"icon":"node_assassin"},"properties":{},"effects":[{"type":"replace_spell","name":"Multihit","cost":45,"base_spell":3,"display":"Total Damage","parts":[{"name":"Per Hit","type":"damage","multipliers":[25,0,0,10,0,0]},{"name":"Total Damage","type":"total","hits":{"Per Hit":8}}]}],"id":9},{"display_name":"Earth Mastery","desc":"Increases base damage from all Earth attacks","archetype":"Shadestepper","archetype_req":0,"base_abil":998,"parents":[7,11],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"eDamPct","value":20},{"type":"stat","name":"eDamAddMin","value":2},{"type":"stat","name":"eDamAddMax","value":4}]}],"id":10},{"display_name":"Thunder Mastery","desc":"Increases base damage from all Thunder attacks","archetype":"Shadestepper","archetype_req":0,"base_abil":998,"parents":[10,7],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"tDamPct","value":10},{"type":"stat","name":"tDamAddMin","value":1},{"type":"stat","name":"tDamAddMax","value":8}]}],"id":11},{"display_name":"Fire Mastery","desc":"Increases base damage from all Fire attacks","archetype":"Trickster","archetype_req":0,"base_abil":998,"parents":[8,13],"dependencies":[],"blockers":[],"cost":1,"display":{"row":14,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"fDamPct","value":15},{"type":"stat","name":"fDamAddMin","value":3},{"type":"stat","name":"fDamAddMax","value":5}]}],"id":12},{"display_name":"Water Mastery","desc":"Increases base damage from all Water attacks","archetype":"Acrobat","archetype_req":0,"base_abil":998,"parents":[8,9,14],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":6,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"wDamPct","value":15},{"type":"stat","name":"wDamAddMin","value":2},{"type":"stat","name":"wDamAddMax","value":4}]}],"id":13},{"display_name":"Air Mastery","desc":"Increases base damage from all Air attacks","archetype":"Acrobat","archetype_req":0,"base_abil":998,"parents":[13,9],"dependencies":[],"blockers":[],"cost":1,"display":{"row":13,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"aDamPct","value":15},{"type":"stat","name":"aDamAddMin","value":3},{"type":"stat","name":"aDamAddMax","value":4}]}],"id":14},{"display_name":"Backstab","desc":"Multihit will deal a single devastating hit. If you strike the enemy from behind, deal double damage","archetype":"Shadestepper","archetype_req":2,"base_abil":9,"parents":[10,11],"dependencies":[9],"blockers":[44,16],"cost":2,"display":{"row":15,"col":1,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Backstab","base_spell":3,"display":"Backstab Damage","parts":[{"name":"Backstab Damage","type":"damage","multipliers":[200,50,0,0,0,0]}]}],"id":15},{"display_name":"Fatality","desc":"Multihit will deal an additional final slash","archetype":"","archetype_req":0,"base_abil":9,"parents":[13,14],"dependencies":[9],"blockers":[15],"cost":2,"display":{"row":15,"col":7,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Fatality","multipliers":[100,0,0,0,0,50]},{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Fatality":1}}],"id":16},{"display_name":"Vanish","desc":"Dash will vanish you into the shadows and make you invisible to enemies (5s Cooldown). You cannot heal or gain mana while in that state (Attack or get hit to cancel)","archetype":"","archetype_req":0,"base_abil":5,"parents":[15,18],"dependencies":[5],"blockers":[],"cost":2,"display":{"row":16,"col":2,"icon":"node_2"},"properties":{"duration":5,"cooldown":5},"effects":[],"id":17},{"display_name":"Sticky Bomb","desc":"Smoke Bomb will stick to enemies and deal additional damage","archetype":"Trickster","archetype_req":0,"base_abil":7,"parents":[17,12],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":16,"col":4,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Per Tick","multipliers":[0,0,0,0,10,0]}],"id":18},{"display_name":"Righting Reflex","desc":"When you hold shift while airborne, slowly glide and become immune to fall damage (Max 5s)","archetype":"Acrobat","archetype_req":0,"parents":[16],"dependencies":[],"blockers":[],"cost":2,"display":{"row":16,"col":6,"icon":"node_2"},"properties":{},"effects":[],"id":19},{"display_name":"Surprise Strike","desc":"While using Vanish, your next attack will deal +60% more damage for a single hit only","archetype":"Shadestepper","archetype_req":3,"base_abil":5,"parents":[17],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":19,"col":2,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Surprise Strike","bonuses":[{"type":"stat","name":"damMult.SurpriseStrike","value":60}]}],"id":20},{"display_name":"Mirror Image","desc":"After leaving Vanish, summon 3 Clones that will follow you and protect you. (20s Cooldown)","archetype":"Trickster","archetype_req":2,"base_abil":5,"parents":[18],"dependencies":[17],"blockers":[22],"cost":2,"display":{"row":19,"col":4,"icon":"node_3"},"properties":{"clone":3},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"defMult.Clone","value":80}]}],"id":21},{"display_name":"Lacerate","desc":"Spin Attack will lunge you forward, deal 3 strikes and lunge you forward again.","archetype":"Acrobat","archetype_req":2,"base_abil":0,"parents":[16],"dependencies":[],"blockers":[21],"cost":2,"display":{"row":19,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Lacerate","base_spell":1,"display":"Total Damage","parts":[{"name":"Per Hit","type":"damage","multipliers":[50,0,0,10,0,20]},{"name":"Total Damage","type":"total","hits":{"Per Hit":3}}]}],"id":22},{"display_name":"Silent Killer","desc":"After killing an enemy, reset Vanish's cooldown","archetype":"","archetype_req":0,"base_abil":5,"parents":[20],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":20,"col":1,"icon":"node_2"},"properties":{},"effects":[],"id":23},{"display_name":"Shenanigans","desc":"For every 2% Stealing you have from items, gain +1/3s Mana Steal (Max 8/3s)","archetype":"Trickster","archetype_req":0,"parents":[21],"dependencies":[],"blockers":[],"cost":1,"display":{"row":20,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":false,"inputs":[{"type":"stat","name":"eSteal"}],"output":[{"type":"stat","name":"ms"}],"scaling":[0.5],"max":8}],"id":24},{"display_name":"Wall of Smoke","desc":"Smoke Bomb will throw +2 bombs, damaging more often in a larger area","archetype":"","archetype_req":0,"base_abil":7,"parents":[22],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":20,"col":8,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"target_part":"Total Damage","hits":{"Per Bomb":2}},{"type":"add_spell_prop","base_spell":4,"target_part":"Per Tick","multipliers":[-20,0,0,0,0,0]}],"id":25},{"display_name":"Better Smoke Bomb","desc":"Increase the range and area of effect of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[23,27],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":22,"col":0,"icon":"node_0"},"properties":{},"effects":[],"id":26},{"display_name":"Shadow Travel","desc":"Vanish will increase your speed by +100%","archetype":"Shadestepper","archetype_req":0,"base_abil":5,"parents":[26,23,28],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":22,"col":2,"icon":"node_1"},"properties":{},"effects":[],"id":27},{"display_name":"Cheaper Multihit","desc":"Reduce the Mana cost of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[24,27,29],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":28},{"display_name":"Dagger Proficiency II","desc":"Increase your Main Attack's range and add +5 raw damage to all attacks","archetype":"","archetype_req":0,"base_abil":999,"parents":[28,25],"dependencies":[],"blockers":[],"cost":1,"display":{"row":22,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"damRaw","value":5}]}],"id":29},{"display_name":"Last Laugh","desc":"When losing a Clone, it will cast Spin Attack before dying","archetype":"Trickster","archetype_req":3,"base_abil":5,"parents":[27,28],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":23,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":30},{"display_name":"Cheaper Smoke Bomb","desc":"Reduce the Mana cost of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[26,32],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":25,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":31},{"display_name":"Blazing Powder","desc":"Spin Attack will blind enemies and deal additional damage","archetype":"","archetype_req":0,"base_abil":0,"parents":[31,27,28],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":3,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Spin Attack","multipliers":[0,0,0,0,20,0]}],"id":32},{"display_name":"Weightless","desc":"When you hit an enemy while airborne, gain +0.5 Mana (1.25+ blocks off the ground to be airborne)","archetype":"Acrobat","archetype_req":4,"parents":[28,29],"dependencies":[],"blockers":[],"cost":2,"display":{"row":25,"col":7,"icon":"node_2"},"properties":{},"effects":[],"id":33},{"display_name":"Black Hole","desc":"Smoke Bomb will pull nearby enemies","archetype":"","archetype_req":0,"base_abil":7,"parents":[31,32],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":34},{"display_name":"Sandbagging","desc":"Anytime you get hit for less than 5% of your max hp, reduce your abilities cooldown by -2s. (1s Cooldown)","archetype":"Trickster","archetype_req":0,"parents":[32,36],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":35},{"display_name":"Hop","desc":"When you double tap jump, leap forward. (2s Cooldown)","archetype":"Acrobat","archetype_req":0,"parents":[35,33],"dependencies":[],"blockers":[],"cost":2,"display":{"row":26,"col":6,"icon":"node_1"},"properties":{"cooldown":2},"effects":[],"id":36},{"display_name":"Dancing Blade","desc":"Deal damage to mobs you Dash through","archetype":"","archetype_req":0,"base_abil":5,"parents":[33],"dependencies":[5],"blockers":[],"cost":2,"display":{"row":26,"col":8,"icon":"node_1"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"target_part":"Dancing Blade","multipliers":[80,0,0,0,0,20],"display":"Dancing Blade"}],"id":37},{"display_name":"Violent Vortex","desc":"If you deal more damage than 2x of your max health in a single hit, deal 20% of the damage to other nearby enemies","archetype":"Shadestepper","archetype_req":0,"parents":[31],"dependencies":[],"blockers":[],"cost":2,"display":{"row":27,"col":0,"icon":"node_1"},"properties":{},"effects":[{"type":"replace_spell","name":"Violent Vortex","base_spell":5,"display":"Total Damage","parts":[{"name":"Total Damage","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":38},{"display_name":"Delirious Gas","desc":"While inside Smoke Bomb, increase your damage by +40% and gain Lure for 20s","archetype":"Trickster","archetype_req":4,"base_abil":7,"parents":[35],"dependencies":[7],"blockers":[],"cost":2,"display":{"row":27,"col":3,"icon":"node_2"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Delirious Gas","bonuses":[{"type":"stat","name":"damMult.DeliriousGas","value":40}]}],"id":39},{"display_name":"Marked","desc":"Smoke Bomb will add +1 Mark to enemies it hits. (Max 5, 0.5s Cooldown) Marked enemies will take +10% damage for each mark they have.","archetype":"Shadestepper","archetype_req":5,"parents":[38],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":1,"icon":"node_3"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","slider_step":1,"slider_max":5,"output":[{"type":"stat","name":"damMult.Marked"}],"scaling":[10]}],"id":40},{"display_name":"Echo","desc":"Your Clones will mimic your spells and abilities. While they are active, deal -60% damage.","archetype":"Trickster","archetype_req":6,"base_abil":5,"parents":[35,42],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":28,"col":4,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"damMult.Echo","value":-60}]}],"id":41},{"display_name":"Shurikens","desc":"After using Dash, your next Main Attack will throw 3 shurikens","archetype":"Acrobat","archetype_req":0,"base_abil":5,"parents":[41,43],"dependencies":[],"blockers":[],"cost":2,"display":{"row":28,"col":6,"icon":"node_2"},"properties":{},"effects":[{"type":"replace_spell","name":"Shurikens","base_spell":6,"display":"Total Damage","parts":[{"name":"Per Shuriken","type":"damage","multipliers":[90,0,0,0,10,0]},{"name":"Total Damage","type":"total","hits":{"Per Shuriken":3}}]}],"id":42},{"display_name":"Far Reach","desc":"Increase the range of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[37,42],"dependencies":[],"blockers":[],"cost":1,"display":{"row":28,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":43},{"display_name":"Stronger Multihit","desc":"Increases Multihit's amount of hits by +3","archetype":"","archetype_req":0,"base_abil":9,"parents":[41,42],"dependencies":[],"blockers":[15],"cost":1,"display":{"row":29,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"target_part":"Total Damage","hits":{"Per Hit":3}}],"id":44},{"display_name":"Psithurism","desc":"Increase your Walk Speed by +20% and your Jump Height by +1","archetype":"Acrobat","archetype_req":5,"parents":[42,43],"dependencies":[],"blockers":[],"cost":1,"display":{"row":29,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","bonuses":[{"type":"stat","name":"spd","value":20},{"type":"stat","name":"jh","value":1}]}],"id":45},{"display_name":"Ambush","desc":"Increase Surprise Strike's damage by +40%","archetype":"Shadestepper","archetype_req":4,"base_abil":5,"parents":[40],"dependencies":[20],"blockers":[],"cost":1,"display":{"row":31,"col":1,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Surprise Strike","bonuses":[{"type":"stat","name":"damMult.SurpriseStrike","value":40}]}],"id":46},{"display_name":"Cheaper Dash 2","desc":"Reduce the Mana cost of Dash","archetype":"","archetype_req":0,"base_abil":5,"parents":[41],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":2,"cost":-5}],"id":47},{"display_name":"Parry","desc":"After dodging damage, if you cast a spell within 1.5s, it will be free. (3s Cooldown)","archetype":"Acrobat","archetype_req":5,"parents":[49],"dependencies":[],"blockers":[],"cost":2,"display":{"row":31,"col":6,"icon":"node_2"},"properties":{},"effects":[],"id":48},{"display_name":"Cheaper Spin Attack 2","desc":"Reduce the Mana cost of Spin Attack","archetype":"","archetype_req":0,"base_abil":0,"parents":[43,48],"dependencies":[],"blockers":[],"cost":1,"display":{"row":31,"col":8,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"cost":-5}],"id":49},{"display_name":"Death Magnet","desc":"After leaving Vanish, pull all nearby Marked mobs towards you","archetype":"Shadestepper","archetype_req":5,"base_abil":5,"parents":[51,46],"dependencies":[17],"blockers":[],"cost":2,"display":{"row":33,"col":0,"icon":"node_1"},"properties":{},"effects":[],"id":50},{"display_name":"Cheaper Multihit 2","desc":"Reduce the Mana cost of Multihit","archetype":"","archetype_req":0,"base_abil":9,"parents":[50,46,52],"dependencies":[],"blockers":[],"cost":1,"display":{"row":33,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":3,"cost":-5}],"id":51},{"display_name":"Hoodwink","desc":"When hitting enemies with Spin Attack, shorten the duration of your negative effects by 30% and transfer it onto enemies Lure can be transferred to the feeble minded. (Bosses and special enemies are immune)","archetype":"Trickster","archetype_req":1,"base_abil":0,"parents":[51,47,53],"dependencies":[0],"blockers":[],"cost":2,"display":{"row":33,"col":4,"icon":"node_1"},"properties":{},"effects":[],"id":52},{"display_name":"Choke Bomb","desc":"Smoke Bomb will slow down enemies while in the smoke","archetype":"Trickster","archetype_req":0,"base_abil":7,"parents":[52,54,48],"dependencies":[],"blockers":[],"cost":2,"display":{"row":33,"col":6,"icon":"node_1"},"properties":{},"effects":[],"id":53},{"display_name":"Wall Jump","desc":"Reduce Hop's cooldown by 1s. When you Hop into a wall, bounce backward. (Hold shift to cancel)","archetype":"Acrobat","archetype_req":5,"parents":[53,49],"dependencies":[36],"blockers":[],"cost":2,"display":{"row":33,"col":8,"icon":"node_1"},"properties":{},"effects":[],"id":54},{"display_name":"Fatal Spin","desc":"Spin Attack will add +1 Mark to all enemies it hits and gain additional area of effect","archetype":"Shadestepper","archetype_req":8,"base_abil":0,"parents":[50,51],"dependencies":[40],"blockers":[],"cost":2,"display":{"row":34,"col":1,"icon":"node_1"},"properties":{},"effects":[],"id":55},{"display_name":"Stronger Lacerate","desc":"Lacerate will deal +1 slash","archetype":"Acrobat","archetype_req":0,"base_abil":0,"parents":[53,54],"dependencies":[22],"blockers":[],"cost":1,"display":{"row":34,"col":7,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":1,"target_part":"Total Damage","hits":{"Per Hit":1}}],"id":56},{"display_name":"Stronger Vortex","desc":"If you deal more damage than 3x of your max health in a single hit, deal 60% of the damage to other nearby enemies","archetype":"Shadestepper","archetype_req":4,"parents":[55],"dependencies":[38],"blockers":[],"cost":1,"display":{"row":35,"col":0,"icon":"node_0"},"properties":{},"effects":[{"type":"replace_spell","name":"Violent Vortex","base_spell":5,"display":"Total Damage","parts":[{"name":"Total Damage","type":"damage","multipliers":[0,0,0,0,0,0]}]}],"id":57},{"display_name":"Harvester","desc":"After killing an enemy, gain +5 Mana for each leftover Marks it had","archetype":"Shadestepper","archetype_req":0,"parents":[55,59],"dependencies":[40],"blockers":[],"cost":2,"display":{"row":37,"col":1,"icon":"node_2"},"properties":{},"effects":[],"id":58},{"display_name":"Cheaper Smoke Bomb 2","desc":"Reduce the Mana cost of Smoke Bomb","archetype":"","archetype_req":0,"base_abil":7,"parents":[58,52,60],"dependencies":[7],"blockers":[],"cost":1,"display":{"row":37,"col":4,"icon":"node_0"},"properties":{},"effects":[{"type":"add_spell_prop","base_spell":4,"cost":-5}],"id":59},{"display_name":"Blade Fury","desc":"Multihit will be easier to aim and enemies hit will stay locked in front of you","archetype":"Acrobat","archetype_req":0,"base_abil":9,"parents":[56,59],"dependencies":[],"blockers":[],"cost":2,"display":{"row":37,"col":7,"icon":"node_1"},"properties":{},"effects":[],"id":60},{"display_name":"More Marks","desc":"Add +2 max Marks","archetype":"Shadestepper","archetype_req":0,"base_abil":40,"parents":[58,59],"dependencies":[40],"blockers":[],"cost":1,"display":{"row":38,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","slider_max":2}],"id":61},{"display_name":"Stronger Clones","desc":"Improve your damage while your Clones are active by +20%","archetype":"Trickster","archetype_req":7,"base_abil":5,"parents":[59,60],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":38,"col":5,"icon":"node_0"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Clones","bonuses":[{"type":"stat","name":"damMult.Echo","value":20}]}],"id":62},{"display_name":"Ricochets","desc":"When hitting an enemy with your Shurikens, they will bounce to the nearest enemy","archetype":"Acrobat","archetype_req":6,"base_abil":5,"parents":[60],"dependencies":[42],"blockers":[],"cost":2,"display":{"row":38,"col":8,"icon":"node_1"},"properties":{},"effects":[],"id":63},{"display_name":"Satsujin","desc":"If an enemy has 3 Marks and 70% of their health or more, your next Multihit or Main Attack will deal triple damage. (30s Cooldown, per enemy)","archetype":"Shadestepper","archetype_req":12,"parents":[58],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":1,"icon":"node_3"},"properties":{},"effects":[{"type":"raw_stat","toggle":"Activate Satsujin","bonuses":[{"type":"stat","name":"damMult.Satsujin:3.Backstab Damage","value":200},{"type":"stat","name":"damMult.Satsujin:3.Per Hit","value":200},{"type":"stat","name":"damMult.Satsujin:3.Fatality","value":200},{"type":"stat","name":"damMult.Satsujin:0.Melee","value":200}]}],"id":64},{"display_name":"Forbidden Art","desc":"Summon +3 additional Clones. (+20s Cooldown)","archetype":"Trickster","archetype_req":8,"base_abil":5,"parents":[59],"dependencies":[21],"blockers":[],"cost":2,"display":{"row":39,"col":4,"icon":"node_2"},"properties":{},"effects":[],"id":65},{"display_name":"Diversion","desc":"Anytime a Lured enemy gets killed, every nearby ally gets +40% health as extra overflowing health. (3s Cooldown). Decay -4% of the bonus every second.","archetype":"Trickster","archetype_req":11,"base_abil":7,"parents":[65],"dependencies":[39],"blockers":[],"cost":2,"display":{"row":40,"col":5,"icon":"node_3"},"properties":{},"effects":[],"id":66},{"display_name":"Jasmine Bloom","desc":"After spending 40 Mana, bloom an area under you that damages enemies below it every 0.4s After every bloom, reset the duration and increase the radius (Max 10 Blocks)","archetype":"Acrobat","archetype_req":12,"parents":[60],"dependencies":[],"blockers":[],"cost":2,"display":{"row":39,"col":7,"icon":"node_3"},"properties":{},"effects":[{"type":"replace_spell","name":"Jasmine Bloom","base_spell":7,"display":"Per Hit","parts":[{"name":"Per Hit","type":"damage","multipliers":[60,5,0,15,0,0]}]}],"id":67},{"display_name":"Better Ricochets","desc":"Add +1 Max Bounce to Ricochets","archetype":"Acrobat","archetype_req":0,"base_abil":5,"parents":[67],"dependencies":[63],"blockers":[],"cost":1,"display":{"row":40,"col":8,"icon":"node_0"},"properties":{},"effects":[],"id":68},{"display_name":"Devour","desc":"Harvester will give +5 Mana","archetype":"Shadestepper","archetype_req":0,"parents":[64],"dependencies":[58],"blockers":[],"cost":1,"display":{"row":41,"col":0,"icon":"node_0"},"properties":{},"effects":[],"id":69},{"display_name":"Better Marked","desc":"Increase Marked's damage bonus by +5%","archetype":"","archetype_req":0,"base_abil":40,"parents":[64],"dependencies":[],"blockers":[],"cost":1,"display":{"row":41,"col":2,"icon":"node_0"},"properties":{},"effects":[{"type":"stat_scaling","slider":true,"slider_name":"Marked","output":[{"type":"stat","name":"damMult.Marked"}],"scaling":[5]}],"id":70}]} \ No newline at end of file diff --git a/js/builder_graph.js b/js/builder_graph.js index cc0255c..373efd4 100644 --- a/js/builder_graph.js +++ b/js/builder_graph.js @@ -121,7 +121,7 @@ class PowderSpecialDisplayNode extends ComputeNode { /** * Node for getting an item's stats from an item input field. * - * Signature: ItemInputNode(powdering: Optional[list[powder]]) => Item | null + * Signature: ItemInputNode() => Item | null */ class ItemInputNode extends InputNode { /** @@ -143,8 +143,6 @@ class ItemInputNode extends InputNode { } compute_func(input_map) { - const powdering = input_map.get('powdering'); - // built on the assumption of no one will type in CI/CR letter by letter let item_text = this.input_field.value; if (!item_text) { @@ -158,10 +156,6 @@ class ItemInputNode extends InputNode { else if (tomeMap.has(item_text)) { item = new Item(tomeMap.get(item_text)); } if (item) { - if (powdering !== undefined) { - const max_slots = item.statMap.get('slots'); - item.statMap.set('powders', powdering.slice(0, max_slots)); - } let type_match; if (this.category == 'weapon') { type_match = item.statMap.get('category') == 'weapon'; @@ -169,12 +163,6 @@ class ItemInputNode extends InputNode { type_match = item.statMap.get('type') == this.none_item.statMap.get('type'); } if (type_match) { - if (item.statMap.get('category') == 'armor') { - applyArmorPowders(item.statMap); - } - else if (item.statMap.get('category') == 'weapon') { - apply_weapon_powders(item.statMap); - } return item; } } @@ -205,6 +193,31 @@ class ItemInputNode extends InputNode { } } +/** + * Node for updating item input fields from parsed items. + * + * Signature: ItemInputDisplayNode(item: Item, powdering: List[powder]) => Item + */ +class ItemPowderingNode extends ComputeNode { + constructor(name) { super(name); } + + compute_func(input_map) { + const powdering = input_map.get('powdering'); + const item = {}; + item.statMap = new Map(input_map.get('item').statMap); // TODO: performance + + const max_slots = item.statMap.get('slots'); + item.statMap.set('powders', powdering.slice(0, max_slots)); + if (item.statMap.get('category') == 'armor') { + applyArmorPowders(item.statMap); + } + else if (item.statMap.get('category') == 'weapon') { + apply_weapon_powders(item.statMap); + } + return item; + } +} + /** * Node for updating item input fields from parsed items. * @@ -217,7 +230,6 @@ class ItemInputDisplayNode extends ComputeNode { this.input_field = document.getElementById(eq+"-choice"); this.health_field = document.getElementById(eq+"-health"); this.level_field = document.getElementById(eq+"-lv"); - this.powder_field = document.getElementById(eq+"-powder"); // possibly None this.image = item_image; this.fail_cb = true; } @@ -242,18 +254,11 @@ class ItemInputDisplayNode extends ComputeNode { this.input_field.classList.add("is-invalid"); return null; } - if (this.powder_field && item.statMap.has('powders')) { - this.powder_field.placeholder = "powders"; - } if (item.statMap.has('NONE')) { return null; } - if (this.powder_field && item.statMap.has('powders')) { - this.powder_field.placeholder = item.statMap.get('slots') + ' slots'; - } - const tier = item.statMap.get('tier'); this.input_field.classList.add(tier); if (this.health_field) { @@ -307,7 +312,8 @@ class WeaponInputDisplayNode extends ComputeNode { const [item] = input_map.values(); // Extract values, pattern match it into size one list and bind to first element const type = item.statMap.get('type'); - this.image.setAttribute('src', '../media/items/new/generic-'+type+'.png'); + this.image.style.backgroundPosition = itemBGPositions[type]; + let dps = get_base_dps(item.statMap); if (isNaN(dps)) { dps = dps[1]; @@ -374,39 +380,39 @@ class URLUpdateNode extends ComputeNode { * Create a "build" object from a set of equipments. * Returns a new Build object, or null if all items are NONE items. * - * Signature: BuildAssembleNode(helmet-input: Item, - * chestplate-input: Item, - * leggings-input: Item, - * boots-input: Item, - * ring1-input: Item, - * ring2-input: Item, - * bracelet-input: Item, - * necklace-input: Item, - * weapon-input: Item, - * level-input: int) => Build | null + * Signature: BuildAssembleNode(helmet: Item, + * chestplate: Item, + * leggings: Item, + * boots: Item, + * ring1: Item, + * ring2: Item, + * bracelet: Item, + * necklace: Item, + * weapon: Item, + * level: int) => Build | null */ class BuildAssembleNode extends ComputeNode { constructor() { super("builder-make-build"); } compute_func(input_map) { let equipments = [ - input_map.get('helmet-input'), - input_map.get('chestplate-input'), - input_map.get('leggings-input'), - input_map.get('boots-input'), - input_map.get('ring1-input'), - input_map.get('ring2-input'), - input_map.get('bracelet-input'), - input_map.get('necklace-input'), - input_map.get('weaponTome1-input'), - input_map.get('weaponTome2-input'), - input_map.get('armorTome1-input'), - input_map.get('armorTome2-input'), - input_map.get('armorTome3-input'), - input_map.get('armorTome4-input'), - input_map.get('guildTome1-input') + input_map.get('helmet'), + input_map.get('chestplate'), + input_map.get('leggings'), + input_map.get('boots'), + input_map.get('ring1'), + input_map.get('ring2'), + input_map.get('bracelet'), + input_map.get('necklace'), + input_map.get('weaponTome1'), + input_map.get('weaponTome2'), + input_map.get('armorTome1'), + input_map.get('armorTome2'), + input_map.get('armorTome3'), + input_map.get('armorTome4'), + input_map.get('guildTome1') ]; - let weapon = input_map.get('weapon-input'); + let weapon = input_map.get('weapon'); let level = parseInt(input_map.get('level-input')); if (isNaN(level)) { level = 106; @@ -429,6 +435,7 @@ class PlayerClassNode extends ValueCheckComputeNode { compute_func(input_map) { if (input_map.size !== 1) { throw "PlayerClassNode accepts exactly one input (build)"; } const [build] = input_map.values(); // Extract values, pattern match it into size one list and bind to first element + if (build.weapon.statMap.has('NONE')) { return null; } return wep_to_class.get(build.weapon.statMap.get('type')); } } @@ -437,15 +444,25 @@ class PlayerClassNode extends ValueCheckComputeNode { * Read an input field and parse into a list of powderings. * Every two characters makes one powder. If parsing fails, NULL is returned. * - * Signature: PowderInputNode() => List[powder] | null + * Signature: PowderInputNode(item: Item) => List[powder] | null */ class PowderInputNode extends InputNode { - constructor(name, input_field) { super(name, input_field); } + constructor(name, input_field) { super(name, input_field); this.fail_cb = true; } compute_func(input_map) { + if (input_map.size !== 1) { throw "PowderInputNode accepts exactly one input (item)"; } + const [item] = input_map.values(); // Extract values, pattern match it into size one list and bind to first element + if (item === null) { + this.input_field.placeholder = 'powders'; + return []; + } + + if (item.statMap.has('slots')) { + this.input_field.placeholder = item.statMap.get('slots') + ' slots'; + } + // TODO: haha improve efficiency to O(n) dumb - // also, error handling is missing let input = this.input_field.value.trim(); let powdering = []; let errorederrors = []; @@ -453,12 +470,29 @@ class PowderInputNode extends InputNode { let first = input.slice(0, 2); let powder = powderIDs.get(first); if (powder === undefined) { - return null; + if (first.length > 0) { + errorederrors.push(first); + } else { + break; + } } else { powdering.push(powder); } input = input.slice(2); } + + if (this.input_field.getAttribute("placeholder") != null) { + if (item.statMap.get('slots') < powdering.length) { + errorederrors.push("Too many powders: " + powdering.length); + } + } + + if (errorederrors.length) { + this.input_field.classList.add("is-invalid"); + } else { + this.input_field.classList.remove("is-invalid"); + } + return powdering; } } @@ -921,9 +955,11 @@ class SumNumberInputNode extends InputNode { } let item_nodes = []; +let item_nodes_map = new Map(); let powder_nodes = []; let edit_input_nodes = []; let skp_inputs = []; +let equip_inputs = []; let build_node; let stat_agg_node; let edit_agg_node; @@ -932,63 +968,65 @@ let atree_graph_creator; function builder_graph_init() { // Phase 1/3: Set up item input, propagate updates, etc. - // Bind item input fields to input nodes, and some display stuff (for auto colorizing stuff). - for (const [eq, display_elem, none_item] of zip3(equipment_fields, build_fields, none_items)) { - let input_field = document.getElementById(eq+"-choice"); - let item_image = document.getElementById(eq+"-img"); - - let item_input = new ItemInputNode(eq+'-input', input_field, none_item); - item_nodes.push(item_input); - new ItemInputDisplayNode(eq+'-input-display', eq, item_image).link_to(item_input); - new ItemDisplayNode(eq+'-item-display', display_elem).link_to(item_input); - //new PrintNode(eq+'-debug').link_to(item_input); - //document.querySelector("#"+eq+"-tooltip").setAttribute("onclick", "collapse_element('#"+ eq +"-tooltip');"); //toggle_plus_minus('" + eq + "-pm'); - } - for (const [eq, none_item] of zip2(tome_fields, [none_tomes[0], none_tomes[0], none_tomes[1], none_tomes[1], none_tomes[1], none_tomes[1], none_tomes[2]])) { - let input_field = document.getElementById(eq+"-choice"); - let item_image = document.getElementById(eq+"-img"); - - let item_input = new ItemInputNode(eq+'-input', input_field, none_item); - item_nodes.push(item_input); - new ItemInputDisplayNode(eq+'-input-display', eq, item_image).link_to(item_input); - } - - // weapon image changer node. - let weapon_image = document.getElementById("weapon-img"); - let weapon_dps = document.getElementById("weapon-dps"); - new WeaponInputDisplayNode('weapon-type', weapon_image, weapon_dps).link_to(item_nodes[8]); - // Level input node. let level_input = new InputNode('level-input', document.getElementById('level-choice')); - - // linking to atree verification - atree_validate.link_to(level_input, 'level'); // "Build" now only refers to equipment and level (no powders). Powders are injected before damage calculation / stat display. build_node = new BuildAssembleNode(); for (const input of item_nodes) { - build_node.link_to(input); } build_node.link_to(level_input); let build_encode_node = new BuildEncodeNode(); build_encode_node.link_to(build_node, 'build'); - let url_update_node = new URLUpdateNode(); - url_update_node.link_to(build_encode_node, 'build-str'); + // Bind item input fields to input nodes, and some display stuff (for auto colorizing stuff). + for (const [eq, display_elem, none_item] of zip3(equipment_fields, build_fields, none_items)) { + let input_field = document.getElementById(eq+"-choice"); + let item_image = document.getElementById(eq+"-img"); - - for (const input of powder_inputs) { - let powder_node = new PowderInputNode(input, document.getElementById(input)); - powder_nodes.push(powder_node); - build_encode_node.link_to(powder_node, input); + let item_input = new ItemInputNode(eq+'-input', input_field, none_item); + equip_inputs.push(item_input); + if (powder_inputs.includes(eq+'-powder')) { // TODO: fragile + const powder_name = eq+'-powder'; + let powder_node = new PowderInputNode(powder_name, document.getElementById(powder_name)) + .link_to(item_input, 'item'); + powder_nodes.push(powder_node); + build_encode_node.link_to(powder_node, powder_name); + let item_powdering = new ItemPowderingNode(eq+'-powder-apply') + .link_to(powder_node, 'powdering').link_to(item_input, 'item'); + item_input = item_powdering; + } + item_nodes.push(item_input); + item_nodes_map.set(eq, item_input); + new ItemInputDisplayNode(eq+'-input-display', eq, item_image).link_to(item_input); + new ItemDisplayNode(eq+'-item-display', display_elem).link_to(item_input); + //new PrintNode(eq+'-debug').link_to(item_input); + //document.querySelector("#"+eq+"-tooltip").setAttribute("onclick", "collapse_element('#"+ eq +"-tooltip');"); //toggle_plus_minus('" + eq + "-pm'); + build_node.link_to(item_input, eq); } - item_nodes[0].link_to(powder_nodes[0], 'powdering'); - item_nodes[1].link_to(powder_nodes[1], 'powdering'); - item_nodes[2].link_to(powder_nodes[2], 'powdering'); - item_nodes[3].link_to(powder_nodes[3], 'powdering'); - item_nodes[8].link_to(powder_nodes[4], 'powdering'); + for (const [eq, none_item] of zip2(tome_fields, [none_tomes[0], none_tomes[0], none_tomes[1], none_tomes[1], none_tomes[1], none_tomes[1], none_tomes[2]])) { + let input_field = document.getElementById(eq+"-choice"); + let item_image = document.getElementById(eq+"-img"); + + let item_input = new ItemInputNode(eq+'-input', input_field, none_item); + equip_inputs.push(item_input); + item_nodes.push(item_input); + new ItemInputDisplayNode(eq+'-input-display', eq, item_image).link_to(item_input); + build_node.link_to(item_input, eq); + } + + // weapon image changer node. + let weapon_image = document.getElementById("weapon-img"); + let weapon_dps = document.getElementById("weapon-dps"); + new WeaponInputDisplayNode('weapon-type', weapon_image, weapon_dps).link_to(item_nodes[8]); + + // linking to atree verification + atree_validate.link_to(level_input, 'level'); + + let url_update_node = new URLUpdateNode(); + url_update_node.link_to(build_encode_node, 'build-str'); // Phase 2/3: Set up editable IDs, skill points; use decodeBuild() skill points, calculate damage @@ -1036,7 +1074,7 @@ function builder_graph_init() { // --------------------------------------------------------------- // Trigger the update cascade for build! // --------------------------------------------------------------- - for (const input_node of item_nodes.concat(powder_nodes)) { + for (const input_node of equip_inputs) { input_node.update(); } armor_powder_node.update(); diff --git a/js/computation_graph.js b/js/computation_graph.js index d144e29..bd46036 100644 --- a/js/computation_graph.js +++ b/js/computation_graph.js @@ -135,7 +135,7 @@ class ComputeNode { } class ValueCheckComputeNode extends ComputeNode { - constructor(name) { super(name); } + constructor(name) { super(name); this.valid_val = null; } /** * Request update of this compute node. Pushes updates to children, @@ -154,14 +154,11 @@ class ValueCheckComputeNode extends ComputeNode { calc_inputs.set(this.input_translation.get(input.name), input.value); } let val = this.compute_func(calc_inputs); - if (val !== this.value) { - super.mark_dirty(2); - } - else { - console.log("soft update"); + if (val !== null) { + if (val !== this.valid_val) { super.mark_dirty(2); } // don't mark dirty if NULL (no update) + this.valid_val = val; } this.value = val; - this.dirty = 0; for (const child of this.children) { child.mark_input_clean(this.name, this.value); diff --git a/js/crafter.js b/js/crafter.js index 865b740..4c19efe 100644 --- a/js/crafter.js +++ b/js/crafter.js @@ -345,9 +345,16 @@ function toggleMaterial(buttonId) { function updateCraftedImage() { let input = document.getElementById("recipe-choice"); if (all_types.includes(input.value)) { - document.getElementById("recipe-img").src = "../media/items/" + (newIcons ? "new/":"old/") + "generic-" + input.value.toLowerCase() + ".png"; + let img = document.getElementById("recipe-img"); + if (["potion", "scroll", "food"].includes(input.value.toLowerCase())) { + img.style.backgroundImage = "url('../media/items/common.png')"; + img.style.backgroundSize = "500% 100%"; + } else { + img.style.backgroundImage = "url('../media/items/" + (newIcons ? "new.png')" : "old.png')"); + img.style.backgroundSize = "1200% 100%"; + } + img.style.backgroundPosition = itemBGPositions[input.value.toLowerCase()] } - } /* Reset all fields diff --git a/js/display.js b/js/display.js index cfc064f..48eefb8 100644 --- a/js/display.js +++ b/js/display.js @@ -1,3 +1,7 @@ +const itemBGPositions = {"bow": "0 0", "spear": "9.090909090909088% 0", "wand": "18.181818181818183% 0", "dagger": "27.27272727272727% 0", "relik": "36.36363636363637% 0", + "helmet": "45.45454545454546% 0", "chestplate": "54.54545454545454% 0", "leggings": "63.63636363636363% 0", "boots": "72.72727272727272% 0", + "ring": "81.81818181818181% 0", "bracelet": "90.90909090909092% 0", "necklace": "100% 0", + "potion": "25% 0", "scroll": "50% 0", "food": "75% 0"}; function apply_elemental_format(p_elem, id, suffix) { suffix = (typeof suffix !== 'undefined') ? suffix : ""; @@ -286,11 +290,18 @@ function displayExpandedItem(item, parent_id){ parent_div.appendChild(nolink_row); if (item.has("type")) { - let img = make_elem("img", [], { - src: "../media/items/" + (newIcons ? "new/":"old/") + "generic-" + item.get("type") + ".png", + let img = make_elem("div", [], { alt: item.get("type"), - style: " z=index: 1; position: relative;" + style: "z-index: 1; position: relative; image-rendering: pixelated; width: 50%; height: 50%; background-position: " + itemBGPositions[item.get("type")] + ";" }); + if (["potion", "scroll", "food"].includes(item.get("type"))) { + img.style.backgroundImage = "url('../media/items/common.png')"; + img.style.backgroundSize = "500% 100%"; + } else { + img.style.backgroundImage = "url('../media/items/" + (newIcons ? "new.png')" : "old.png')"); + img.style.backgroundSize = "1200% 100%"; + } + let container = make_elem("div"); let bckgrd = make_elem("div", ["col", "px-0", "d-flex", "align-items-center", "justify-content-center", 'scaled-bckgrd'], { // , "no-collapse" diff --git a/js/icons.js b/js/icons.js index a796942..f933fc4 100644 --- a/js/icons.js +++ b/js/icons.js @@ -1,33 +1,26 @@ -//which icons to use let window_storage = window.localStorage; -icon_state_stored = window_storage.getItem("newicons"); newIcons = true; -if (icon_state_stored === "false") {toggleIcons()} +if (window_storage.getItem("newicons") === "false") { + toggleIcons(); +} /** Toggle icons on the ENTIRE page. * */ function toggleIcons() { newIcons = !newIcons; - let imgs = document.getElementsByTagName("IMG"); - let favicon = document.querySelector("link[rel~='icon']"); - let toggleiconbutton = document.getElementById("toggle-icon-button"); + window_storage.setItem("newicons", newIcons.toString()); + let newOrOld = (newIcons ? "new" : "old"); - if (newIcons) { //switch to new - favicon.href = favicon.href.replace("media/icons/old","media/icons/new"); - for (const img of imgs) { - if (img.src.includes("media/icons/old")) {img.src = img.src.replace("media/icons/old","media/icons/new");} - if (img.src.includes("media/items/old")) {img.src = img.src.replace("media/items/old","media/items/new");} - } - toggleiconbutton.textContent = "Use Old Icons"; - window_storage.setItem("newicons","true"); - } else { //switch to old - favicon.href = favicon.href.replace("media/icons/new","media/icons/old"); - for (const img of imgs) { - if (img.src.includes("media/icons/new")) {img.src = img.src.replace("media/icons/new","media/icons/old");} - if (img.src.includes("media/items/new")) {img.src = img.src.replace("media/items/new","media/items/old");} - } - toggleiconbutton.textContent = "Use New Icons"; - window_storage.setItem("newicons","false"); - } + let imgs = document.getElementsByTagName("img"); + let divs = document.getElementsByClassName("item-display-new-toggleable"); + let favicon = document.querySelector("link[rel~='icon']"); + favicon.href = favicon.href.replace("media/icons/" + (newIcons ? "old" : "new"), "media/icons/" + newOrOld); + for (const img of imgs) { + // if doesn't contain, replace() does nothing + img.src = img.src.replace("media/icons/" + (newIcons ? "old" : "new"), "media/icons/" + newOrOld); + } + for (let i = 0; i < divs.length; i++) { + divs.item(i).style.backgroundImage = "url('../media/items/" + (newIcons ? "new" : "old") + ".png')"; + } } \ No newline at end of file diff --git a/js/sq2icons.js b/js/sq2icons.js deleted file mode 100644 index 96b97b8..0000000 --- a/js/sq2icons.js +++ /dev/null @@ -1,34 +0,0 @@ -//which icons to use -let window_storage = window.localStorage; -console.log(window_storage); -icon_state_stored = window_storage.getItem("newicons"); -newIcons = true; -if (icon_state_stored === "false") {toggleIcons()} - - -/** Toggle icons on the ENTIRE page. - * - */ - function toggleIcons() { - newIcons = !newIcons; - let imgs = document.getElementsByTagName("IMG"); - let favicon = document.querySelector("link[rel~='icon']"); - - if (newIcons) { //switch to new - favicon.href = favicon.href.replace("media/icons/old","media/icons/new"); - for (const img of imgs) { - if (img.src.includes("media/icons/old")) {img.src = img.src.replace("media/icons/old","media/icons/new");} - if (img.src.includes("media/items/old")) {img.src = img.src.replace("media/items/old","media/items/new");} - } - //toggleiconbutton.textContent = "Use Old Icons"; - window_storage.setItem("newicons","true"); - } else { //switch to old - favicon.href = favicon.href.replace("media/icons/new","media/icons/old"); - for (const img of imgs) { - if (img.src.includes("media/icons/new")) {img.src = img.src.replace("media/icons/new","media/icons/old");} - if (img.src.includes("media/items/new")) {img.src = img.src.replace("media/items/new","media/items/old");} - } - //toggleiconbutton.textContent = "Use New Icons"; - window_storage.setItem("newicons","false"); - } -} \ No newline at end of file diff --git a/media/atree/connect_0011.png b/media/atree/connect_0011.png deleted file mode 100644 index 24b75d6..0000000 Binary files a/media/atree/connect_0011.png and /dev/null differ diff --git a/media/atree/connect_0011_1.png b/media/atree/connect_0011_1.png deleted file mode 100644 index d3294b3..0000000 Binary files a/media/atree/connect_0011_1.png and /dev/null differ diff --git a/media/atree/connect_0101.png b/media/atree/connect_0101.png deleted file mode 100644 index 46c28e7..0000000 Binary files a/media/atree/connect_0101.png and /dev/null differ diff --git a/media/atree/connect_0101_1.png b/media/atree/connect_0101_1.png deleted file mode 100644 index 774f2e8..0000000 Binary files a/media/atree/connect_0101_1.png and /dev/null differ diff --git a/media/atree/connect_0110.png b/media/atree/connect_0110.png deleted file mode 100644 index 56a1678..0000000 Binary files a/media/atree/connect_0110.png and /dev/null differ diff --git a/media/atree/connect_0110_1.png b/media/atree/connect_0110_1.png deleted file mode 100644 index 4d725d9..0000000 Binary files a/media/atree/connect_0110_1.png and /dev/null differ diff --git a/media/atree/connect_0111.png b/media/atree/connect_0111.png deleted file mode 100644 index 5ab0abb..0000000 Binary files a/media/atree/connect_0111.png and /dev/null differ diff --git a/media/atree/connect_0111_0011.png b/media/atree/connect_0111_0011.png deleted file mode 100644 index 28ea1e3..0000000 Binary files a/media/atree/connect_0111_0011.png and /dev/null differ diff --git a/media/atree/connect_0111_0101.png b/media/atree/connect_0111_0101.png deleted file mode 100644 index 68e417f..0000000 Binary files a/media/atree/connect_0111_0101.png and /dev/null differ diff --git a/media/atree/connect_0111_0110.png b/media/atree/connect_0111_0110.png deleted file mode 100644 index 9f6db4f..0000000 Binary files a/media/atree/connect_0111_0110.png and /dev/null differ diff --git a/media/atree/connect_0111_0111.png b/media/atree/connect_0111_0111.png deleted file mode 100644 index dbf7712..0000000 Binary files a/media/atree/connect_0111_0111.png and /dev/null differ diff --git a/media/atree/connect_1001.png b/media/atree/connect_1001.png deleted file mode 100644 index 257b7ca..0000000 Binary files a/media/atree/connect_1001.png and /dev/null differ diff --git a/media/atree/connect_1001_1.png b/media/atree/connect_1001_1.png deleted file mode 100644 index 748a9c0..0000000 Binary files a/media/atree/connect_1001_1.png and /dev/null differ diff --git a/media/atree/connect_1010.png b/media/atree/connect_1010.png deleted file mode 100644 index 75ca3bb..0000000 Binary files a/media/atree/connect_1010.png and /dev/null differ diff --git a/media/atree/connect_1010_1.png b/media/atree/connect_1010_1.png deleted file mode 100644 index 9c8bec9..0000000 Binary files a/media/atree/connect_1010_1.png and /dev/null differ diff --git a/media/atree/connect_1011.png b/media/atree/connect_1011.png deleted file mode 100644 index 8202dde..0000000 Binary files a/media/atree/connect_1011.png and /dev/null differ diff --git a/media/atree/connect_1011_0011.png b/media/atree/connect_1011_0011.png deleted file mode 100644 index a396d85..0000000 Binary files a/media/atree/connect_1011_0011.png and /dev/null differ diff --git a/media/atree/connect_1011_1001.png b/media/atree/connect_1011_1001.png deleted file mode 100644 index 7a3862a..0000000 Binary files a/media/atree/connect_1011_1001.png and /dev/null differ diff --git a/media/atree/connect_1011_1010.png b/media/atree/connect_1011_1010.png deleted file mode 100644 index d4fc9bd..0000000 Binary files a/media/atree/connect_1011_1010.png and /dev/null differ diff --git a/media/atree/connect_1011_1011.png b/media/atree/connect_1011_1011.png deleted file mode 100644 index d4b62d3..0000000 Binary files a/media/atree/connect_1011_1011.png and /dev/null differ diff --git a/media/atree/connect_1100.png b/media/atree/connect_1100.png deleted file mode 100644 index 779aa18..0000000 Binary files a/media/atree/connect_1100.png and /dev/null differ diff --git a/media/atree/connect_1100_1.png b/media/atree/connect_1100_1.png deleted file mode 100644 index 2908815..0000000 Binary files a/media/atree/connect_1100_1.png and /dev/null differ diff --git a/media/atree/connect_1101.png b/media/atree/connect_1101.png deleted file mode 100644 index 692e29b..0000000 Binary files a/media/atree/connect_1101.png and /dev/null differ diff --git a/media/atree/connect_1101_0101.png b/media/atree/connect_1101_0101.png deleted file mode 100644 index 5203cef..0000000 Binary files a/media/atree/connect_1101_0101.png and /dev/null differ diff --git a/media/atree/connect_1101_1001.png b/media/atree/connect_1101_1001.png deleted file mode 100644 index e33ed5c..0000000 Binary files a/media/atree/connect_1101_1001.png and /dev/null differ diff --git a/media/atree/connect_1101_1100.png b/media/atree/connect_1101_1100.png deleted file mode 100644 index 7a41664..0000000 Binary files a/media/atree/connect_1101_1100.png and /dev/null differ diff --git a/media/atree/connect_1101_1101.png b/media/atree/connect_1101_1101.png deleted file mode 100644 index 83756fc..0000000 Binary files a/media/atree/connect_1101_1101.png and /dev/null differ diff --git a/media/atree/connect_1110.png b/media/atree/connect_1110.png deleted file mode 100644 index 44d0352..0000000 Binary files a/media/atree/connect_1110.png and /dev/null differ diff --git a/media/atree/connect_1110_0110.png b/media/atree/connect_1110_0110.png deleted file mode 100644 index 35a8eb5..0000000 Binary files a/media/atree/connect_1110_0110.png and /dev/null differ diff --git a/media/atree/connect_1110_1010.png b/media/atree/connect_1110_1010.png deleted file mode 100644 index 4a08b8c..0000000 Binary files a/media/atree/connect_1110_1010.png and /dev/null differ diff --git a/media/atree/connect_1110_1100.png b/media/atree/connect_1110_1100.png deleted file mode 100644 index de9a81b..0000000 Binary files a/media/atree/connect_1110_1100.png and /dev/null differ diff --git a/media/atree/connect_1110_1110.png b/media/atree/connect_1110_1110.png deleted file mode 100644 index 8390a7e..0000000 Binary files a/media/atree/connect_1110_1110.png and /dev/null differ diff --git a/media/atree/connect_1111.png b/media/atree/connect_1111.png deleted file mode 100644 index 0b27703..0000000 Binary files a/media/atree/connect_1111.png and /dev/null differ diff --git a/media/atree/connect_1111_0011.png b/media/atree/connect_1111_0011.png deleted file mode 100644 index 3229c68..0000000 Binary files a/media/atree/connect_1111_0011.png and /dev/null differ diff --git a/media/atree/connect_1111_0101.png b/media/atree/connect_1111_0101.png deleted file mode 100644 index aa78213..0000000 Binary files a/media/atree/connect_1111_0101.png and /dev/null differ diff --git a/media/atree/connect_1111_0110.png b/media/atree/connect_1111_0110.png deleted file mode 100644 index fcef42f..0000000 Binary files a/media/atree/connect_1111_0110.png and /dev/null differ diff --git a/media/atree/connect_1111_0111.png b/media/atree/connect_1111_0111.png deleted file mode 100644 index d54fa1d..0000000 Binary files a/media/atree/connect_1111_0111.png and /dev/null differ diff --git a/media/atree/connect_1111_1001.png b/media/atree/connect_1111_1001.png deleted file mode 100644 index be7c221..0000000 Binary files a/media/atree/connect_1111_1001.png and /dev/null differ diff --git a/media/atree/connect_1111_1010.png b/media/atree/connect_1111_1010.png deleted file mode 100644 index 803f74a..0000000 Binary files a/media/atree/connect_1111_1010.png and /dev/null differ diff --git a/media/atree/connect_1111_1011.png b/media/atree/connect_1111_1011.png deleted file mode 100644 index b67f2e8..0000000 Binary files a/media/atree/connect_1111_1011.png and /dev/null differ diff --git a/media/atree/connect_1111_1100.png b/media/atree/connect_1111_1100.png deleted file mode 100644 index 28bbe5a..0000000 Binary files a/media/atree/connect_1111_1100.png and /dev/null differ diff --git a/media/atree/connect_1111_1101.png b/media/atree/connect_1111_1101.png deleted file mode 100644 index 4823513..0000000 Binary files a/media/atree/connect_1111_1101.png and /dev/null differ diff --git a/media/atree/connect_1111_1110.png b/media/atree/connect_1111_1110.png deleted file mode 100644 index 92f9919..0000000 Binary files a/media/atree/connect_1111_1110.png and /dev/null differ diff --git a/media/atree/connect_1111_1111.png b/media/atree/connect_1111_1111.png deleted file mode 100644 index ec468ba..0000000 Binary files a/media/atree/connect_1111_1111.png and /dev/null differ diff --git a/media/atree/connectors.png b/media/atree/connectors.png new file mode 100644 index 0000000..b68ce89 Binary files /dev/null and b/media/atree/connectors.png differ diff --git a/media/atree/icons.png b/media/atree/icons.png new file mode 100644 index 0000000..fcbc48d Binary files /dev/null and b/media/atree/icons.png differ diff --git a/media/atree/node-blocked.png b/media/atree/node-blocked.png deleted file mode 100644 index e88055e..0000000 Binary files a/media/atree/node-blocked.png and /dev/null differ diff --git a/media/atree/node-selected.png b/media/atree/node-selected.png deleted file mode 100644 index 3fb8d34..0000000 Binary files a/media/atree/node-selected.png and /dev/null differ diff --git a/media/atree/node.png b/media/atree/node.png deleted file mode 100644 index 77b96dc..0000000 Binary files a/media/atree/node.png and /dev/null differ diff --git a/media/atree/node_0.png b/media/atree/node_0.png deleted file mode 100644 index a3ed215..0000000 Binary files a/media/atree/node_0.png and /dev/null differ diff --git a/media/atree/node_0_blocked.png b/media/atree/node_0_blocked.png deleted file mode 100644 index 4f42329..0000000 Binary files a/media/atree/node_0_blocked.png and /dev/null differ diff --git a/media/atree/node_0_selected.png b/media/atree/node_0_selected.png deleted file mode 100644 index e5301e1..0000000 Binary files a/media/atree/node_0_selected.png and /dev/null differ diff --git a/media/atree/node_1.png b/media/atree/node_1.png deleted file mode 100644 index 23aa084..0000000 Binary files a/media/atree/node_1.png and /dev/null differ diff --git a/media/atree/node_1_blocked.png b/media/atree/node_1_blocked.png deleted file mode 100644 index 3bc9681..0000000 Binary files a/media/atree/node_1_blocked.png and /dev/null differ diff --git a/media/atree/node_1_selected.png b/media/atree/node_1_selected.png deleted file mode 100644 index 405da77..0000000 Binary files a/media/atree/node_1_selected.png and /dev/null differ diff --git a/media/atree/node_2.png b/media/atree/node_2.png deleted file mode 100644 index 9e525ec..0000000 Binary files a/media/atree/node_2.png and /dev/null differ diff --git a/media/atree/node_2_blocked.png b/media/atree/node_2_blocked.png deleted file mode 100644 index ca9586e..0000000 Binary files a/media/atree/node_2_blocked.png and /dev/null differ diff --git a/media/atree/node_2_selected.png b/media/atree/node_2_selected.png deleted file mode 100644 index 9a01757..0000000 Binary files a/media/atree/node_2_selected.png and /dev/null differ diff --git a/media/atree/node_3.png b/media/atree/node_3.png deleted file mode 100644 index 71f7c67..0000000 Binary files a/media/atree/node_3.png and /dev/null differ diff --git a/media/atree/node_3_blocked.png b/media/atree/node_3_blocked.png deleted file mode 100644 index 544241d..0000000 Binary files a/media/atree/node_3_blocked.png and /dev/null differ diff --git a/media/atree/node_3_selected.png b/media/atree/node_3_selected.png deleted file mode 100644 index 5eafce3..0000000 Binary files a/media/atree/node_3_selected.png and /dev/null differ diff --git a/media/atree/node_archer.png b/media/atree/node_archer.png deleted file mode 100644 index 5f00770..0000000 Binary files a/media/atree/node_archer.png and /dev/null differ diff --git a/media/atree/node_archer_blocked.png b/media/atree/node_archer_blocked.png deleted file mode 100644 index 30651d6..0000000 Binary files a/media/atree/node_archer_blocked.png and /dev/null differ diff --git a/media/atree/node_archer_selected.png b/media/atree/node_archer_selected.png deleted file mode 100644 index e48bb68..0000000 Binary files a/media/atree/node_archer_selected.png and /dev/null differ diff --git a/media/atree/node_assassin.png b/media/atree/node_assassin.png deleted file mode 100644 index 62ffcd4..0000000 Binary files a/media/atree/node_assassin.png and /dev/null differ diff --git a/media/atree/node_assassin_blocked.png b/media/atree/node_assassin_blocked.png deleted file mode 100644 index b9dc9a9..0000000 Binary files a/media/atree/node_assassin_blocked.png and /dev/null differ diff --git a/media/atree/node_assassin_selected.png b/media/atree/node_assassin_selected.png deleted file mode 100644 index 7d88a0f..0000000 Binary files a/media/atree/node_assassin_selected.png and /dev/null differ diff --git a/media/atree/node_mage.png b/media/atree/node_mage.png deleted file mode 100644 index 4086888..0000000 Binary files a/media/atree/node_mage.png and /dev/null differ diff --git a/media/atree/node_mage_blocked.png b/media/atree/node_mage_blocked.png deleted file mode 100644 index 15d26fc..0000000 Binary files a/media/atree/node_mage_blocked.png and /dev/null differ diff --git a/media/atree/node_mage_selected.png b/media/atree/node_mage_selected.png deleted file mode 100644 index 783a4a2..0000000 Binary files a/media/atree/node_mage_selected.png and /dev/null differ diff --git a/media/atree/node_shaman.png b/media/atree/node_shaman.png deleted file mode 100644 index 4c88259..0000000 Binary files a/media/atree/node_shaman.png and /dev/null differ diff --git a/media/atree/node_shaman_blocked.png b/media/atree/node_shaman_blocked.png deleted file mode 100644 index 49ae366..0000000 Binary files a/media/atree/node_shaman_blocked.png and /dev/null differ diff --git a/media/atree/node_shaman_selected.png b/media/atree/node_shaman_selected.png deleted file mode 100644 index 172a199..0000000 Binary files a/media/atree/node_shaman_selected.png and /dev/null differ diff --git a/media/atree/node_warrior.png b/media/atree/node_warrior.png deleted file mode 100644 index 9961b55..0000000 Binary files a/media/atree/node_warrior.png and /dev/null differ diff --git a/media/atree/node_warrior_blocked.png b/media/atree/node_warrior_blocked.png deleted file mode 100644 index cd44a93..0000000 Binary files a/media/atree/node_warrior_blocked.png and /dev/null differ diff --git a/media/atree/node_warrior_selected.png b/media/atree/node_warrior_selected.png deleted file mode 100644 index e1db61a..0000000 Binary files a/media/atree/node_warrior_selected.png and /dev/null differ diff --git a/media/items/common.png b/media/items/common.png new file mode 100644 index 0000000..417c2ec Binary files /dev/null and b/media/items/common.png differ diff --git a/media/items/new.png b/media/items/new.png new file mode 100644 index 0000000..9a498f6 Binary files /dev/null and b/media/items/new.png differ diff --git a/media/items/new/generic-armorTome.png b/media/items/new/generic-armorTome.png deleted file mode 100644 index ba0833b..0000000 Binary files a/media/items/new/generic-armorTome.png and /dev/null differ diff --git a/media/items/new/generic-boots.png b/media/items/new/generic-boots.png deleted file mode 100644 index 35198d7..0000000 Binary files a/media/items/new/generic-boots.png and /dev/null differ diff --git a/media/items/new/generic-bow.png b/media/items/new/generic-bow.png deleted file mode 100644 index 9ab6c2a..0000000 Binary files a/media/items/new/generic-bow.png and /dev/null differ diff --git a/media/items/new/generic-bracelet.png b/media/items/new/generic-bracelet.png deleted file mode 100644 index 4683abe..0000000 Binary files a/media/items/new/generic-bracelet.png and /dev/null differ diff --git a/media/items/new/generic-chestplate.png b/media/items/new/generic-chestplate.png deleted file mode 100644 index 1231eae..0000000 Binary files a/media/items/new/generic-chestplate.png and /dev/null differ diff --git a/media/items/new/generic-dagger.png b/media/items/new/generic-dagger.png deleted file mode 100644 index dadc4c1..0000000 Binary files a/media/items/new/generic-dagger.png and /dev/null differ diff --git a/media/items/new/generic-food.png b/media/items/new/generic-food.png deleted file mode 100644 index 71c579c..0000000 Binary files a/media/items/new/generic-food.png and /dev/null differ diff --git a/media/items/new/generic-guildTome.png b/media/items/new/generic-guildTome.png deleted file mode 100644 index ba0833b..0000000 Binary files a/media/items/new/generic-guildTome.png and /dev/null differ diff --git a/media/items/new/generic-helmet.png b/media/items/new/generic-helmet.png deleted file mode 100644 index e8230b0..0000000 Binary files a/media/items/new/generic-helmet.png and /dev/null differ diff --git a/media/items/new/generic-leggings.png b/media/items/new/generic-leggings.png deleted file mode 100644 index 845fa01..0000000 Binary files a/media/items/new/generic-leggings.png and /dev/null differ diff --git a/media/items/new/generic-necklace.png b/media/items/new/generic-necklace.png deleted file mode 100644 index bbaa89f..0000000 Binary files a/media/items/new/generic-necklace.png and /dev/null differ diff --git a/media/items/new/generic-potion.png b/media/items/new/generic-potion.png deleted file mode 100644 index 53c29d0..0000000 Binary files a/media/items/new/generic-potion.png and /dev/null differ diff --git a/media/items/new/generic-relik.png b/media/items/new/generic-relik.png deleted file mode 100644 index ae690ba..0000000 Binary files a/media/items/new/generic-relik.png and /dev/null differ diff --git a/media/items/new/generic-ring.png b/media/items/new/generic-ring.png deleted file mode 100644 index b910021..0000000 Binary files a/media/items/new/generic-ring.png and /dev/null differ diff --git a/media/items/new/generic-scroll.png b/media/items/new/generic-scroll.png deleted file mode 100644 index ed4e8fd..0000000 Binary files a/media/items/new/generic-scroll.png and /dev/null differ diff --git a/media/items/new/generic-spear.png b/media/items/new/generic-spear.png deleted file mode 100644 index 89c46ab..0000000 Binary files a/media/items/new/generic-spear.png and /dev/null differ diff --git a/media/items/new/generic-sword.png b/media/items/new/generic-sword.png deleted file mode 100644 index 05243d0..0000000 Binary files a/media/items/new/generic-sword.png and /dev/null differ diff --git a/media/items/new/generic-wand.png b/media/items/new/generic-wand.png deleted file mode 100644 index cfebab9..0000000 Binary files a/media/items/new/generic-wand.png and /dev/null differ diff --git a/media/items/new/generic-weaponTome.png b/media/items/new/generic-weaponTome.png deleted file mode 100644 index ba0833b..0000000 Binary files a/media/items/new/generic-weaponTome.png and /dev/null differ diff --git a/media/items/new/palette.png b/media/items/new/palette.png deleted file mode 100644 index af1b1d5..0000000 Binary files a/media/items/new/palette.png and /dev/null differ diff --git a/media/items/old.png b/media/items/old.png new file mode 100644 index 0000000..d44a097 Binary files /dev/null and b/media/items/old.png differ diff --git a/media/items/old/generic-armorTome.png b/media/items/old/generic-armorTome.png deleted file mode 100644 index c46428d..0000000 Binary files a/media/items/old/generic-armorTome.png and /dev/null differ diff --git a/media/items/old/generic-boots.png b/media/items/old/generic-boots.png deleted file mode 100644 index e74bc1b..0000000 Binary files a/media/items/old/generic-boots.png and /dev/null differ diff --git a/media/items/old/generic-bow.png b/media/items/old/generic-bow.png deleted file mode 100644 index 1313b1d..0000000 Binary files a/media/items/old/generic-bow.png and /dev/null differ diff --git a/media/items/old/generic-bracelet.png b/media/items/old/generic-bracelet.png deleted file mode 100644 index 3dc5df2..0000000 Binary files a/media/items/old/generic-bracelet.png and /dev/null differ diff --git a/media/items/old/generic-chestplate.png b/media/items/old/generic-chestplate.png deleted file mode 100644 index 0f90a4c..0000000 Binary files a/media/items/old/generic-chestplate.png and /dev/null differ diff --git a/media/items/old/generic-dagger.png b/media/items/old/generic-dagger.png deleted file mode 100644 index f90e830..0000000 Binary files a/media/items/old/generic-dagger.png and /dev/null differ diff --git a/media/items/old/generic-food.png b/media/items/old/generic-food.png deleted file mode 100644 index afdaa5a..0000000 Binary files a/media/items/old/generic-food.png and /dev/null differ diff --git a/media/items/old/generic-guildTome.png b/media/items/old/generic-guildTome.png deleted file mode 100644 index c46428d..0000000 Binary files a/media/items/old/generic-guildTome.png and /dev/null differ diff --git a/media/items/old/generic-helmet.png b/media/items/old/generic-helmet.png deleted file mode 100644 index c085f9d..0000000 Binary files a/media/items/old/generic-helmet.png and /dev/null differ diff --git a/media/items/old/generic-leggings.png b/media/items/old/generic-leggings.png deleted file mode 100644 index 0747218..0000000 Binary files a/media/items/old/generic-leggings.png and /dev/null differ diff --git a/media/items/old/generic-necklace.png b/media/items/old/generic-necklace.png deleted file mode 100644 index 6f7d81a..0000000 Binary files a/media/items/old/generic-necklace.png and /dev/null differ diff --git a/media/items/old/generic-potion.png b/media/items/old/generic-potion.png deleted file mode 100644 index 93b4b7e..0000000 Binary files a/media/items/old/generic-potion.png and /dev/null differ diff --git a/media/items/old/generic-relik.png b/media/items/old/generic-relik.png deleted file mode 100644 index 0593e15..0000000 Binary files a/media/items/old/generic-relik.png and /dev/null differ diff --git a/media/items/old/generic-ring.png b/media/items/old/generic-ring.png deleted file mode 100644 index 744ba7f..0000000 Binary files a/media/items/old/generic-ring.png and /dev/null differ diff --git a/media/items/old/generic-scroll.png b/media/items/old/generic-scroll.png deleted file mode 100644 index 168a430..0000000 Binary files a/media/items/old/generic-scroll.png and /dev/null differ diff --git a/media/items/old/generic-spear.png b/media/items/old/generic-spear.png deleted file mode 100644 index 96299d6..0000000 Binary files a/media/items/old/generic-spear.png and /dev/null differ diff --git a/media/items/old/generic-sword.png b/media/items/old/generic-sword.png deleted file mode 100644 index 3317427..0000000 Binary files a/media/items/old/generic-sword.png and /dev/null differ diff --git a/media/items/old/generic-wand.png b/media/items/old/generic-wand.png deleted file mode 100644 index 2aa60f5..0000000 Binary files a/media/items/old/generic-wand.png and /dev/null differ diff --git a/media/items/old/generic-weaponTome.png b/media/items/old/generic-weaponTome.png deleted file mode 100644 index c46428d..0000000 Binary files a/media/items/old/generic-weaponTome.png and /dev/null differ