Damage Stats
@@ -1390,6 +1404,8 @@
+
+
@@ -1404,6 +1420,7 @@
+
diff --git a/css/sq2bs.css b/css/sq2bs.css
index e349002..0532fc0 100644
--- a/css/sq2bs.css
+++ b/css/sq2bs.css
@@ -447,4 +447,39 @@ a:hover {
.button {
border-color: #fff;
-}
\ No newline at end of file
+}
+
+/* atree connector rotations */
+.rotate-90 {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.rotate-180 {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.rotate-270 {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+
+
+
+.hide-scroll {
+ -ms-overflow-style: none; /* Internet Explorer 10+ */
+ scrollbar-width: none; /* Firefox */
+}
+.hide-scroll::-webkit-scrollbar {
+ display: none; /* Safari and Chrome */
+}
diff --git a/js/atree_constants.js b/js/atree_constants.js
new file mode 100644
index 0000000..add793f
--- /dev/null
+++ b/js/atree_constants.js
@@ -0,0 +1,4099 @@
+const atrees =
+{
+ "Archer": [
+ {
+ "display_name": "Arrow Shield",
+ "desc": "Create a shield around you that deal damage and knockback mobs when triggered. (2 Charges)",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Power Shots", "Cheaper Escape"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 9,
+ "col": 6
+ },
+ "properties": {
+ "duration": 60
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Arrow Shield",
+ "cost": 30,
+ "display_text": "Max Damage",
+ "base_spell": 4,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "",
+ "parts": [
+ {
+ "name": "Shield Damage",
+ "type": "damage",
+ "multipliers": [90, 0, 0, 0, 0, 10]
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "Shield Damage": 2
+ }
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Escape",
+ "desc": "Throw yourself backward to avoid danger. (Hold shift while escaping to cancel)",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Heart Shatter"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 7,
+ "col": 4
+ },
+ "properties": {
+ "aoe": 0,
+ "range": 0
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Escape",
+ "cost": 25,
+ "display_text": "Max Damage",
+ "base_spell": 2,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "Total Damage",
+ "parts": [
+ {
+ "name": "None",
+ "type": "damage",
+ "multipliers": [0, 0, 0, 0, 0, 0]
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "None": 0
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "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)",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": [],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 0,
+ "col": 4
+ },
+ "properties": {
+ "aoe": 4.5,
+ "range": 26
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Arrow Bomb",
+ "cost": 50,
+ "display_text": "Average Damage",
+ "base_spell": 3,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "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
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Heart Shatter",
+ "desc": "If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Bow Proficiency I"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 4,
+ "col": 4
+ },
+ "properties": {},
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Arrow Bomb",
+ "cost": 0,
+ "multipliers": [100, 0, 0, 0, 0, 0]
+ },
+ {
+
+ }
+ ]
+ },
+ {
+ "display_name": "Fire Creep",
+ "desc": "Arrow Bomb will leak a trail of fire for 6s, Damaging enemies that walk into it every 0.4s.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Phantom Ray", "Fire Mastery", "Bryophyte Roots"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 16,
+ "col": 6
+ },
+ "properties": {
+ "aoe": 0.8,
+ "duration": 6
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Fire Creep",
+ "cost": 0,
+ "multipliers": [30, 0, 0, 0, 20, 0]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Fire Creep": 15
+ }
+ }
+ ]
+ },
+ {
+ "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.",
+ "archetype": "Trapper",
+ "archetype_req": 1,
+ "parents": ["Fire Creep", "Earth Mastery"],
+ "dependencies": ["Arrow Storm"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 16,
+ "col": 8
+ },
+ "properties": {
+ "aoe": 2,
+ "duration": 5,
+ "slowness": 0.4
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Bryophyte Roots",
+ "cost": 0,
+ "multipliers": [40, 20, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Nimble String",
+ "desc": "Arrow Storm throw out +8 arrows per stream and shoot twice as fast.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Thunder Mastery", "Arrow Rain"],
+ "dependencies": ["Arrow Storm"],
+ "blockers": ["Phantom Ray"],
+ "cost": 2,
+ "display": {
+ "row": 15,
+ "col": 2
+ },
+ "properties": {
+ "shootspeed": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Arrow",
+ "cost": 0,
+ "multipliers": [-15, 0, 0, 0, 0, 0]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Stream",
+ "cost": 0,
+ "hits": {
+ "Single Arrow": 8
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Arrow Storm",
+ "desc": "Shoot two stream of 8 arrows, dealing significant damage to close mobs and pushing them back.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Double Shots", "Cheaper Escape"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 9,
+ "col": 2
+ },
+ "properties": {
+ "aoe": 0,
+ "range": 16
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Arrow Storm",
+ "cost": 40,
+ "display_text": "Max Damage",
+ "base_spell": 1,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "Total Damage",
+ "parts": [
+ {
+ "name": "Single Arrow",
+ "type": "damage",
+ "multipliers": [30, 0, 10, 0, 0, 0]
+ },
+ {
+ "name": "Single Stream",
+ "type": "total",
+ "hits": {
+ "Single Arrow": 8
+ }
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "Single Stream": 2
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "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,
+ "parents": ["Triple Shots", "Frenzy"],
+ "dependencies": ["Arrow Shield"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 19,
+ "col": 1
+ },
+ "properties": {
+ "range": 4,
+ "duration": 60,
+ "shots": 8,
+ "count": 2
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Guardian Angels",
+ "cost": 30,
+ "display_text": "Total Damage Average",
+ "base_spell": 4,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "Total Damage",
+ "parts": [
+ {
+ "name": "Single Arrow",
+ "type": "damage",
+ "multipliers": [40, 0, 0, 0, 0, 20]
+ },
+ {
+ "name": "Single Bow",
+ "type": "total",
+ "hits": {
+ "Single Arrow": 8
+ }
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "Single Bow": 2
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Windy Feet",
+ "base_abil": "Escape",
+ "desc": "When casting Escape, give speed to yourself and nearby allies.",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Arrow Storm"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 10,
+ "col": 1
+ },
+ "properties": {
+ "aoe": 8,
+ "duration": 120
+ },
+ "type": "stat_bonus",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "spd",
+ "value": 20
+ }
+ ]
+ },
+ {
+ "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": ["Bryophyte Roots"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 19,
+ "col": 8
+ },
+ "properties": {
+ "aoe": 7,
+ "traps": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Basaltic Trap",
+ "cost": 0,
+ "multipliers": [140, 30, 0, 0, 30, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Windstorm",
+ "desc": "Arrow Storm shoot +1 stream of arrows, effectively doubling its damage.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Guardian Angels", "Cheaper Arrow Storm"],
+ "dependencies": [],
+ "blockers": ["Phantom Ray"],
+ "cost": 2,
+ "display": {
+ "row": 21,
+ "col": 1
+ },
+ "properties": {},
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Arrow",
+ "cost": 0,
+ "multipliers": [-11, 0, -7, 0, 0, 3]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Single Stream": 1
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Grappling Hook",
+ "base_abil": "Escape",
+ "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": ["Focus", "More Shields", "Cheaper Arrow Storm"],
+ "dependencies": [],
+ "blockers": ["Escape Artist"],
+ "cost": 2,
+ "display": {
+ "row": 21,
+ "col": 5
+ },
+ "properties": {
+ "range": 20
+ },
+ "effects": [
+ ]
+ },
+ {
+ "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,
+ "parents": ["Grappling Hook", "More Shields"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 22,
+ "col": 6
+ },
+ "properties": {},
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Arrow Bomb",
+ "cost": 0,
+ "multipliers": [40, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "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": ["More Focus", "Traveler"],
+ "dependencies": ["Focus"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 25,
+ "col": 4
+ },
+ "properties": {
+ "range": 64,
+ "focusReq": 2
+ },
+ "effects": [
+
+ {
+ "type": "replace_spell",
+ "name": "Twain's Arc",
+ "cost": 0,
+ "display_text": "Twain's Arc",
+ "base_spell": 5,
+ "spell_type": "damage",
+ "scaling": "melee",
+ "display": "Twain's Arc Damage",
+ "parts": [
+ {
+ "name": "Twain's Arc Damage",
+ "type": "damage",
+ "multipliers": [200, 0, 0, 0, 0, 0]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Fierce Stomp",
+ "desc": "When using Escape, hold shift to quickly drop down and deal damage.",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Refined Gunpowder", "Traveler"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 26,
+ "col": 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": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Fierce Stomp": 1
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Scorched Earth",
+ "desc": "Fire Creep become much stronger.",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Twain's Arc"],
+ "dependencies": ["Fire Creep"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 26 ,
+ "col": 5
+ },
+ "properties": {
+ "duration": 2,
+ "aoe": 0.4
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Fire Creep",
+ "cost": 0,
+ "multipliers": [10, 0, 0, 0, 5, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Leap",
+ "desc": "When you double tap jump, leap foward. (2s Cooldown)",
+ "archetype": "Boltslinger",
+ "archetype_req": 5,
+ "parents": ["Refined Gunpowder", "Homing Shots"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 0
+ },
+ "properties": {
+ "cooldown": 2
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "display_name": "Shocking Bomb",
+ "desc": "Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder.",
+ "archetype": "Sharpshooter",
+ "archetype_req": 5,
+ "parents": ["Twain's Arc", "Better Arrow Shield", "Homing Shots"],
+ "dependencies": ["Arrow Bomb"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 4
+ },
+ "properties": {
+ "gravity": 0
+ },
+ "effects": [
+ {
+ "type": "convert_spell_conv",
+ "target_part": "all",
+ "conversion": "thunder"
+ }
+ ]
+ },
+ {
+ "display_name": "Mana Trap",
+ "desc": "Your Traps will give you 4 Mana per second when you stay close to them.",
+ "archetype": "Trapper",
+ "archetype_req": 5,
+ "parents": ["More Traps", "Better Arrow Shield"],
+ "dependencies": ["Fire Creep"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 8
+ },
+ "properties": {
+ "range": 12,
+ "manaRegen": 4
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Basaltic Trap",
+ "cost": 10,
+ "multipliers": [0, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Escape Artist",
+ "desc": "When casting Escape, release 100 arrows towards the ground.",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Better Guardian Angels", "Leap"],
+ "dependencies": [],
+ "blockers": ["Grappling Hook"],
+ "cost": 2,
+ "display": {
+ "row": 31,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "target_part": "Escape Artist",
+ "cost": 0,
+ "multipliers": [30, 0, 10, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "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": ["Shocking Bomb", "Better Arrow Shield", "Cheaper Arrow Storm (2)"],
+ "dependencies": ["Focus"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 31,
+ "col": 5
+ },
+ "properties": {
+ "focus": 1,
+ "timer": 5
+ },
+ "type": "stat_bonus",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "damPct",
+ "value": 50
+ }
+ ]
+ },
+ {
+ "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,
+ "parents": ["Initiator", "Cheaper Arrow Storm (2)"],
+ "dependencies": ["Arrow Shield"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 32,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Call of the Hound",
+ "cost": 0,
+ "multipliers": [40, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Arrow Hurricane",
+ "desc": "Arrow Storm will shoot +2 stream of arrows.",
+ "archetype": "Boltslinger",
+ "archetype_req": 8,
+ "parents": ["Precise Shot", "Escape Artist"],
+ "dependencies": [],
+ "blockers": ["Phantom Ray"],
+ "cost": 2,
+ "display": {
+ "row": 33,
+ "col": 0
+ },
+ "properties": {},
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Single Stream": 2
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Geyser Stomp",
+ "desc": "Fierce Stomp will create geysers, dealing more damage and vertical knockback.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Shrapnel Bomb"],
+ "dependencies": ["Fierce Stomp"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 37,
+ "col": 1
+ },
+ "properties": {
+ "aoe": 1
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "target_part": "Fierce Stomp",
+ "cost": 0,
+ "multipliers": [0, 0, 0, 50, 0, 0]
+ }
+ ]
+ },
+ {
+ "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": ["Cheaper Arrow Shield"],
+ "dependencies": ["Arrow Storm"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 37,
+ "col": 4
+ },
+ "properties": {
+ "focusReq": 5,
+ "focusRegen": -1
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Crepuscular Ray",
+ "base_spell": 5,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "One Focus",
+ "cost": 0,
+
+ "parts": [
+ {
+ "name": "Single Arrow",
+ "type": "damage",
+ "multipliers": [10, 0, 0, 5, 0, 0]
+ },
+ {
+ "name": "One Focus",
+ "type": "total",
+ "hits": {
+ "Single Arrow": 20
+ }
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "One Focus": 7
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Grape Bomb",
+ "desc": "Arrow bomb will throw 3 additional smaller bombs when exploding.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Cheaper Escape (2)"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 37,
+ "col": 7
+ },
+ "properties": {
+ "miniBombs": 3,
+ "aoe": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Grape Bomb",
+ "cost": 0,
+ "multipliers": [30, 0, 0, 0, 10, 0]
+ }
+ ]
+ },
+ {
+ "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,
+ "parents": ["Grape Bomb"],
+ "dependencies": ["Basaltic Trap"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 38,
+ "col": 6
+ },
+ "properties": {
+ "attackSpeed": 0.2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Tangled Traps",
+ "cost": 0,
+ "multipliers": [20, 0, 0, 0, 0, 20]
+ }
+ ]
+ },
+ {
+ "display_name": "Snow Storm",
+ "desc": "Enemies near you will be slowed down.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Geyser Stomp", "More Focus (2)"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 39,
+ "col": 2
+ },
+ "properties": {
+ "range": 2.5,
+ "slowness": 0.3
+ }
+ },
+ {
+ "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,
+ "parents": ["Snow Storm"],
+ "dependencies": ["Guardian Angels"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 40,
+ "col": 1
+ },
+ "properties": {
+ "range": 10,
+ "shots": 5
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Single Arrow",
+ "cost": 0,
+ "multipliers": [0, 0, 0, 0, 20, 0]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Single Bow",
+ "cost": 0,
+ "hits": {
+ "Single Arrow": 5
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Minefield",
+ "desc": "Allow you to place +6 Traps, but with reduced damage and range.",
+ "archetype": "Trapper",
+ "archetype_req": 10,
+ "parents": ["Grape Bomb", "Cheaper Arrow Bomb (2)"],
+ "dependencies": ["Basaltic Trap"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 40,
+ "col": 7
+ },
+ "properties": {
+ "aoe": -2,
+ "traps": 6
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Basaltic Trap",
+ "cost": 0,
+ "multipliers": [-80, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Bow Proficiency I",
+ "desc": "Improve your Main Attack's damage and range when using a bow.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Arrow Bomb"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 2,
+ "col": 4
+ },
+ "properties": {
+ "mainAtk_range": 6
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "mdPct",
+ "value": 5
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Cheaper Arrow Bomb",
+ "desc": "Reduce the Mana cost of Arrow Bomb.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Bow Proficiency I"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 2,
+ "col": 6
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "cost": -10
+ }
+ ]
+ },
+ {
+ "display_name": "Cheaper Arrow Storm",
+ "desc": "Reduce the Mana cost of Arrow Storm.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Grappling Hook", "Windstorm", "Focus"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 21,
+ "col": 3
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Cheaper Escape",
+ "desc": "Reduce the Mana cost of Escape.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Arrow Storm", "Arrow Shield"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 9,
+ "col": 4
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Earth Mastery",
+ "desc": "Increases your base damage from all Earth attacks",
+ "archetype": "Trapper",
+ "archetype_req": 0,
+ "parents": ["Arrow Shield"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 13,
+ "col": 8
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "eDamPct",
+ "value": 20
+ },
+ {
+ "type": "stat",
+ "name": "eDam",
+ "value": [2, 4]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Thunder Mastery",
+ "desc": "Increases your base damage from all Thunder attacks",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Arrow Storm", "Fire Mastery"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 13,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "tDamPct",
+ "value": 10
+ },
+ {
+ "type": "stat",
+ "name": "tDam",
+ "value": [1, 8]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Water Mastery",
+ "desc": "Increases your base damage from all Water attacks",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Cheaper Escape", "Thunder Mastery", "Fire Mastery"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 14,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "wDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "wDam",
+ "value": [2, 4]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Air Mastery",
+ "desc": "Increases base damage from all Air attacks",
+ "archetype": "Battle Monk",
+ "archetype_req": 0,
+ "parents": ["Arrow Storm"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 13,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "aDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "aDam",
+ "value": [3, 4]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Fire Mastery",
+ "desc": "Increases base damage from all Earth attacks",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Thunder Mastery", "Arrow Shield"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 13,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "fDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "fDam",
+ "value": [3, 5]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "More Shields",
+ "desc": "Give +2 charges to Arrow Shield.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Grappling Hook", "Basaltic Trap"],
+ "dependencies": ["Arrow Shield"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 21,
+ "col": 7
+ },
+ "properties": {
+ "shieldCharges": 2
+ }
+ },
+ {
+ "display_name": "Stormy Feet",
+ "desc": "Windy Feet will last longer and add more speed.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Windstorm"],
+ "dependencies": ["Windy Feet"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 23,
+ "col": 1
+ },
+ "properties": {
+ "duration": 60
+ },
+ "effects": [
+ {
+ "type": "stat_bonus",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "spdPct",
+ "value": 20
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Refined Gunpowder",
+ "desc": "Increase the damage of Arrow Bomb.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Windstorm"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 25,
+ "col": 0
+ },
+ "properties": {},
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Arrow Bomb",
+ "cost": 0,
+ "multipliers": [50, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "More Traps",
+ "desc": "Increase the maximum amount of active Traps you can have by +2.",
+ "archetype": "Trapper",
+ "archetype_req": 10,
+ "parents": ["Bouncing Bomb"],
+ "dependencies": ["Basaltic Trap"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 26,
+ "col": 8
+ },
+ "properties": {
+ "traps": 2
+ }
+ },
+ {
+ "display_name": "Better Arrow Shield",
+ "desc": "Arrow Shield will gain additional area of effect, knockback and damage.",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Mana Trap", "Shocking Bomb", "Twain's Arc"],
+ "dependencies": ["Arrow Shield"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 28,
+ "col": 6
+ },
+ "properties": {
+ "aoe": 1
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Arrow Shield",
+ "multipliers": [40, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+ {
+ "display_name": "Better Leap",
+ "desc": "Reduce leap's cooldown by 1s.",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Leap", "Homing Shots"],
+ "dependencies": ["Leap"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 29,
+ "col": 1
+ },
+ "properties": {
+ "cooldown": -1
+ }
+ },
+ {
+ "display_name": "Better Guardian Angels",
+ "desc": "Your Guardian Angels can shoot +4 arrows before disappearing.",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Escape Artist", "Homing Shots"],
+ "dependencies": ["Guardian Angels"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 31,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Single Bow",
+ "cost": 0,
+ "hits": {
+ "Single Arrow": 4
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Cheaper Arrow Storm (2)",
+ "desc": "Reduce the Mana cost of Arrow Storm.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Initiator", "Mana Trap"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 31,
+ "col": 8
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Precise Shot",
+ "desc": "+30% Critical Hit Damage",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Better Guardian Angels", "Cheaper Arrow Shield", "Arrow Hurricane"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 33,
+ "col": 2
+ },
+ "properties": {
+ "mainAtk_range": 6
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "mdCritPct",
+ "value": 30
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Cheaper Arrow Shield",
+ "desc": "Reduce the Mana cost of Arrow Shield.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Precise Shot", "Initiator"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 33,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Rocket Jump",
+ "desc": "Arrow Bomb's self-damage will knockback you farther away.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Cheaper Arrow Storm (2)", "Initiator"],
+ "dependencies": ["Arrow Bomb"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 33,
+ "col": 6
+ },
+ "properties": {
+ }
+ },
+ {
+ "display_name": "Cheaper Escape (2)",
+ "desc": "Reduce the Mana cost of Escape.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Call of the Hound", "Decimator"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 34,
+ "col": 7
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Stronger Hook",
+ "desc": "Increase your Grappling Hook's range, speed and strength.",
+ "archetype": "Trapper",
+ "archetype_req": 5,
+ "parents": ["Cheaper Escape (2)"],
+ "dependencies": ["Grappling Hook"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 35,
+ "col": 8
+ },
+ "properties": {
+ "range": 8
+ }
+ },
+ {
+ "display_name": "Cheaper Arrow Bomb (2)",
+ "desc": "Reduce the Mana cost of Arrow Bomb.",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["More Focus (2)", "Minefield"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 40,
+ "col": 5
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "cost": -5
+ }
+ ]
+ },
+ {
+ "display_name": "Bouncing Bomb",
+ "desc": "Arrow Bomb will bounce once when hitting a block or enemy",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["More Shields"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 25,
+ "col": 7
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Arrow Bomb": 2
+ }
+ }
+ ]
+ },
+ {
+ "display_name": "Homing Shots",
+ "desc": "Your Main Attack arrows will follow nearby enemies and not be affected by gravity",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Leap", "Shocking Bomb"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 2
+ },
+ "properties": {
+
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "display_name": "Shrapnel Bomb",
+ "desc": "Arrow Bomb's explosion will fling 15 shrapnel, dealing damage in a large area",
+ "archetype": "Boltslinger",
+ "archetype_req": 8,
+ "parents": ["Arrow Hurricane", "Precise Shot"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 34,
+ "col": 1
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Shrapnel Bomb",
+ "cost": 0,
+ "multipliers": [40, 0, 0, 0, 20, 0]
+ }
+ ]
+ },
+ {
+ "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": ["Geyser Stomp"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 38,
+ "col": 0
+ },
+ "properties": {
+
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "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,
+ "parents": ["Escape"],
+ "dependencies": [],
+ "blockers": ["Power Shots"],
+ "cost": 1,
+ "display": {
+ "row": 7,
+ "col": 2
+ },
+ "properties": {
+ "arrow": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 0,
+ "target_part": "Melee Damage",
+ "cost": 0,
+ "multipliers": 0.7
+ }
+ ]
+ },
+ {
+ "display_name": "Triple Shots",
+ "desc": "Triple Main Attack arrows, but they deal -20% damage per arrow",
+ "archetype": "Boltslinger",
+ "archetype_req": 0,
+ "parents": ["Arrow Rain", "Frenzy"],
+ "dependencies": ["Double Shots"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 17,
+ "col": 0
+ },
+ "properties": {
+ "arrow": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 0,
+ "target_part": "Melee Damage",
+ "cost": 0,
+ "multipliers": 0.7
+ }
+ ]
+ },
+ {
+ "display_name": "Power Shots",
+ "desc": "Main Attack arrows have increased speed and knockback",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Escape"],
+ "dependencies": [],
+ "blockers": ["Double Shots"],
+ "cost": 1,
+ "display": {
+ "row": 7,
+ "col": 6
+ },
+ "properties": {
+
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "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": ["Phantom Ray"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 19,
+ "col": 4
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Focus",
+ "output": {
+ "type": "stat",
+ "abil_name": "Focus",
+ "name": "dmgPct"
+ },
+ "scaling": [35],
+ "max": 3
+ }
+ ]
+ },
+ {
+ "display_name": "More Focus",
+ "desc": "Add +2 max Focus",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Cheaper Arrow Storm", "Grappling Hook"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 22,
+ "col": 4
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Focus",
+ "output": {
+ "type": "stat",
+ "abil_name": "Focus",
+ "name": "dmgPct"
+ },
+ "scaling": [35],
+ "max": 5
+ }
+ ]
+ },
+ {
+ "display_name": "More Focus (2)",
+ "desc": "Add +2 max Focus",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Crepuscular Ray", "Snow Storm"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 39,
+ "col": 4
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Focus",
+ "output": {
+ "type": "stat",
+ "abil_name": "Focus",
+ "name": "dmgPct"
+ },
+ "scaling": [35],
+ "max": 7
+ }
+ ]
+ },
+ {
+ "display_name": "Traveler",
+ "desc": "For every 1% Walk Speed you have from items, gain +1 Raw Spell Damage (Max 100)",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Refined Gunpowder", "Twain's Arc"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 25,
+ "col": 2
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": false,
+ "inputs": [
+ {
+ "type": "stat",
+ "name": "spd"
+ }
+ ],
+ "output": {
+ "type": "stat",
+ "name": "sdRaw"
+ },
+ "scaling": [1],
+ "max": 100
+ }
+ ]
+ },
+ {
+ "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,
+ "parents": ["More Shields"],
+ "dependencies": ["Basaltic Trap"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 22,
+ "col": 8
+ },
+ "properties": {
+ "max": 80
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "display_name": "Stronger Patient Hunter",
+ "desc": "Add +80% Max Damage to Patient Hunter",
+ "archetype": "Trapper",
+ "archetype_req": 0,
+ "parents": ["Grape Bomb"],
+ "dependencies": ["Patient Hunter"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 38,
+ "col": 8
+ },
+ "properties": {
+ "max": 80
+ },
+ "effects": [
+
+ ]
+ },
+ {
+ "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": ["Triple Shots", "Nimble String"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 17,
+ "col": 2
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Hits dealt",
+ "output": {
+ "type": "stat",
+ "name": "spd"
+ },
+ "scaling": [6],
+ "max": 200
+ }
+ ]
+ },
+ {
+ "display_name": "Phantom Ray",
+ "desc": "Condense Arrow Storm into a single ray that damages enemies 10 times per second",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Water Mastery", "Fire Creep"],
+ "dependencies": ["Arrow Storm"],
+ "blockers": ["Windstorm", "Nimble String", "Arrow Hurricane"],
+ "cost": 2,
+ "display": {
+ "row": 16,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Phantom Ray",
+ "cost": 40,
+ "display_text": "Max Damage",
+ "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
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Arrow Rain",
+ "desc": "When Arrow Shield loses its last charge, unleash 200 arrows raining down on enemies",
+ "archetype": "Trapper",
+ "archetype_req": 0,
+ "parents": ["Nimble String", "Air Mastery"],
+ "dependencies": ["Arrow Shield"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 15,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Arrow Rain",
+ "cost": 0,
+ "multipliers": [120, 0, 0, 0, 0, 80]
+ }
+ ]
+ },
+ {
+ "display_name": "Decimator",
+ "desc": "Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 50%)",
+ "archetype": "Sharpshooter",
+ "archetype_req": 0,
+ "parents": ["Cheaper Arrow Shield"],
+ "dependencies": ["Phantom Ray"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 34,
+ "col": 5
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Phantom Ray hits",
+ "output": {
+ "type": "stat",
+ "name": "PhRayDmg"
+ },
+ "scaling": 10,
+ "max": 50
+ }
+ ]
+ }
+ ],
+ "Warrior": [
+ {
+ "display_name": "Bash",
+ "desc": "Violently bash the ground, dealing high damage in a large area",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": [],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 0,
+ "col": 4
+ },
+ "properties": {
+ "aoe": 4,
+ "range": 3
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Bash",
+ "cost": 45,
+ "display_text": "Total Damage Average",
+ "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
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "display_name": "Spear Proficiency 1",
+ "desc": "Improve your Main Attack's damage and range w/ spear",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 2,
+ "col": 4
+ },
+ "properties": {
+ "melee_range": 1
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "mdPct",
+ "value": 5
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Cheaper Bash",
+ "desc": "Reduce the Mana cost of Bash",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Spear Proficiency 1"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 2,
+ "col": 2
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "cost": -10
+ }
+ ]
+ },
+ {
+ "display_name": "Double Bash",
+ "desc": "Bash will hit a second time at a farther range",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Spear Proficiency 1"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 4,
+ "col": 4
+ },
+ "properties": {
+ "range": 3
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "name": "Single Hit",
+ "value": 1
+ }
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Hit",
+ "cost": 0,
+ "multipliers": [-50, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Charge",
+ "desc": "Charge forward at high speed (hold shift to cancel)",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Double Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 6,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Charge",
+ "cost": 25,
+ "display_text": "Total Damage Average",
+ "base_spell": 2,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "Total Damage",
+ "parts": [
+ {
+ "name": "None",
+ "type": "damage",
+ "multipliers": [0, 0, 0, 0, 0, 0]
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "None": 0
+ }
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Heavy Impact",
+ "desc": "After using Charge, violently crash down into the ground and deal damage",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Uppercut"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 9,
+ "col": 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]
+ }
+ ]
+ },
+
+ {
+ "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": ["Charge"],
+ "dependencies": [],
+ "blockers": ["Tougher Skin"],
+ "cost": 1,
+ "display": {
+ "row": 6,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": false,
+ "inputs": [
+ {
+ "type": "stat",
+ "name": "mdPct"
+ },
+ {
+ "type": "stat",
+ "name": "mdRaw"
+ }
+ ],
+ "output": {
+ "type": "stat",
+ "name": "spd"
+ },
+ "scaling": [1, 1],
+ "max": 20
+ }
+ ]
+ },
+
+ {
+ "display_name": "Tougher Skin",
+ "desc": "Harden your skin and become permanently +5% more resistant\nFor every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Charge"],
+ "dependencies": [],
+ "blockers": ["Vehement"],
+ "cost": 1,
+ "display": {
+ "row": 6,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "baseResist",
+ "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
+ }
+ ]
+ },
+
+ {
+ "display_name": "Uppercut",
+ "desc": "Rocket enemies in the air and deal massive damage",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Vehement"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 8,
+ "col": 2
+ },
+ "properties": {
+ "aoe": 3,
+ "range": 5
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "Uppercut",
+ "cost": 45,
+ "display_text": "Total Damage Average",
+ "base_spell": 3,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "total",
+ "parts": [
+ {
+ "name": "Uppercut",
+ "type": "damage",
+ "multipliers": [150, 50, 50, 0, 0, 0]
+ },
+ {
+ "name": "Total Damage",
+ "type": "total",
+ "hits": {
+ "Uppercut": 1
+ }
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Cheaper Charge",
+ "desc": "Reduce the Mana cost of Charge",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Uppercut", "War Scream"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 8,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "War Scream",
+ "desc": "Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Tougher Skin"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 8,
+ "col": 6
+ },
+ "properties": {
+ "duration": 30,
+ "aoe": 12,
+ "defense_bonus": 10
+ },
+ "effects": [
+ {
+ "type": "replace_spell",
+ "name": "War Scream",
+ "cost": 35,
+ "display_text": "War Scream",
+ "base_spell": 4,
+ "spell_type": "damage",
+ "scaling": "spell",
+ "display": "Total Damage Average",
+ "parts": [
+ {
+ "name": "War Scream",
+ "type": "damage",
+ "multipliers": [50, 0, 0, 0, 50, 0]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Earth Mastery",
+ "desc": "Increases base damage from all Earth attacks",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Uppercut"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 10,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "eDamPct",
+ "value": 20
+ },
+ {
+ "type": "stat",
+ "name": "eDam",
+ "value": [2, 4]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Thunder Mastery",
+ "desc": "Increases base damage from all Thunder attacks",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Uppercut", "Air Mastery"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 10,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "tDamPct",
+ "value": 10
+ },
+ {
+ "type": "stat",
+ "name": "tDam",
+ "value": [1, 8]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Water Mastery",
+ "desc": "Increases base damage from all Water attacks",
+ "archetype": "Battle Monk",
+ "archetype_req": 0,
+ "parents": ["Cheaper Charge", "Thunder Mastery", "Air Mastery"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 11,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "wDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "wDam",
+ "value": [2, 4]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Air Mastery",
+ "desc": "Increases base damage from all Air attacks",
+ "archetype": "Battle Monk",
+ "archetype_req": 0,
+ "parents": ["War Scream", "Thunder Mastery"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 10,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "aDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "aDam",
+ "value": [3, 4]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Fire Mastery",
+ "desc": "Increases base damage from all Earth attacks",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["War Scream"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 10,
+ "col": 8
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "fDamPct",
+ "value": 15
+ },
+ {
+ "type": "stat",
+ "name": "fDam",
+ "value": [3, 5]
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Quadruple Bash",
+ "desc": "Bash will hit 4 times at an even larger range",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Earth Mastery", "Fireworks"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 12,
+ "col": 0
+ },
+ "properties": {
+ "range": 6
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Single Hit": 2
+ }
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Hit",
+ "cost": 0,
+ "multipliers": [-20, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Fireworks",
+ "desc": "Mobs hit by Uppercut will explode mid-air and receive additional damage",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Thunder Mastery", "Quadruple Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 12,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Fireworks",
+ "cost": 0,
+ "multipliers": [80, 0, 20, 0, 0, 0]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Fireworks": 1
+ }
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Water Mastery"],
+ "dependencies": ["Uppercut"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 13,
+ "col": 4
+ },
+ "properties": {
+ "range": 4
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Uppercut",
+ "cost": -10,
+ "multipliers": [-70, 0, 0, 0, 0, 0]
+ },
+ {
+ "type": "convert_spell_conv",
+ "target_part": "all",
+ "conversion": "water"
+ }
+ ]
+ },
+
+ {
+ "display_name": "Flyby Jab",
+ "desc": "Damage enemies in your way when using Charge",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Air Mastery", "Flaming Uppercut"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 12,
+ "col": 6
+ },
+ "properties": {
+ "aoe": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "target_part": "Flyby Jab",
+ "cost": 0,
+ "multipliers": [20, 0, 0, 0, 0, 40]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Flaming Uppercut",
+ "desc": "Uppercut will light mobs on fire, dealing damage every 0.6 seconds",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Fire Mastery", "Flyby Jab"],
+ "dependencies": ["Uppercut"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 12,
+ "col": 8
+ },
+ "properties": {
+ "duration": 3,
+ "tick": 0.6
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Flaming Uppercut",
+ "cost": 0,
+ "multipliers": [0, 0, 0, 0, 50, 0]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Flaming Uppercut Total Damage",
+ "cost": 0,
+ "hits": {
+ "Flaming Uppercut": 5
+ }
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Total Damage",
+ "cost": 0,
+ "hits": {
+ "Flaming Uppercut": 5
+ }
+ }
+ ]
+ },
+
+ {
+ "display_name": "Iron Lungs",
+ "desc": "War Scream deals more damage",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Flyby Jab", "Flaming Uppercut"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 13,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "War Scream",
+ "cost": 0,
+ "multipliers": [30, 0, 0, 0, 0, 30]
+ }
+ ]
+ },
+
+ {
+ "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": ["Counter"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 15,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Counter",
+ "desc": "When dodging a nearby enemy attack, get 30% chance to instantly attack back",
+ "archetype": "Battle Monk",
+ "archetype_req": 0,
+ "parents": ["Half-Moon Swipe"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 15,
+ "col": 4
+ },
+ "properties": {
+ "chance": 30
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 5,
+ "target_part": "Counter",
+ "cost": 0,
+ "multipliers": [60, 0, 20, 0, 0, 20]
+ }
+ ]
+ },
+
+ {
+ "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": ["Iron Lungs"],
+ "dependencies": ["War Scream"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 15,
+ "col": 7
+ },
+ "properties": {
+ "mantle_charge": 3
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Bak'al's Grasp",
+ "desc": "After casting War Scream, become Corrupted (15s Cooldown). You cannot heal while in that state\n\nWhile Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)",
+ "archetype": "Fallen",
+ "archetype_req": 2,
+ "parents": ["Quadruple Bash", "Fireworks"],
+ "dependencies": ["War Scream"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 16,
+ "col": 1
+ },
+ "properties": {
+ "cooldown": 15
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Corrupted",
+ "output": {
+ "type": "stat",
+ "name": "raw"
+ },
+ "scaling": [4],
+ "slider_step": 2,
+ "max": 120
+ }
+ ]
+ },
+
+ {
+ "display_name": "Spear Proficiency 2",
+ "desc": "Improve your Main Attack's damage and range w/ spear",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Bak'al's Grasp", "Cheaper Uppercut"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 17,
+ "col": 0
+ },
+ "properties": {
+ "melee_range": 1
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "mdPct",
+ "value": 5
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Cheaper Uppercut",
+ "desc": "Reduce the Mana Cost of Uppercut",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Spear Proficiency 2", "Aerodynamics", "Counter"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 17,
+ "col": 3
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "Aerodynamics",
+ "desc": "During Charge, you can steer and change direction",
+ "archetype": "Battle Monk",
+ "archetype_req": 0,
+ "parents": ["Cheaper Uppercut", "Provoke"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 17,
+ "col": 5
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Provoke",
+ "desc": "Mobs damaged by War Scream will target only you for at least 5s \n\nReduce the Mana cost of War Scream",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Aerodynamics", "Mantle of the Bovemists"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 17,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "Precise Strikes",
+ "desc": "+30% Critical Hit Damage",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Cheaper Uppercut", "Spear Proficiency 2"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 18,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "critDmg",
+ "value": 30
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Air Shout",
+ "desc": "War Scream will fire a projectile that can go through walls and deal damage multiple times",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Aerodynamics", "Provoke"],
+ "dependencies": ["War Scream"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 18,
+ "col": 6
+ },
+ "properties": {
+
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Air Shout",
+ "cost": 0,
+ "multipliers": [20, 0, 0, 0, 0, 5]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Enraged Blow",
+ "desc": "While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Spear Proficiency 2"],
+ "dependencies": ["Bak'al's Grasp"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 20,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": false,
+ "inputs": [
+ {
+ "type": "stat",
+ "name": "hpBonus"
+ }
+ ],
+ "output": {
+ "type": "stat",
+ "name": "dmgPct"
+ },
+ "scaling": [2],
+ "max": 200
+ }
+ ]
+ },
+
+ {
+ "display_name": "Flying Kick",
+ "desc": "When using Charge, mobs hit will halt your momentum and get knocked back",
+ "archetype": "Battle Monk",
+ "archetype_req": 1,
+ "parents": ["Cheaper Uppercut", "Stronger Mantle"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 20,
+ "col": 3
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "target_part": "Flying Kick",
+ "cost": 0,
+ "multipliers": [120, 0, 0, 10, 0, 20]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Stronger Mantle",
+ "desc": "Add +2 additional charges to Mantle of the Bovemists",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Manachism", "Flying Kick"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 20,
+ "col": 6
+ },
+ "properties": {
+ "mantle_charge": 2
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "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": ["Stronger Mantle", "Provoke"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 20,
+ "col": 8
+ },
+ "properties": {
+ "cooldown": 1
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "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",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Enraged Blow", "Ragnarokkr"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 22,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Boiling Blood",
+ "cost": 0,
+ "multipliers": [25, 0, 0, 0, 5, 0]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Ragnarokkr",
+ "desc": "War Scream become deafening, increasing its range and giving damage bonus to players",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Boiling Blood", "Flying Kick"],
+ "dependencies": ["War Scream"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 22,
+ "col": 2
+ },
+ "properties": {
+ "damage_bonus": 30,
+ "aoe": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "cost": 10
+ }
+ ]
+ },
+
+ {
+ "display_name": "Ambidextrous",
+ "desc": "Increase your chance to attack with Counter by +30%",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Flying Kick", "Stronger Mantle", "Burning Heart"],
+ "dependencies": ["Counter"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 22,
+ "col": 4
+ },
+ "properties": {
+ "chance": 30
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "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": ["Ambidextrous", "Stronger Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 22,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": false,
+ "inputs": [
+ {
+ "type": "stat",
+ "name": "hpBonus"
+ }
+ ],
+ "output": {
+ "type": "stat",
+ "name": "fDamPct"
+ },
+ "scaling": [2],
+ "max": 100,
+ "slider_step": 100
+ }
+ ]
+ },
+
+ {
+ "display_name": "Stronger Bash",
+ "desc": "Increase the damage of Bash",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Burning Heart", "Manachism"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 22,
+ "col": 8
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "target_part": "Single Hit",
+ "cost": 0,
+ "multipliers": [30, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Ragnarokkr", "Boiling Blood"],
+ "dependencies": ["Bak'al's Grasp"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 23,
+ "col": 1
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Comet",
+ "desc": "After being hit by Fireworks, enemies will crash into the ground and receive more damage",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Ragnarokkr"],
+ "dependencies": ["Fireworks"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 24,
+ "col": 2
+ },
+ "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
+ }
+ }
+ ]
+ },
+
+ {
+ "display_name": "Collide",
+ "desc": "Mobs thrown into walls from Flying Kick will explode and receive additonal damage",
+ "archetype": "Battle Monk",
+ "archetype_req": 4,
+ "parents": ["Ambidextrous", "Burning Heart"],
+ "dependencies": ["Flying Kick"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 23,
+ "col": 5
+ },
+ "properties": {
+ "aoe": 4
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "target_part": "Collide",
+ "cost": 0,
+ "multipliers": [100, 0, 0, 0, 50, 0]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Rejuvenating Skin",
+ "desc": "Regain back 30% of the damage you take as healing over 30s",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Burning Heart", "Stronger Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 23,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "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",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Boiling Blood", "Radiant Devotee"],
+ "dependencies": ["Bak'al's Grasp"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 26,
+ "col": 0
+ },
+ "properties": {
+ "cooldown": -5
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Corrupted",
+ "output": {
+ "type": "stat",
+ "name": "raw"
+ },
+ "scaling": [1],
+ "slider_step": 2,
+ "max": 50
+ }
+ ]
+ },
+
+ {
+ "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": ["Whirlwind Strike", "Uncontainable Corruption"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 26,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "inputs": [
+ {
+ "type": "stat",
+ "name": "ref"
+ }
+ ],
+ "output": {
+ "type": "stat",
+ "name": "mr"
+ },
+ "scaling": [1],
+ "max": 10,
+ "slider_step": 4
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Ambidextrous", "Radiant Devotee"],
+ "dependencies": ["Uppercut"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 26,
+ "col": 4
+ },
+ "properties": {
+ "range": 2
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Uppercut",
+ "cost": 0,
+ "multipliers": [0, 0, 0, 0, 0, 50]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Mythril Skin",
+ "desc": "Gain +5% Base Resistance and become immune to knockback",
+ "archetype": "Paladin",
+ "archetype_req": 6,
+ "parents": ["Rejuvenating Skin"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 26,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "baseResist",
+ "value": 5
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Uncontainable Corruption", "Radiant Devotee"],
+ "dependencies": ["Bak'al's Grasp"],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 27,
+ "col": 1
+ },
+ "properties": {
+ "duration": 5
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Mythril Skin", "Sparkling Hope"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 27,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 5,
+ "target_part": "Shield Strike",
+ "cost": 0,
+ "multipliers": [60, 0, 20, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "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": ["Mythril Skin"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 27,
+ "col": 8
+ },
+ "properties": {
+ "aoe": 6
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 5,
+ "target_part": "Sparkling Hope",
+ "cost": 0,
+ "multipliers": [10, 0, 5, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Tempest", "Uncontainable Corruption"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Corrupted",
+ "output": {
+ "type": "stat",
+ "name": "bashAoE"
+ },
+ "scaling": [1],
+ "max": 10,
+ "slider_step": 3
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Massive Bash", "Spirit of the Rabbit"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 28,
+ "col": 2
+ },
+ "properties": {
+ "aoe": 16
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Tempest",
+ "cost": "0",
+ "multipliers": [30, 10, 0, 0, 0, 10]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Tempest Total Damage",
+ "cost": "0",
+ "hits": {
+ "Tempest": 3
+ }
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Total Damage",
+ "cost": "0",
+ "hits": {
+ "Tempest": 3
+ }
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Tempest", "Whirlwind Strike"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 28,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 2,
+ "cost": -5
+ },
+ {
+ "type": "raw_stat",
+ "bonuses": [
+ {
+ "type": "stat",
+ "name": "spd",
+ "value": 20
+ }
+ ]
+ }
+ ]
+ },
+
+ {
+ "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,
+ "parents": ["Tempest", "Massive Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 29,
+ "col": 1
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Axe Kick",
+ "desc": "Increase the damage of Uppercut, but also increase its mana cost",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Tempest", "Spirit of the Rabbit"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 29,
+ "col": 3
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "target_part": "Uppercut",
+ "cost": 10,
+ "multipliers": [100, 0, 0, 0, 0, 0]
+ }
+ ]
+ },
+
+ {
+ "display_name": "Radiance",
+ "desc": "Bash will buff your allies' positive IDs. (15s Cooldown)",
+ "archetype": "Paladin",
+ "archetype_req": 2,
+ "parents": ["Spirit of the Rabbit", "Cheaper Bash 2"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 29,
+ "col": 5
+ },
+ "properties": {
+ "cooldown": 15
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Cheaper Bash 2",
+ "desc": "Reduce the Mana cost of Bash",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Radiance", "Shield Strike", "Sparkling Hope"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 29,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 1,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "Cheaper War Scream",
+ "desc": "Reduce the Mana cost of War Scream",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Massive Bash"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 31,
+ "col": 0
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "Discombobulate",
+ "desc": "Every time you hit an enemy, briefly increase your elemental damage dealt to them by +2 (Additive, Max +50). This bonus decays -5 every second",
+ "archetype": "Battle Monk",
+ "archetype_req": 12,
+ "parents": ["Thunderclap"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 31,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "stat_scaling",
+ "slider": true,
+ "slider_name": "Hits dealt",
+ "output": {
+ "type": "stat",
+ "name": "rainrawButDifferent"
+ },
+ "scaling": [2],
+ "max": 50
+ }
+ ]
+ },
+
+ {
+ "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": ["Spirit of the Rabbit"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 31,
+ "col": 4
+ },
+ "properties": {
+ "aoe": 2
+ },
+ "effects": [
+ {
+ "type": "convert_spell_conv",
+ "target_part": "all",
+ "conversion": "thunder"
+ }
+ ]
+ },
+
+ {
+ "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": ["Thunderclap"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 32,
+ "col": 5
+ },
+ "properties": {
+ "aoe": 4,
+ "duration": 20
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Cyclone",
+ "cost": 0,
+ "multipliers": [10, 0, 0, 0, 5, 10]
+ },
+ {
+ "type": "add_spell_prop",
+ "base_spell": 4,
+ "target_part": "Cyclone Total Damage",
+ "cost": 0,
+ "hits": {
+ "Cyclone": 40
+ }
+
+ }
+ ]
+ },
+
+ {
+ "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": ["Cheaper Bash 2"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 32,
+ "col": 7
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Blood Pact",
+ "desc": "If you do not have enough mana to cast a spell, spend health instead (1% health per mana)",
+ "archetype": "",
+ "archetype_req": 10,
+ "parents": ["Cheaper War Scream"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 34,
+ "col": 1
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Haemorrhage",
+ "desc": "Reduce Blood Pact's health cost. (0.5% health per mana)",
+ "archetype": "Fallen",
+ "archetype_req": 0,
+ "parents": ["Blood Pact"],
+ "dependencies": ["Blood Pact"],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 35,
+ "col": 2
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Brink of Madness",
+ "desc": "If your health is 25% full or less, gain +40% Resistance",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Blood Pact", "Cheaper Uppercut 2"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 35,
+ "col": 4
+ },
+ "properties": {
+ },
+ "effects": [
+
+ ]
+ },
+
+ {
+ "display_name": "Cheaper Uppercut 2",
+ "desc": "Reduce the Mana cost of Uppercut",
+ "archetype": "",
+ "archetype_req": 0,
+ "parents": ["Second Chance", "Brink of Madness"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 1,
+ "display": {
+ "row": 35,
+ "col": 6
+ },
+ "properties": {
+ },
+ "effects": [
+ {
+ "type": "add_spell_prop",
+ "base_spell": 3,
+ "cost": -5
+ }
+ ]
+ },
+
+ {
+ "display_name": "Martyr",
+ "desc": "When you receive a fatal blow, all nearby allies become invincible",
+ "archetype": "Paladin",
+ "archetype_req": 0,
+ "parents": ["Second Chance"],
+ "dependencies": [],
+ "blockers": [],
+ "cost": 2,
+ "display": {
+ "row": 35,
+ "col": 8
+ },
+ "properties": {
+ "duration": 3,
+ "aoe": 12
+ },
+ "effects": [
+
+ ]
+ }
+ ],
+}
+
+const atree_example = [
+ {
+ "title": "skill",
+ "desc": "desc",
+ "image": "../media/atree/node.png",
+ "connector": false,
+ "row": 5,
+ "col": 3,
+ },
+ {
+ "image": "../media/atree/connect_angle.png",
+ "connector": true,
+ "rotate": 270,
+ "row": 4,
+ "col": 3,
+ },
+ {
+ "title": "skill2",
+ "desc": "desc",
+ "image": "../media/atree/node.png",
+ "connector": false,
+ "row": 0,
+ "col": 2
+ },
+ {
+ "image": "../media/atree/connect_line.png",
+ "connector": true,
+ "rotate": 0,
+ "row": 1,
+ "col": 2
+ },
+ {
+ "title": "skill3",
+ "desc": "desc",
+ "image": "../media/atree/node.png",
+ "connector": false,
+ "row": 2,
+ "col": 2
+ },
+ {
+ "image": "../media/atree/connect_line.png",
+ "connector": true,
+ "rotate": 90,
+ "row": 2,
+ "col": 3
+ },
+ {
+ "title": "skill4",
+ "desc": "desc",
+ "image": "../media/atree/node.png",
+ "connector": false,
+ "row": 2,
+ "col": 4
+ },
+ {
+ "image": "../media/atree/connect_line.png",
+ "connector": true,
+ "rotate": 0,
+ "row": 3,
+ "col": 2
+ },
+ {
+ "title": "skill5",
+ "desc": "desc",
+ "image": "../media/atree/node.png",
+ "connector": false,
+ "row": 4,
+ "col": 2
+ },
+];
diff --git a/js/atree_constants_min.js b/js/atree_constants_min.js
new file mode 100644
index 0000000..714b6d0
--- /dev/null
+++ b/js/atree_constants_min.js
@@ -0,0 +1,2 @@
+// Minified version of js/atree_constants.js
+const atrees={Archer:[{display_name:"Arrow Shield",desc:"Create a shield around you that deal damage and knockback mobs when triggered. (2 Charges)",archetype:"",archetype_req:0,parents:["Power Shots","Cheaper Escape"],dependencies:[],blockers:[],cost:1,display:{row:9,col:6},properties:{duration:60},effects:[{type:"replace_spell",name:"Arrow Shield",cost:30,display_text:"Max Damage",base_spell:4,spell_type:"damage",scaling:"spell",display:"",parts:[{name:"Shield Damage",type:"damage",multipliers:[90,0,0,0,0,10]},{name:"Total Damage",type:"total",hits:{"Shield Damage":2}}]}]},{display_name:"Escape",desc:"Throw yourself backward to avoid danger. (Hold shift while escaping to cancel)",archetype:"",archetype_req:0,parents:["Heart Shatter"],dependencies:[],blockers:[],cost:1,display:{row:7,col:4},properties:{aoe:0,range:0},effects:[{type:"replace_spell",name:"Escape",cost:25,display_text:"Max Damage",base_spell:2,spell_type:"damage",scaling:"spell",display:"Total Damage",parts:[{name:"None",type:"damage",multipliers:[0,0,0,0,0,0]},{name:"Total Damage",type:"total",hits:{None:0}}]}]},{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)",archetype:"",archetype_req:0,parents:[],dependencies:[],blockers:[],cost:1,display:{row:0,col:4},properties:{aoe:4.5,range:26},effects:[{type:"replace_spell",name:"Arrow Bomb",cost:50,display_text:"Average Damage",base_spell:3,spell_type:"damage",scaling:"spell",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}}]}]},{display_name:"Heart Shatter",desc:"If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage.",archetype:"",archetype_req:0,parents:["Bow Proficiency I"],dependencies:[],blockers:[],cost:1,display:{row:4,col:4},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Arrow Bomb",cost:0,multipliers:[100,0,0,0,0,0]},{}]},{display_name:"Fire Creep",desc:"Arrow Bomb will leak a trail of fire for 6s, Damaging enemies that walk into it every 0.4s.",archetype:"",archetype_req:0,parents:["Phantom Ray","Fire Mastery","Bryophyte Roots"],dependencies:[],blockers:[],cost:2,display:{row:16,col:6},properties:{aoe:.8,duration:6},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Fire Creep",cost:0,multipliers:[30,0,0,0,20,0]},{type:"add_spell_prop",base_spell:3,target_part:"Total Damage",cost:0,hits:{"Fire Creep":15}}]},{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.",archetype:"Trapper",archetype_req:1,parents:["Fire Creep","Earth Mastery"],dependencies:["Arrow Storm"],blockers:[],cost:2,display:{row:16,col:8},properties:{aoe:2,duration:5,slowness:.4},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Bryophyte Roots",cost:0,multipliers:[40,20,0,0,0,0]}]},{display_name:"Nimble String",desc:"Arrow Storm throw out +8 arrows per stream and shoot twice as fast.",archetype:"",archetype_req:0,parents:["Thunder Mastery","Arrow Rain"],dependencies:["Arrow Storm"],blockers:["Phantom Ray"],cost:2,display:{row:15,col:2},properties:{shootspeed:2},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Single Arrow",cost:0,multipliers:[-15,0,0,0,0,0]},{type:"add_spell_prop",base_spell:1,target_part:"Single Stream",cost:0,hits:{"Single Arrow":8}}]},{display_name:"Arrow Storm",desc:"Shoot two stream of 8 arrows, dealing significant damage to close mobs and pushing them back.",archetype:"",archetype_req:0,parents:["Double Shots","Cheaper Escape"],dependencies:[],blockers:[],cost:1,display:{row:9,col:2},properties:{aoe:0,range:16},effects:[{type:"replace_spell",name:"Arrow Storm",cost:40,display_text:"Max Damage",base_spell:1,spell_type:"damage",scaling:"spell",display:"Total Damage",parts:[{name:"Single Arrow",type:"damage",multipliers:[30,0,10,0,0,0]},{name:"Single Stream",type:"total",hits:{"Single Arrow":8}},{name:"Total Damage",type:"total",hits:{"Single Stream":2}}]}]},{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,parents:["Triple Shots","Frenzy"],dependencies:["Arrow Shield"],blockers:[],cost:2,display:{row:19,col:1},properties:{range:4,duration:60,shots:8,count:2},effects:[{type:"replace_spell",name:"Guardian Angels",cost:30,display_text:"Total Damage Average",base_spell:4,spell_type:"damage",scaling:"spell",display:"Total Damage",parts:[{name:"Single Arrow",type:"damage",multipliers:[40,0,0,0,0,20]},{name:"Single Bow",type:"total",hits:{"Single Arrow":8}},{name:"Total Damage",type:"total",hits:{"Single Bow":2}}]}]},{display_name:"Windy Feet",base_abil:"Escape",desc:"When casting Escape, give speed to yourself and nearby allies.",archetype:"Boltslinger",archetype_req:0,parents:["Arrow Storm"],dependencies:[],blockers:[],cost:1,display:{row:10,col:1},properties:{aoe:8,duration:120},type:"stat_bonus",bonuses:[{type:"stat",name:"spd",value:20}]},{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:["Bryophyte Roots"],dependencies:[],blockers:[],cost:2,display:{row:19,col:8},properties:{aoe:7,traps:2},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Basaltic Trap",cost:0,multipliers:[140,30,0,0,30,0]}]},{display_name:"Windstorm",desc:"Arrow Storm shoot +1 stream of arrows, effectively doubling its damage.",archetype:"",archetype_req:0,parents:["Guardian Angels","Cheaper Arrow Storm"],dependencies:[],blockers:["Phantom Ray"],cost:2,display:{row:21,col:1},properties:{},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Single Arrow",cost:0,multipliers:[-11,0,-7,0,0,3]},{type:"add_spell_prop",base_spell:1,target_part:"Total Damage",cost:0,hits:{"Single Stream":1}}]},{display_name:"Grappling Hook",base_abil:"Escape",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:["Focus","More Shields","Cheaper Arrow Storm"],dependencies:[],blockers:["Escape Artist"],cost:2,display:{row:21,col:5},properties:{range:20},effects:[]},{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,parents:["Grappling Hook","More Shields"],dependencies:[],blockers:[],cost:2,display:{row:22,col:6},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Arrow Bomb",cost:0,multipliers:[40,0,0,0,0,0]}]},{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:["More Focus","Traveler"],dependencies:["Focus"],blockers:[],cost:2,display:{row:25,col:4},properties:{range:64,focusReq:2},effects:[{type:"replace_spell",name:"Twain's Arc",cost:0,display_text:"Twain's Arc",base_spell:5,spell_type:"damage",scaling:"melee",display:"Twain's Arc Damage",parts:[{name:"Twain's Arc Damage",type:"damage",multipliers:[200,0,0,0,0,0]}]}]},{display_name:"Fierce Stomp",desc:"When using Escape, hold shift to quickly drop down and deal damage.",archetype:"Boltslinger",archetype_req:0,parents:["Refined Gunpowder","Traveler"],dependencies:[],blockers:[],cost:2,display:{row:26,col: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:"Total Damage",cost:0,hits:{"Fierce Stomp":1}}]},{display_name:"Scorched Earth",desc:"Fire Creep become much stronger.",archetype:"Sharpshooter",archetype_req:0,parents:["Twain's Arc"],dependencies:["Fire Creep"],blockers:[],cost:1,display:{row:26,col:5},properties:{duration:2,aoe:.4},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Fire Creep",cost:0,multipliers:[10,0,0,0,5,0]}]},{display_name:"Leap",desc:"When you double tap jump, leap foward. (2s Cooldown)",archetype:"Boltslinger",archetype_req:5,parents:["Refined Gunpowder","Homing Shots"],dependencies:[],blockers:[],cost:2,display:{row:28,col:0},properties:{cooldown:2},effects:[]},{display_name:"Shocking Bomb",desc:"Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder.",archetype:"Sharpshooter",archetype_req:5,parents:["Twain's Arc","Better Arrow Shield","Homing Shots"],dependencies:["Arrow Bomb"],blockers:[],cost:2,display:{row:28,col:4},properties:{gravity:0},effects:[{type:"convert_spell_conv",target_part:"all",conversion:"thunder"}]},{display_name:"Mana Trap",desc:"Your Traps will give you 4 Mana per second when you stay close to them.",archetype:"Trapper",archetype_req:5,parents:["More Traps","Better Arrow Shield"],dependencies:["Fire Creep"],blockers:[],cost:2,display:{row:28,col:8},properties:{range:12,manaRegen:4},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Basaltic Trap",cost:10,multipliers:[0,0,0,0,0,0]}]},{display_name:"Escape Artist",desc:"When casting Escape, release 100 arrows towards the ground.",archetype:"Boltslinger",archetype_req:0,parents:["Better Guardian Angels","Leap"],dependencies:[],blockers:["Grappling Hook"],cost:2,display:{row:31,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:2,target_part:"Escape Artist",cost:0,multipliers:[30,0,10,0,0,0]}]},{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:["Shocking Bomb","Better Arrow Shield","Cheaper Arrow Storm (2)"],dependencies:["Focus"],blockers:[],cost:2,display:{row:31,col:5},properties:{focus:1,timer:5},type:"stat_bonus",bonuses:[{type:"stat",name:"damPct",value:50}]},{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,parents:["Initiator","Cheaper Arrow Storm (2)"],dependencies:["Arrow Shield"],blockers:[],cost:2,display:{row:32,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Call of the Hound",cost:0,multipliers:[40,0,0,0,0,0]}]},{display_name:"Arrow Hurricane",desc:"Arrow Storm will shoot +2 stream of arrows.",archetype:"Boltslinger",archetype_req:8,parents:["Precise Shot","Escape Artist"],dependencies:[],blockers:["Phantom Ray"],cost:2,display:{row:33,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Total Damage",cost:0,hits:{"Single Stream":2}}]},{display_name:"Geyser Stomp",desc:"Fierce Stomp will create geysers, dealing more damage and vertical knockback.",archetype:"",archetype_req:0,parents:["Shrapnel Bomb"],dependencies:["Fierce Stomp"],blockers:[],cost:2,display:{row:37,col:1},properties:{aoe:1},effects:[{type:"add_spell_prop",base_spell:2,target_part:"Fierce Stomp",cost:0,multipliers:[0,0,0,50,0,0]}]},{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:["Cheaper Arrow Shield"],dependencies:["Arrow Storm"],blockers:[],cost:2,display:{row:37,col:4},properties:{focusReq:5,focusRegen:-1},effects:[{type:"replace_spell",name:"Crepuscular Ray",base_spell:5,spell_type:"damage",scaling:"spell",display:"One Focus",cost:0,parts:[{name:"Single Arrow",type:"damage",multipliers:[10,0,0,5,0,0]},{name:"One Focus",type:"total",hits:{"Single Arrow":20}},{name:"Total Damage",type:"total",hits:{"One Focus":7}}]}]},{display_name:"Grape Bomb",desc:"Arrow bomb will throw 3 additional smaller bombs when exploding.",archetype:"",archetype_req:0,parents:["Cheaper Escape (2)"],dependencies:[],blockers:[],cost:2,display:{row:37,col:7},properties:{miniBombs:3,aoe:2},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Grape Bomb",cost:0,multipliers:[30,0,0,0,10,0]}]},{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,parents:["Grape Bomb"],dependencies:["Basaltic Trap"],blockers:[],cost:2,display:{row:38,col:6},properties:{attackSpeed:.2},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Tangled Traps",cost:0,multipliers:[20,0,0,0,0,20]}]},{display_name:"Snow Storm",desc:"Enemies near you will be slowed down.",archetype:"",archetype_req:0,parents:["Geyser Stomp","More Focus (2)"],dependencies:[],blockers:[],cost:2,display:{row:39,col:2},properties:{range:2.5,slowness:.3}},{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,parents:["Snow Storm"],dependencies:["Guardian Angels"],blockers:[],cost:2,display:{row:40,col:1},properties:{range:10,shots:5},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Single Arrow",cost:0,multipliers:[0,0,0,0,20,0]},{type:"add_spell_prop",base_spell:4,target_part:"Single Bow",cost:0,hits:{"Single Arrow":5}}]},{display_name:"Minefield",desc:"Allow you to place +6 Traps, but with reduced damage and range.",archetype:"Trapper",archetype_req:10,parents:["Grape Bomb","Cheaper Arrow Bomb (2)"],dependencies:["Basaltic Trap"],blockers:[],cost:2,display:{row:40,col:7},properties:{aoe:-2,traps:6},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Basaltic Trap",cost:0,multipliers:[-80,0,0,0,0,0]}]},{display_name:"Bow Proficiency I",desc:"Improve your Main Attack's damage and range when using a bow.",archetype:"",archetype_req:0,parents:["Arrow Bomb"],dependencies:[],blockers:[],cost:1,display:{row:2,col:4},properties:{mainAtk_range:6},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"mdPct",value:5}]}]},{display_name:"Cheaper Arrow Bomb",desc:"Reduce the Mana cost of Arrow Bomb.",archetype:"",archetype_req:0,parents:["Bow Proficiency I"],dependencies:[],blockers:[],cost:1,display:{row:2,col:6},properties:{},effects:[{type:"add_spell_prop",base_spell:3,cost:-10}]},{display_name:"Cheaper Arrow Storm",desc:"Reduce the Mana cost of Arrow Storm.",archetype:"",archetype_req:0,parents:["Grappling Hook","Windstorm","Focus"],dependencies:[],blockers:[],cost:1,display:{row:21,col:3},properties:{},effects:[{type:"add_spell_prop",base_spell:1,cost:-5}]},{display_name:"Cheaper Escape",desc:"Reduce the Mana cost of Escape.",archetype:"",archetype_req:0,parents:["Arrow Storm","Arrow Shield"],dependencies:[],blockers:[],cost:1,display:{row:9,col:4},properties:{},effects:[{type:"add_spell_prop",base_spell:2,cost:-5}]},{display_name:"Earth Mastery",desc:"Increases your base damage from all Earth attacks",archetype:"Trapper",archetype_req:0,parents:["Arrow Shield"],dependencies:[],blockers:[],cost:1,display:{row:13,col:8},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"eDamPct",value:20},{type:"stat",name:"eDam",value:[2,4]}]}]},{display_name:"Thunder Mastery",desc:"Increases your base damage from all Thunder attacks",archetype:"Boltslinger",archetype_req:0,parents:["Arrow Storm","Fire Mastery"],dependencies:[],blockers:[],cost:1,display:{row:13,col:2},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"tDamPct",value:10},{type:"stat",name:"tDam",value:[1,8]}]}]},{display_name:"Water Mastery",desc:"Increases your base damage from all Water attacks",archetype:"Sharpshooter",archetype_req:0,parents:["Cheaper Escape","Thunder Mastery","Fire Mastery"],dependencies:[],blockers:[],cost:1,display:{row:14,col:4},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"wDamPct",value:15},{type:"stat",name:"wDam",value:[2,4]}]}]},{display_name:"Air Mastery",desc:"Increases base damage from all Air attacks",archetype:"Battle Monk",archetype_req:0,parents:["Arrow Storm"],dependencies:[],blockers:[],cost:1,display:{row:13,col:0},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"aDamPct",value:15},{type:"stat",name:"aDam",value:[3,4]}]}]},{display_name:"Fire Mastery",desc:"Increases base damage from all Earth attacks",archetype:"Sharpshooter",archetype_req:0,parents:["Thunder Mastery","Arrow Shield"],dependencies:[],blockers:[],cost:1,display:{row:13,col:6},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"fDamPct",value:15},{type:"stat",name:"fDam",value:[3,5]}]}]},{display_name:"More Shields",desc:"Give +2 charges to Arrow Shield.",archetype:"",archetype_req:0,parents:["Grappling Hook","Basaltic Trap"],dependencies:["Arrow Shield"],blockers:[],cost:1,display:{row:21,col:7},properties:{shieldCharges:2}},{display_name:"Stormy Feet",desc:"Windy Feet will last longer and add more speed.",archetype:"",archetype_req:0,parents:["Windstorm"],dependencies:["Windy Feet"],blockers:[],cost:1,display:{row:23,col:1},properties:{duration:60},effects:[{type:"stat_bonus",bonuses:[{type:"stat",name:"spdPct",value:20}]}]},{display_name:"Refined Gunpowder",desc:"Increase the damage of Arrow Bomb.",archetype:"",archetype_req:0,parents:["Windstorm"],dependencies:[],blockers:[],cost:1,display:{row:25,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Arrow Bomb",cost:0,multipliers:[50,0,0,0,0,0]}]},{display_name:"More Traps",desc:"Increase the maximum amount of active Traps you can have by +2.",archetype:"Trapper",archetype_req:10,parents:["Bouncing Bomb"],dependencies:["Basaltic Trap"],blockers:[],cost:1,display:{row:26,col:8},properties:{traps:2}},{display_name:"Better Arrow Shield",desc:"Arrow Shield will gain additional area of effect, knockback and damage.",archetype:"Sharpshooter",archetype_req:0,parents:["Mana Trap","Shocking Bomb","Twain's Arc"],dependencies:["Arrow Shield"],blockers:[],cost:1,display:{row:28,col:6},properties:{aoe:1},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Arrow Shield",multipliers:[40,0,0,0,0,0]}]},{display_name:"Better Leap",desc:"Reduce leap's cooldown by 1s.",archetype:"Boltslinger",archetype_req:0,parents:["Leap","Homing Shots"],dependencies:["Leap"],blockers:[],cost:1,display:{row:29,col:1},properties:{cooldown:-1}},{display_name:"Better Guardian Angels",desc:"Your Guardian Angels can shoot +4 arrows before disappearing.",archetype:"Boltslinger",archetype_req:0,parents:["Escape Artist","Homing Shots"],dependencies:["Guardian Angels"],blockers:[],cost:1,display:{row:31,col:2},properties:{},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Single Bow",cost:0,hits:{"Single Arrow":4}}]},{display_name:"Cheaper Arrow Storm (2)",desc:"Reduce the Mana cost of Arrow Storm.",archetype:"",archetype_req:0,parents:["Initiator","Mana Trap"],dependencies:[],blockers:[],cost:1,display:{row:31,col:8},properties:{},effects:[{type:"add_spell_prop",base_spell:1,cost:-5}]},{display_name:"Precise Shot",desc:"+30% Critical Hit Damage",archetype:"",archetype_req:0,parents:["Better Guardian Angels","Cheaper Arrow Shield","Arrow Hurricane"],dependencies:[],blockers:[],cost:1,display:{row:33,col:2},properties:{mainAtk_range:6},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"mdCritPct",value:30}]}]},{display_name:"Cheaper Arrow Shield",desc:"Reduce the Mana cost of Arrow Shield.",archetype:"",archetype_req:0,parents:["Precise Shot","Initiator"],dependencies:[],blockers:[],cost:1,display:{row:33,col:4},properties:{},effects:[{type:"add_spell_prop",base_spell:4,cost:-5}]},{display_name:"Rocket Jump",desc:"Arrow Bomb's self-damage will knockback you farther away.",archetype:"",archetype_req:0,parents:["Cheaper Arrow Storm (2)","Initiator"],dependencies:["Arrow Bomb"],blockers:[],cost:1,display:{row:33,col:6},properties:{}},{display_name:"Cheaper Escape (2)",desc:"Reduce the Mana cost of Escape.",archetype:"",archetype_req:0,parents:["Call of the Hound","Decimator"],dependencies:[],blockers:[],cost:1,display:{row:34,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:2,cost:-5}]},{display_name:"Stronger Hook",desc:"Increase your Grappling Hook's range, speed and strength.",archetype:"Trapper",archetype_req:5,parents:["Cheaper Escape (2)"],dependencies:["Grappling Hook"],blockers:[],cost:1,display:{row:35,col:8},properties:{range:8}},{display_name:"Cheaper Arrow Bomb (2)",desc:"Reduce the Mana cost of Arrow Bomb.",archetype:"",archetype_req:0,parents:["More Focus (2)","Minefield"],dependencies:[],blockers:[],cost:1,display:{row:40,col:5},properties:{},effects:[{type:"add_spell_prop",base_spell:3,cost:-5}]},{display_name:"Bouncing Bomb",desc:"Arrow Bomb will bounce once when hitting a block or enemy",archetype:"",archetype_req:0,parents:["More Shields"],dependencies:[],blockers:[],cost:2,display:{row:25,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Total Damage",cost:0,hits:{"Arrow Bomb":2}}]},{display_name:"Homing Shots",desc:"Your Main Attack arrows will follow nearby enemies and not be affected by gravity",archetype:"",archetype_req:0,parents:["Leap","Shocking Bomb"],dependencies:[],blockers:[],cost:2,display:{row:28,col:2},properties:{},effects:[]},{display_name:"Shrapnel Bomb",desc:"Arrow Bomb's explosion will fling 15 shrapnel, dealing damage in a large area",archetype:"Boltslinger",archetype_req:8,parents:["Arrow Hurricane","Precise Shot"],dependencies:[],blockers:[],cost:2,display:{row:34,col:1},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Shrapnel Bomb",cost:0,multipliers:[40,0,0,0,20,0]}]},{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:["Geyser Stomp"],dependencies:[],blockers:[],cost:2,display:{row:38,col:0},properties:{},effects:[]},{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,parents:["Escape"],dependencies:[],blockers:["Power Shots"],cost:1,display:{row:7,col:2},properties:{arrow:2},effects:[{type:"add_spell_prop",base_spell:0,target_part:"Melee Damage",cost:0,multipliers:.7}]},{display_name:"Triple Shots",desc:"Triple Main Attack arrows, but they deal -20% damage per arrow",archetype:"Boltslinger",archetype_req:0,parents:["Arrow Rain","Frenzy"],dependencies:["Double Shots"],blockers:[],cost:1,display:{row:17,col:0},properties:{arrow:2},effects:[{type:"add_spell_prop",base_spell:0,target_part:"Melee Damage",cost:0,multipliers:.7}]},{display_name:"Power Shots",desc:"Main Attack arrows have increased speed and knockback",archetype:"Sharpshooter",archetype_req:0,parents:["Escape"],dependencies:[],blockers:["Double Shots"],cost:1,display:{row:7,col:6},properties:{},effects:[]},{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:["Phantom Ray"],dependencies:[],blockers:[],cost:2,display:{row:19,col:4},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Focus",output:{type:"stat",abil_name:"Focus",name:"dmgPct"},scaling:[35],max:3}]},{display_name:"More Focus",desc:"Add +2 max Focus",archetype:"Sharpshooter",archetype_req:0,parents:["Cheaper Arrow Storm","Grappling Hook"],dependencies:[],blockers:[],cost:1,display:{row:22,col:4},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Focus",output:{type:"stat",abil_name:"Focus",name:"dmgPct"},scaling:[35],max:5}]},{display_name:"More Focus (2)",desc:"Add +2 max Focus",archetype:"Sharpshooter",archetype_req:0,parents:["Crepuscular Ray","Snow Storm"],dependencies:[],blockers:[],cost:1,display:{row:39,col:4},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Focus",output:{type:"stat",abil_name:"Focus",name:"dmgPct"},scaling:[35],max:7}]},{display_name:"Traveler",desc:"For every 1% Walk Speed you have from items, gain +1 Raw Spell Damage (Max 100)",archetype:"",archetype_req:0,parents:["Refined Gunpowder","Twain's Arc"],dependencies:[],blockers:[],cost:1,display:{row:25,col:2},properties:{},effects:[{type:"stat_scaling",slider:!1,inputs:[{type:"stat",name:"spd"}],output:{type:"stat",name:"sdRaw"},scaling:[1],max:100}]},{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,parents:["More Shields"],dependencies:["Basaltic Trap"],blockers:[],cost:2,display:{row:22,col:8},properties:{max:80},effects:[]},{display_name:"Stronger Patient Hunter",desc:"Add +80% Max Damage to Patient Hunter",archetype:"Trapper",archetype_req:0,parents:["Grape Bomb"],dependencies:["Patient Hunter"],blockers:[],cost:1,display:{row:38,col:8},properties:{max:80},effects:[]},{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:["Triple Shots","Nimble String"],dependencies:[],blockers:[],cost:2,display:{row:17,col:2},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Hits dealt",output:{type:"stat",name:"spd"},scaling:[6],max:200}]},{display_name:"Phantom Ray",desc:"Condense Arrow Storm into a single ray that damages enemies 10 times per second",archetype:"Sharpshooter",archetype_req:0,parents:["Water Mastery","Fire Creep"],dependencies:["Arrow Storm"],blockers:["Windstorm","Nimble String","Arrow Hurricane"],cost:2,display:{row:16,col:4},properties:{},effects:[{type:"replace_spell",name:"Phantom Ray",cost:40,display_text:"Max Damage",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}}]}]},{display_name:"Arrow Rain",desc:"When Arrow Shield loses its last charge, unleash 200 arrows raining down on enemies",archetype:"Trapper",archetype_req:0,parents:["Nimble String","Air Mastery"],dependencies:["Arrow Shield"],blockers:[],cost:2,display:{row:15,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Arrow Rain",cost:0,multipliers:[120,0,0,0,0,80]}]},{display_name:"Decimator",desc:"Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 50%)",archetype:"Sharpshooter",archetype_req:0,parents:["Cheaper Arrow Shield"],dependencies:["Phantom Ray"],blockers:[],cost:1,display:{row:34,col:5},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Phantom Ray hits",output:{type:"stat",name:"PhRayDmg"},scaling:10,max:50}]}],Warrior:[{display_name:"Bash",desc:"Violently bash the ground, dealing high damage in a large area",archetype:"",archetype_req:0,parents:[],dependencies:[],blockers:[],cost:1,display:{row:0,col:4},properties:{aoe:4,range:3},effects:[{type:"replace_spell",name:"Bash",cost:45,display_text:"Total Damage Average",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}}]}]},{display_name:"Spear Proficiency 1",desc:"Improve your Main Attack's damage and range w/ spear",archetype:"",archetype_req:0,parents:["Bash"],dependencies:[],blockers:[],cost:1,display:{row:2,col:4},properties:{melee_range:1},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"mdPct",value:5}]}]},{display_name:"Cheaper Bash",desc:"Reduce the Mana cost of Bash",archetype:"",archetype_req:0,parents:["Spear Proficiency 1"],dependencies:[],blockers:[],cost:1,display:{row:2,col:2},properties:{},effects:[{type:"add_spell_prop",base_spell:1,cost:-10}]},{display_name:"Double Bash",desc:"Bash will hit a second time at a farther range",archetype:"",archetype_req:0,parents:["Spear Proficiency 1"],dependencies:[],blockers:[],cost:1,display:{row:4,col:4},properties:{range:3},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Total Damage",cost:0,hits:{name:"Single Hit",value:1}},{type:"add_spell_prop",base_spell:1,target_part:"Single Hit",cost:0,multipliers:[-50,0,0,0,0,0]}]},{display_name:"Charge",desc:"Charge forward at high speed (hold shift to cancel)",archetype:"",archetype_req:0,parents:["Double Bash"],dependencies:[],blockers:[],cost:1,display:{row:6,col:4},properties:{},effects:[{type:"replace_spell",name:"Charge",cost:25,display_text:"Total Damage Average",base_spell:2,spell_type:"damage",scaling:"spell",display:"Total Damage",parts:[{name:"None",type:"damage",multipliers:[0,0,0,0,0,0]},{name:"Total Damage",type:"total",hits:{None:0}}]}]},{display_name:"Heavy Impact",desc:"After using Charge, violently crash down into the ground and deal damage",archetype:"",archetype_req:0,parents:["Uppercut"],dependencies:[],blockers:[],cost:1,display:{row:9,col: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]}]},{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:["Charge"],dependencies:[],blockers:["Tougher Skin"],cost:1,display:{row:6,col:2},properties:{},effects:[{type:"stat_scaling",slider:!1,inputs:[{type:"stat",name:"mdPct"},{type:"stat",name:"mdRaw"}],output:{type:"stat",name:"spd"},scaling:[1,1],max:20}]},{display_name:"Tougher Skin",desc:"Harden your skin and become permanently +5% more resistant\nFor every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)",archetype:"Paladin",archetype_req:0,parents:["Charge"],dependencies:[],blockers:["Vehement"],cost:1,display:{row:6,col:6},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"baseResist",value:"5"}]},{type:"stat_scaling",slider:!1,inputs:[{type:"stat",name:"hprRaw"},{type:"stat",name:"hprPct"}],output:{type:"stat",name:"hpBonus"},scaling:[10,10],max:100}]},{display_name:"Uppercut",desc:"Rocket enemies in the air and deal massive damage",archetype:"",archetype_req:0,parents:["Vehement"],dependencies:[],blockers:[],cost:1,display:{row:8,col:2},properties:{aoe:3,range:5},effects:[{type:"replace_spell",name:"Uppercut",cost:45,display_text:"Total Damage Average",base_spell:3,spell_type:"damage",scaling:"spell",display:"total",parts:[{name:"Uppercut",type:"damage",multipliers:[150,50,50,0,0,0]},{name:"Total Damage",type:"total",hits:{Uppercut:1}}]}]},{display_name:"Cheaper Charge",desc:"Reduce the Mana cost of Charge",archetype:"",archetype_req:0,parents:["Uppercut","War Scream"],dependencies:[],blockers:[],cost:1,display:{row:8,col:4},properties:{},effects:[{type:"add_spell_prop",base_spell:2,cost:-5}]},{display_name:"War Scream",desc:"Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies",archetype:"",archetype_req:0,parents:["Tougher Skin"],dependencies:[],blockers:[],cost:1,display:{row:8,col:6},properties:{duration:30,aoe:12,defense_bonus:10},effects:[{type:"replace_spell",name:"War Scream",cost:35,display_text:"War Scream",base_spell:4,spell_type:"damage",scaling:"spell",display:"Total Damage Average",parts:[{name:"War Scream",type:"damage",multipliers:[50,0,0,0,50,0]}]}]},{display_name:"Earth Mastery",desc:"Increases base damage from all Earth attacks",archetype:"Fallen",archetype_req:0,parents:["Uppercut"],dependencies:[],blockers:[],cost:1,display:{row:10,col:0},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"eDamPct",value:20},{type:"stat",name:"eDam",value:[2,4]}]}]},{display_name:"Thunder Mastery",desc:"Increases base damage from all Thunder attacks",archetype:"Fallen",archetype_req:0,parents:["Uppercut","Air Mastery"],dependencies:[],blockers:[],cost:1,display:{row:10,col:2},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"tDamPct",value:10},{type:"stat",name:"tDam",value:[1,8]}]}]},{display_name:"Water Mastery",desc:"Increases base damage from all Water attacks",archetype:"Battle Monk",archetype_req:0,parents:["Cheaper Charge","Thunder Mastery","Air Mastery"],dependencies:[],blockers:[],cost:1,display:{row:11,col:4},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"wDamPct",value:15},{type:"stat",name:"wDam",value:[2,4]}]}]},{display_name:"Air Mastery",desc:"Increases base damage from all Air attacks",archetype:"Battle Monk",archetype_req:0,parents:["War Scream","Thunder Mastery"],dependencies:[],blockers:[],cost:1,display:{row:10,col:6},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"aDamPct",value:15},{type:"stat",name:"aDam",value:[3,4]}]}]},{display_name:"Fire Mastery",desc:"Increases base damage from all Earth attacks",archetype:"Paladin",archetype_req:0,parents:["War Scream"],dependencies:[],blockers:[],cost:1,display:{row:10,col:8},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"fDamPct",value:15},{type:"stat",name:"fDam",value:[3,5]}]}]},{display_name:"Quadruple Bash",desc:"Bash will hit 4 times at an even larger range",archetype:"Fallen",archetype_req:0,parents:["Earth Mastery","Fireworks"],dependencies:[],blockers:[],cost:2,display:{row:12,col:0},properties:{range:6},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Total Damage",cost:0,hits:{"Single Hit":2}},{type:"add_spell_prop",base_spell:1,target_part:"Single Hit",cost:0,multipliers:[-20,0,0,0,0,0]}]},{display_name:"Fireworks",desc:"Mobs hit by Uppercut will explode mid-air and receive additional damage",archetype:"Fallen",archetype_req:0,parents:["Thunder Mastery","Quadruple Bash"],dependencies:[],blockers:[],cost:2,display:{row:12,col:2},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Fireworks",cost:0,multipliers:[80,0,20,0,0,0]},{type:"add_spell_prop",base_spell:3,target_part:"Total Damage",cost:0,hits:{Fireworks:1}}]},{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,parents:["Water Mastery"],dependencies:["Uppercut"],blockers:[],cost:2,display:{row:13,col:4},properties:{range:4},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Uppercut",cost:-10,multipliers:[-70,0,0,0,0,0]},{type:"convert_spell_conv",target_part:"all",conversion:"water"}]},{display_name:"Flyby Jab",desc:"Damage enemies in your way when using Charge",archetype:"",archetype_req:0,parents:["Air Mastery","Flaming Uppercut"],dependencies:[],blockers:[],cost:2,display:{row:12,col:6},properties:{aoe:2},effects:[{type:"add_spell_prop",base_spell:2,target_part:"Flyby Jab",cost:0,multipliers:[20,0,0,0,0,40]}]},{display_name:"Flaming Uppercut",desc:"Uppercut will light mobs on fire, dealing damage every 0.6 seconds",archetype:"Paladin",archetype_req:0,parents:["Fire Mastery","Flyby Jab"],dependencies:["Uppercut"],blockers:[],cost:2,display:{row:12,col:8},properties:{duration:3,tick:.6},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Flaming Uppercut",cost:0,multipliers:[0,0,0,0,50,0]},{type:"add_spell_prop",base_spell:3,target_part:"Flaming Uppercut Total Damage",cost:0,hits:{"Flaming Uppercut":5}},{type:"add_spell_prop",base_spell:3,target_part:"Total Damage",cost:0,hits:{"Flaming Uppercut":5}}]},{display_name:"Iron Lungs",desc:"War Scream deals more damage",archetype:"",archetype_req:0,parents:["Flyby Jab","Flaming Uppercut"],dependencies:[],blockers:[],cost:1,display:{row:13,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:4,target_part:"War Scream",cost:0,multipliers:[30,0,0,0,0,30]}]},{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:["Counter"],dependencies:[],blockers:[],cost:2,display:{row:15,col:2},properties:{},effects:[]},{display_name:"Counter",desc:"When dodging a nearby enemy attack, get 30% chance to instantly attack back",archetype:"Battle Monk",archetype_req:0,parents:["Half-Moon Swipe"],dependencies:[],blockers:[],cost:2,display:{row:15,col:4},properties:{chance:30},effects:[{type:"add_spell_prop",base_spell:5,target_part:"Counter",cost:0,multipliers:[60,0,20,0,0,20]}]},{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:["Iron Lungs"],dependencies:["War Scream"],blockers:[],cost:2,display:{row:15,col:7},properties:{mantle_charge:3},effects:[]},{display_name:"Bak'al's Grasp",desc:"After casting War Scream, become Corrupted (15s Cooldown). You cannot heal while in that state\n\nWhile Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)",archetype:"Fallen",archetype_req:2,parents:["Quadruple Bash","Fireworks"],dependencies:["War Scream"],blockers:[],cost:2,display:{row:16,col:1},properties:{cooldown:15},effects:[{type:"stat_scaling",slider:!0,slider_name:"Corrupted",output:{type:"stat",name:"raw"},scaling:[4],slider_step:2,max:120}]},{display_name:"Spear Proficiency 2",desc:"Improve your Main Attack's damage and range w/ spear",archetype:"",archetype_req:0,parents:["Bak'al's Grasp","Cheaper Uppercut"],dependencies:[],blockers:[],cost:1,display:{row:17,col:0},properties:{melee_range:1},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"mdPct",value:5}]}]},{display_name:"Cheaper Uppercut",desc:"Reduce the Mana Cost of Uppercut",archetype:"",archetype_req:0,parents:["Spear Proficiency 2","Aerodynamics","Counter"],dependencies:[],blockers:[],cost:1,display:{row:17,col:3},properties:{},effects:[{type:"add_spell_prop",base_spell:3,cost:-5}]},{display_name:"Aerodynamics",desc:"During Charge, you can steer and change direction",archetype:"Battle Monk",archetype_req:0,parents:["Cheaper Uppercut","Provoke"],dependencies:[],blockers:[],cost:2,display:{row:17,col:5},properties:{},effects:[]},{display_name:"Provoke",desc:"Mobs damaged by War Scream will target only you for at least 5s \n\nReduce the Mana cost of War Scream",archetype:"Paladin",archetype_req:0,parents:["Aerodynamics","Mantle of the Bovemists"],dependencies:[],blockers:[],cost:1,display:{row:17,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:4,cost:-5}]},{display_name:"Precise Strikes",desc:"+30% Critical Hit Damage",archetype:"",archetype_req:0,parents:["Cheaper Uppercut","Spear Proficiency 2"],dependencies:[],blockers:[],cost:1,display:{row:18,col:2},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"critDmg",value:30}]}]},{display_name:"Air Shout",desc:"War Scream will fire a projectile that can go through walls and deal damage multiple times",archetype:"",archetype_req:0,parents:["Aerodynamics","Provoke"],dependencies:["War Scream"],blockers:[],cost:2,display:{row:18,col:6},properties:{},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Air Shout",cost:0,multipliers:[20,0,0,0,0,5]}]},{display_name:"Enraged Blow",desc:"While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)",archetype:"Fallen",archetype_req:0,parents:["Spear Proficiency 2"],dependencies:["Bak'al's Grasp"],blockers:[],cost:2,display:{row:20,col:0},properties:{},effects:[{type:"stat_scaling",slider:!1,inputs:[{type:"stat",name:"hpBonus"}],output:{type:"stat",name:"dmgPct"},scaling:[2],max:200}]},{display_name:"Flying Kick",desc:"When using Charge, mobs hit will halt your momentum and get knocked back",archetype:"Battle Monk",archetype_req:1,parents:["Cheaper Uppercut","Stronger Mantle"],dependencies:[],blockers:[],cost:2,display:{row:20,col:3},properties:{},effects:[{type:"add_spell_prop",base_spell:2,target_part:"Flying Kick",cost:0,multipliers:[120,0,0,10,0,20]}]},{display_name:"Stronger Mantle",desc:"Add +2 additional charges to Mantle of the Bovemists",archetype:"Paladin",archetype_req:0,parents:["Manachism","Flying Kick"],dependencies:[],blockers:[],cost:1,display:{row:20,col:6},properties:{mantle_charge:2},effects:[]},{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:["Stronger Mantle","Provoke"],dependencies:[],blockers:[],cost:2,display:{row:20,col:8},properties:{cooldown:1},effects:[]},{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",archetype:"",archetype_req:0,parents:["Enraged Blow","Ragnarokkr"],dependencies:[],blockers:[],cost:2,display:{row:22,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Boiling Blood",cost:0,multipliers:[25,0,0,0,5,0]}]},{display_name:"Ragnarokkr",desc:"War Scream become deafening, increasing its range and giving damage bonus to players",archetype:"Fallen",archetype_req:0,parents:["Boiling Blood","Flying Kick"],dependencies:["War Scream"],blockers:[],cost:2,display:{row:22,col:2},properties:{damage_bonus:30,aoe:2},effects:[{type:"add_spell_prop",base_spell:4,cost:10}]},{display_name:"Ambidextrous",desc:"Increase your chance to attack with Counter by +30%",archetype:"",archetype_req:0,parents:["Flying Kick","Stronger Mantle","Burning Heart"],dependencies:["Counter"],blockers:[],cost:1,display:{row:22,col:4},properties:{chance:30},effects:[]},{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:["Ambidextrous","Stronger Bash"],dependencies:[],blockers:[],cost:1,display:{row:22,col:6},properties:{},effects:[{type:"stat_scaling",slider:!1,inputs:[{type:"stat",name:"hpBonus"}],output:{type:"stat",name:"fDamPct"},scaling:[2],max:100,slider_step:100}]},{display_name:"Stronger Bash",desc:"Increase the damage of Bash",archetype:"",archetype_req:0,parents:["Burning Heart","Manachism"],dependencies:[],blockers:[],cost:1,display:{row:22,col:8},properties:{},effects:[{type:"add_spell_prop",base_spell:1,target_part:"Single Hit",cost:0,multipliers:[30,0,0,0,0,0]}]},{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,parents:["Ragnarokkr","Boiling Blood"],dependencies:["Bak'al's Grasp"],blockers:[],cost:2,display:{row:23,col:1},properties:{},effects:[]},{display_name:"Comet",desc:"After being hit by Fireworks, enemies will crash into the ground and receive more damage",archetype:"Fallen",archetype_req:0,parents:["Ragnarokkr"],dependencies:["Fireworks"],blockers:[],cost:2,display:{row:24,col:2},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}}]},{display_name:"Collide",desc:"Mobs thrown into walls from Flying Kick will explode and receive additonal damage",archetype:"Battle Monk",archetype_req:4,parents:["Ambidextrous","Burning Heart"],dependencies:["Flying Kick"],blockers:[],cost:2,display:{row:23,col:5},properties:{aoe:4},effects:[{type:"add_spell_prop",base_spell:2,target_part:"Collide",cost:0,multipliers:[100,0,0,0,50,0]}]},{display_name:"Rejuvenating Skin",desc:"Regain back 30% of the damage you take as healing over 30s",archetype:"Paladin",archetype_req:0,parents:["Burning Heart","Stronger Bash"],dependencies:[],blockers:[],cost:2,display:{row:23,col:7},properties:{},effects:[]},{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",archetype:"",archetype_req:0,parents:["Boiling Blood","Radiant Devotee"],dependencies:["Bak'al's Grasp"],blockers:[],cost:1,display:{row:26,col:0},properties:{cooldown:-5},effects:[{type:"stat_scaling",slider:!0,slider_name:"Corrupted",output:{type:"stat",name:"raw"},scaling:[1],slider_step:2,max:50}]},{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:["Whirlwind Strike","Uncontainable Corruption"],dependencies:[],blockers:[],cost:1,display:{row:26,col:2},properties:{},effects:[{type:"stat_scaling",inputs:[{type:"stat",name:"ref"}],output:{type:"stat",name:"mr"},scaling:[1],max:10,slider_step:4}]},{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,parents:["Ambidextrous","Radiant Devotee"],dependencies:["Uppercut"],blockers:[],cost:2,display:{row:26,col:4},properties:{range:2},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Uppercut",cost:0,multipliers:[0,0,0,0,0,50]}]},{display_name:"Mythril Skin",desc:"Gain +5% Base Resistance and become immune to knockback",archetype:"Paladin",archetype_req:6,parents:["Rejuvenating Skin"],dependencies:[],blockers:[],cost:2,display:{row:26,col:7},properties:{},effects:[{type:"raw_stat",bonuses:[{type:"stat",name:"baseResist",value:5}]}]},{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,parents:["Uncontainable Corruption","Radiant Devotee"],dependencies:["Bak'al's Grasp"],blockers:[],cost:2,display:{row:27,col:1},properties:{duration:5},effects:[]},{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,parents:["Mythril Skin","Sparkling Hope"],dependencies:[],blockers:[],cost:2,display:{row:27,col:6},properties:{},effects:[{type:"add_spell_prop",base_spell:5,target_part:"Shield Strike",cost:0,multipliers:[60,0,20,0,0,0]}]},{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:["Mythril Skin"],dependencies:[],blockers:[],cost:2,display:{row:27,col:8},properties:{aoe:6},effects:[{type:"add_spell_prop",base_spell:5,target_part:"Sparkling Hope",cost:0,multipliers:[10,0,5,0,0,0]}]},{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,parents:["Tempest","Uncontainable Corruption"],dependencies:[],blockers:[],cost:2,display:{row:28,col:0},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Corrupted",output:{type:"stat",name:"bashAoE"},scaling:[1],max:10,slider_step:3}]},{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,parents:["Massive Bash","Spirit of the Rabbit"],dependencies:[],blockers:[],cost:2,display:{row:28,col:2},properties:{aoe:16},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Tempest",cost:"0",multipliers:[30,10,0,0,0,10]},{type:"add_spell_prop",base_spell:4,target_part:"Tempest Total Damage",cost:"0",hits:{Tempest:3}},{type:"add_spell_prop",base_spell:4,target_part:"Total Damage",cost:"0",hits:{Tempest:3}}]},{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,parents:["Tempest","Whirlwind Strike"],dependencies:[],blockers:[],cost:1,display:{row:28,col:4},properties:{},effects:[{type:"add_spell_prop",base_spell:2,cost:-5},{type:"raw_stat",bonuses:[{type:"stat",name:"spd",value:20}]}]},{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,parents:["Tempest","Massive Bash"],dependencies:[],blockers:[],cost:2,display:{row:29,col:1},properties:{},effects:[]},{display_name:"Axe Kick",desc:"Increase the damage of Uppercut, but also increase its mana cost",archetype:"",archetype_req:0,parents:["Tempest","Spirit of the Rabbit"],dependencies:[],blockers:[],cost:1,display:{row:29,col:3},properties:{},effects:[{type:"add_spell_prop",base_spell:3,target_part:"Uppercut",cost:10,multipliers:[100,0,0,0,0,0]}]},{display_name:"Radiance",desc:"Bash will buff your allies' positive IDs. (15s Cooldown)",archetype:"Paladin",archetype_req:2,parents:["Spirit of the Rabbit","Cheaper Bash 2"],dependencies:[],blockers:[],cost:2,display:{row:29,col:5},properties:{cooldown:15},effects:[]},{display_name:"Cheaper Bash 2",desc:"Reduce the Mana cost of Bash",archetype:"",archetype_req:0,parents:["Radiance","Shield Strike","Sparkling Hope"],dependencies:[],blockers:[],cost:1,display:{row:29,col:7},properties:{},effects:[{type:"add_spell_prop",base_spell:1,cost:-5}]},{display_name:"Cheaper War Scream",desc:"Reduce the Mana cost of War Scream",archetype:"",archetype_req:0,parents:["Massive Bash"],dependencies:[],blockers:[],cost:1,display:{row:31,col:0},properties:{},effects:[{type:"add_spell_prop",base_spell:4,cost:-5}]},{display_name:"Discombobulate",desc:"Every time you hit an enemy, briefly increase your elemental damage dealt to them by +2 (Additive, Max +50). This bonus decays -5 every second",archetype:"Battle Monk",archetype_req:12,parents:["Thunderclap"],dependencies:[],blockers:[],cost:2,display:{row:31,col:2},properties:{},effects:[{type:"stat_scaling",slider:!0,slider_name:"Hits dealt",output:{type:"stat",name:"rainrawButDifferent"},scaling:[2],max:50}]},{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:["Spirit of the Rabbit"],dependencies:[],blockers:[],cost:2,display:{row:31,col:4},properties:{aoe:2},effects:[{type:"convert_spell_conv",target_part:"all",conversion:"thunder"}]},{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:["Thunderclap"],dependencies:[],blockers:[],cost:1,display:{row:32,col:5},properties:{aoe:4,duration:20},effects:[{type:"add_spell_prop",base_spell:4,target_part:"Cyclone",cost:0,multipliers:[10,0,0,0,5,10]},{type:"add_spell_prop",base_spell:4,target_part:"Cyclone Total Damage",cost:0,hits:{Cyclone:40}}]},{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:["Cheaper Bash 2"],dependencies:[],blockers:[],cost:2,display:{row:32,col:7},properties:{},effects:[]},{display_name:"Blood Pact",desc:"If you do not have enough mana to cast a spell, spend health instead (1% health per mana)",archetype:"",archetype_req:10,parents:["Cheaper War Scream"],dependencies:[],blockers:[],cost:2,display:{row:34,col:1},properties:{},effects:[]},{display_name:"Haemorrhage",desc:"Reduce Blood Pact's health cost. (0.5% health per mana)",archetype:"Fallen",archetype_req:0,parents:["Blood Pact"],dependencies:["Blood Pact"],blockers:[],cost:1,display:{row:35,col:2},properties:{},effects:[]},{display_name:"Brink of Madness",desc:"If your health is 25% full or less, gain +40% Resistance",archetype:"",archetype_req:0,parents:["Blood Pact","Cheaper Uppercut 2"],dependencies:[],blockers:[],cost:2,display:{row:35,col:4},properties:{},effects:[]},{display_name:"Cheaper Uppercut 2",desc:"Reduce the Mana cost of Uppercut",archetype:"",archetype_req:0,parents:["Second Chance","Brink of Madness"],dependencies:[],blockers:[],cost:1,display:{row:35,col:6},properties:{},effects:[{type:"add_spell_prop",base_spell:3,cost:-5}]},{display_name:"Martyr",desc:"When you receive a fatal blow, all nearby allies become invincible",archetype:"Paladin",archetype_req:0,parents:["Second Chance"],dependencies:[],blockers:[],cost:2,display:{row:35,col:8},properties:{duration:3,aoe:12},effects:[]}]},atree_example=[{title:"skill",desc:"desc",image:"../media/atree/node.png",connector:!1,row:5,col:3},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:4,col:3},{title:"skill2",desc:"desc",image:"../media/atree/node.png",connector:!1,row:0,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:1,col:2},{title:"skill3",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:2,col:3},{title:"skill4",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:3,col:2},{title:"skill5",desc:"desc",image:"../media/atree/node.png",connector:!1,row:4,col:2},]
diff --git a/js/atree_constants_old.js b/js/atree_constants_old.js
new file mode 100644
index 0000000..e325247
--- /dev/null
+++ b/js/atree_constants_old.js
@@ -0,0 +1,171 @@
+const atrees_old = {
+ "Assassin": [
+ {"title": "Spin Attack", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 0, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 1, "col": 4},
+ {"title": "Dagger Proficiency I", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 2, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 3, "col": 4},
+ {"title": "Double Spin", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 4, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 5, "col": 4},
+ {"title": "Dash", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 6, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 6, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 7, "col": 2},
+ {"title": "Smoke Bomb", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 7, "col": 6},
+ {"title": "Multihit", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 8, "col": 3},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 8, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 8, "col": 1},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 8, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 9, "col": 0},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 9, "col": 2},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 9, "col": 6},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 8, "col": 7},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 8, "col": 8},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 9, "col": 8},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 8},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 10, "col": 1},
+ {"title": "Backstab", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 1},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 9, "col": 4},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 90, "row": 10, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 10, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 4},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 10, "col": 7},
+ {"title": "Fatality", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 7},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 11, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 12, "col": 0},
+ {"title": "Violent Vortex", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 0},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 11, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 12, "col": 2},
+ {"title": "Vanish", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 12, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 13, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 14, "col": 2},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 14, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 12, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 13, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 14, "col": 7},
+ {"title": "Lacerate", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 7},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 15, "col": 1},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 1},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 15, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 5},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 15, "col": 8},
+ {"title": "Wall of Smoke", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 8},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 16, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 17, "col": 0},
+ {"title": "Silent Killer", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 0},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 16, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 17, "col": 2},
+ {"title": "Shadow Travel", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 17, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 5},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 17, "col": 8},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 8},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 18, "col": 4},
+ {"title": "Exploding Clones", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 19, "col": 4},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 18, "col": 3},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 19, "col": 0},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 19, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 3},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 18, "col": 6},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 18, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 19, "col": 7},
+ {"title": "Weightless", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 7},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 20, "col": 1},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 20, "col": 2},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 1},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 20, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 4},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 20, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 21, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 6},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 20, "col": 8},
+ {"title": "Dancing Blade", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 8},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 21, "col": 0},
+ {"title": "Spin Attack Damage", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 22, "col": 0},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 21, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 22, "col": 3},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 22, "col": 1},
+ {"title": "Marked", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 1},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 22, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 23, "col": 5},
+ {"title": "Shurikens", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 6},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 23, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 22, "col": 8},
+ {"title": "Far Reach", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 8},
+ {"title": "Stronger Multihit", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 24, "col": 5},
+ {"title": "Psithurism", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 24, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 24, "col": 1},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 1},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 3},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 24, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 4},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 25, "col": 5},
+ {"title": "Choke Bomb", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 6},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 25, "col": 7},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 8},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 26, "col": 5},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 25, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 26, "col": 0},
+ {"title": "Death Magnet", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 0},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 25, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 26, "col": 2},
+ {"title": "Cheaper Multihit", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 2},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 26, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 26, "col": 7},
+ {"title": "Parry", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 7},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 27, "col": 1},
+ {"title": "Fatal Spin", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 1},
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 27, "col": 3},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 3},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 27, "col": 6},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 6},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 27, "col": 8},
+ {"title": "Wall Jump", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 8},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 28, "col": 0},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 29, "col": 0},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 29, "col": 1},
+ {"title": "Harvester", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 1},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 28, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 29, "col": 4},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 28, "col": 7},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 29, "col": 7},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 7 },
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 30, "col": 2},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 2 },
+ {"image": "../media/atree/connect_t.png", "connector": true, "rotate": 180, "row": 30, "col": 5},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, "row": 30, "col": 6},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 5},
+ {"title": "Ricochet", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 8},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 31, "col": 1},
+ {"title": "Satsujin", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 32, "col": 1},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 31, "col": 4},
+ {"title": "Forbidden Art", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 32, "col": 4},
+ {"image": "../media/atree/connect_line.png", "connector": true, "rotate": 0, "row": 31, "col": 7},
+ {"title": "Jasmine Bloom", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 32, "col": 7},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 180, "row": 32, "col": 0},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 0},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 32, "col": 2},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 2},
+ {"image": "../media/atree/connect_angle.png", "connector": true, "rotate": 270, "row": 32, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 5},
+ {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 8},
+ ]
+}
\ No newline at end of file
diff --git a/js/build_utils.js b/js/build_utils.js
index bbb2d89..a92d38a 100644
--- a/js/build_utils.js
+++ b/js/build_utils.js
@@ -56,6 +56,7 @@ const attackSpeeds = ["SUPER_SLOW", "VERY_SLOW", "SLOW", "NORMAL", "FAST", "VERY
const baseDamageMultiplier = [ 0.51, 0.83, 1.5, 2.05, 2.5, 3.1, 4.3 ];
//0.51, 0.82, 1.50, 2.05, 2.50, 3.11, 4.27
const classes = ["Warrior", "Assassin", "Mage", "Archer", "Shaman"];
+const wep_to_class = new Map([["dagger", "Assassin"], ["spear", "Warrior"], ["wand", "Mage"], ["bow", "Archer"], ["relik", "Shaman"]])
const tiers = ["Normal", "Unique", "Rare", "Legendary", "Fabled", "Mythic", "Set", "Crafted"] //I'm not sure why you would make a custom crafted but if you do you should be able to use it w/ the correct powder formula
const types = armorTypes.concat(accessoryTypes).concat(weaponTypes).concat(consumableTypes).concat(tome_types).map(x => x.substring(0,1).toUpperCase() + x.substring(1));
//weaponTypes.push("sword");
diff --git a/js/builder.js b/js/builder.js
index 96513d8..3b6cf33 100644
--- a/js/builder.js
+++ b/js/builder.js
@@ -147,6 +147,7 @@ function toggle_tab(tab) {
} else {
document.querySelector("#"+tab).style.display = "none";
}
+ console.log(document.querySelector("#"+tab).style.display);
}
// toggle spell arrow
diff --git a/js/builder_graph.js b/js/builder_graph.js
index 5cddf8d..899fd6d 100644
--- a/js/builder_graph.js
+++ b/js/builder_graph.js
@@ -178,6 +178,7 @@ class ItemInputNode extends InputNode {
}
compute_func(input_map) {
+ console.log("Item update...." + Date.now());
const powdering = input_map.get('powdering');
// built on the assumption of no one will type in CI/CR letter by letter
@@ -323,6 +324,20 @@ class WeaponInputDisplayNode extends ComputeNode {
const type = item.statMap.get('type');
this.image.setAttribute('src', '../media/items/new/generic-'+type+'.png');
+
+ //as of now, we NEED to have the dropdown tab visible/not hidden in order to properly display atree stuff.
+ if (!document.getElementById("toggle-atree").classList.contains("toggleOn")) {
+ toggle_tab('atree-dropdown');
+ toggleButton('toggle-atree');
+ }
+
+ //for some reason we have to cast to string
+ construct_AT(document.getElementById("atree-ui"), atrees[wep_to_class.get(type)]);
+
+ if (document.getElementById("toggle-atree").classList.contains("toggleOn")) {
+ toggle_tab('atree-dropdown');
+ toggleButton('toggle-atree');
+ }
}
}
diff --git a/js/computation_graph.js b/js/computation_graph.js
index 90fe08c..0066186 100644
--- a/js/computation_graph.js
+++ b/js/computation_graph.js
@@ -139,8 +139,8 @@ class InputNode extends ComputeNode {
constructor(name, input_field) {
super(name);
this.input_field = input_field;
- this.input_field.addEventListener("input", () => calcSchedule(this, 5000));
- this.input_field.addEventListener("change", () => calcSchedule(this, 500));
+ this.input_field.addEventListener("input", () => calcSchedule(this, 500));
+ this.input_field.addEventListener("change", () => calcSchedule(this, 5));
//calcSchedule(this); Manually fire first update for better control
}
diff --git a/js/display_atree.js b/js/display_atree.js
new file mode 100644
index 0000000..888383e
--- /dev/null
+++ b/js/display_atree.js
@@ -0,0 +1,218 @@
+let atree_map;
+let atree_connectors_map;
+function construct_AT(elem, tree) {
+ console.log("constructing ability tree UI");
+ document.getElementById("atree-active").innerHTML = ""; //reset all atree actives - should be done in a more general way later
+ elem.innerHTML = ""; //reset the atree in the DOM
+
+ if (tree === undefined) {return false;}
+
+ // add in the "Active" title to atree
+ let active_row = document.createElement("div");
+ active_row.classList.add("row", "item-title", "mx-auto", "justify-content-center");
+ active_row.textContent = "Active:";
+ document.getElementById("atree-active").appendChild(active_row);
+
+ atree_map = new Map();
+ atree_connectors_map = new Map()
+ for (let i of tree) {
+ atree_map.set(i.display_name, {display: i.display, parents: i.parents, connectors: []});
+ }
+
+ for (let i = 0; i < tree.length; i++) {
+ let node = tree[i];
+
+ // create rows if not exist
+ let missing_rows = [node.display.row];
+
+ for (let parent of node.parents) {
+ missing_rows.push(tree.find(object => {return object.display_name === parent;}).display.row);
+ }
+ for (let missing_row of missing_rows) {
+ if (document.getElementById("atree-row-" + missing_row) == null) {
+ for (let j = 0; j <= missing_row; j++) {
+ if (document.getElementById("atree-row-" + j) == null) {
+ let row = document.createElement('div');
+ row.classList.add("row");
+ row.id = "atree-row-" + j;
+ //was causing atree rows to be 0 height
+ row.style.minHeight = elem.scrollWidth / 9 + "px";
+ //row.style.minHeight = elem.getBoundingClientRect().width / 9 + "px";
+
+ for (let k = 0; k < 9; k++) {
+ col = document.createElement('div');
+ col.classList.add('col', 'px-0');
+ col.style.minHeight = elem.scrollWidth / 9 + "px";
+ row.appendChild(col);
+
+ atree_connectors_map.set(j + "," + k, [])
+ };
+ elem.appendChild(row);
+ };
+ };
+ };
+ }
+
+
+ let connector_list = [];
+ // create connectors based on parent location
+ for (let parent of node.parents) {
+ let parent_node = atree_map.get(parent);
+
+ let connect_elem = document.createElement("div");
+ connect_elem.style = "background-size: cover; width: 100%; height: 100%;";
+ // connect up
+ for (let i = node.display.row - 1; i > parent_node.display.row; i--) {
+ let connector = connect_elem.cloneNode();
+ connector.style.backgroundImage = "url('../media/atree/connect_line.png')";
+ atree_map.get(node.display_name).connectors.push(i + "," + node.display.col);
+ atree_connectors_map.get(i + "," + node.display.col).push({connector: connector, type: "line"});
+ resolve_connector(i + "," + node.display.col, node);
+ }
+ // connect horizontally
+ let min = Math.min(parent_node.display.col, node.display.col);
+ let max = Math.max(parent_node.display.col, node.display.col);
+ for (let i = min + 1; i < max; i++) {
+ let connector = connect_elem.cloneNode();
+ connector.style.backgroundImage = "url('../media/atree/connect_line.png')";
+ connector.classList.add("rotate-90");
+ atree_map.get(node.display_name).connectors.push(parent_node.display.row + "," + i);
+ atree_connectors_map.get(parent_node.display.row + "," + i).push({connector: connector, type: "line"});
+ resolve_connector(parent_node.display.row + "," + i, node);
+ }
+
+ // connect corners
+
+ if (parent_node.display.row != node.display.row && parent_node.display.col != node.display.col) {
+ let connector = connect_elem.cloneNode();
+ connector.style.backgroundImage = "url('../media/atree/connect_angle.png')";
+ atree_map.get(node.display_name).connectors.push(parent_node.display.row + "," + node.display.col);
+ atree_connectors_map.get(parent_node.display.row + "," + node.display.col).push({connector: connector, type: "angle"});
+ if (parent_node.display.col > node.display.col) {
+ connector.classList.add("rotate-180");
+ }
+ else {// if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) {
+ connector.classList.add("rotate-270");
+ }
+ resolve_connector(parent_node.display.row + "," + node.display.col, node);
+ }
+ }
+
+ // create node
+ let node_elem = document.createElement('div')
+ node_elem.style = "background-image: url('../media/atree/node.png'); background-size: cover; width: 100%; height: 100%;";
+
+ // add tooltip
+ node_elem.addEventListener('mouseover', function(e) {
+ if (e.target !== this) {return;}
+ let tooltip = this.children[0];
+ tooltip.style.top = this.getBoundingClientRect().bottom + window.scrollY * 1.02 + "px";
+ tooltip.style.left = this.parentElement.parentElement.getBoundingClientRect().left + (elem.getBoundingClientRect().width * .2 / 2) + "px";
+ tooltip.style.display = "block";
+ });
+
+ node_elem.addEventListener('mouseout', function(e) {
+ if (e.target !== this) {return;}
+ let tooltip = this.children[0];
+ tooltip.style.display = "none";
+ });
+
+ node_elem.classList.add("fake-button");
+
+ let active_tooltip = document.createElement('div');
+ active_tooltip.classList.add("rounded-bottom", "dark-7", "border", "mb-2", "mx-auto");
+ //was causing active element boxes to be 0 width
+ // active_tooltip.style.width = elem.getBoundingClientRect().width * .80 + "px";
+ active_tooltip.style.display = "none";
+
+ // tooltip text formatting
+
+ let active_tooltip_title = document.createElement('b');
+ active_tooltip_title.classList.add("scaled-font");
+ active_tooltip_title.innerHTML = node.display_name;
+
+ let active_tooltip_text = document.createElement('p');
+ active_tooltip_text.classList.add("scaled-font-sm");
+ active_tooltip_text.textContent = node.desc;
+
+ active_tooltip.appendChild(active_tooltip_title);
+ active_tooltip.appendChild(active_tooltip_text);
+
+ node_tooltip = active_tooltip.cloneNode(true);
+
+ active_tooltip.id = "atree-ab-" + node.display_name.replaceAll(" ", "");
+
+ node_tooltip.style.position = "absolute";
+ node_tooltip.style.zIndex = "100";
+
+ node_elem.appendChild(node_tooltip);
+ document.getElementById("atree-active").appendChild(active_tooltip);
+
+ node_elem.addEventListener('click', function(e) {
+ if (e.target !== this) {return;}
+ let tooltip = document.getElementById("atree-ab-" + node.display_name.replaceAll(" ", ""));
+ if (tooltip.style.display == "block") {
+ tooltip.style.display = "none";
+ this.classList.remove("atree-selected");
+ this.style.backgroundImage = 'url("../media/atree/node.png")';
+ }
+ else {
+ tooltip.style.display = "block";
+ this.classList.add("atree-selected");
+ this.style.backgroundImage = 'url("../media/atree/node-selected.png")';
+ }
+ });
+ document.getElementById("atree-row-" + node.display.row).children[node.display.col].appendChild(node_elem);
+ };
+
+ atree_render_connection();
+};
+
+// resolve connector conflict
+function resolve_connector(pos, node) {
+ if (atree_connectors_map.get(pos).length < 2) {return false;}
+
+ let line = false;
+ let angle = false;
+ let t = false;
+ for (let i of atree_connectors_map.get(pos)) {
+ if (i.type == "line") {
+ line += true;
+ } else if (i.type == "angle") {
+ angle += true;
+ } else if (i.type == "t") {
+ t += true;
+ }
+ }
+
+ let connect_elem = document.createElement("div");
+
+ if ((line && angle)) {
+ connect_elem.style = "background-image: url('../media/atree/connect_t.png'); background-size: cover; width: 100%; height: 100%;"
+ connect_elem.classList.add("rotate-180")
+ atree_connectors_map.set(pos, [{connector: connect_elem, type: "t"}])
+ }
+ if (node.parents.length == 3 && t && atree_same_row(node)) {
+ connect_elem.style = "background-image: url('../media/atree/connect_c.png'); background-size: cover; width: 100%; height: 100%;"
+ atree_connectors_map.set(pos, [{connector: connect_elem, type: "c"}])
+ }
+ // override the conflict with the first children
+ atree_connectors_map.set(pos, [atree_connectors_map.get(pos)[0]])
+}
+
+// check if a node doesn't have same row w/ its parents (used to solve conflict)
+function atree_same_row(node) {
+ for (let i of node.parents) {
+ if (node.display.row == atree_map.get(i).display.row) { return false; }
+ }
+ return true;
+}
+
+// draw the connector onto the screen
+function atree_render_connection() {
+ for (let i of atree_connectors_map.keys()) {
+ if (atree_connectors_map.get(i).length != 0) {
+ document.getElementById("atree-row-" + i.split(",")[0]).children[i.split(",")[1]].appendChild(atree_connectors_map.get(i)[0].connector)
+ }
+ }
+}
diff --git a/media/atree/connect_angle.png b/media/atree/connect_angle.png
new file mode 100644
index 0000000..b1b03fd
Binary files /dev/null and b/media/atree/connect_angle.png differ
diff --git a/media/atree/connect_c.png b/media/atree/connect_c.png
new file mode 100644
index 0000000..cc5022b
Binary files /dev/null and b/media/atree/connect_c.png differ
diff --git a/media/atree/connect_line.png b/media/atree/connect_line.png
new file mode 100644
index 0000000..41ee507
Binary files /dev/null and b/media/atree/connect_line.png differ
diff --git a/media/atree/connect_t.png b/media/atree/connect_t.png
new file mode 100644
index 0000000..8ed976e
Binary files /dev/null and b/media/atree/connect_t.png differ
diff --git a/media/atree/node-blocked.png b/media/atree/node-blocked.png
new file mode 100644
index 0000000..42892b6
Binary files /dev/null and b/media/atree/node-blocked.png differ
diff --git a/media/atree/node-selected.png b/media/atree/node-selected.png
new file mode 100644
index 0000000..f67fef9
Binary files /dev/null and b/media/atree/node-selected.png differ
diff --git a/media/atree/node.png b/media/atree/node.png
new file mode 100644
index 0000000..e37bf89
Binary files /dev/null and b/media/atree/node.png differ