From 8108f033e5e36d0dd9f1e13faeaff830f90ee1f9 Mon Sep 17 00:00:00 2001 From: reschan Date: Mon, 13 Jun 2022 16:21:01 +0700 Subject: [PATCH 01/33] atree initial commit --- builder/index.html | 23 +++++++++-- css/sq2bs.css | 27 ++++++++++++- js/atree_constants.js | 70 ++++++++++++++++++++++++++++++++++ js/sq2bs.js | 66 ++++++++++++++++++++++++++++++++ media/atree/connect_angle.png | Bin 0 -> 1066 bytes media/atree/connect_line.png | Bin 0 -> 1184 bytes media/atree/node.png | Bin 0 -> 5645 bytes 7 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 js/atree_constants.js create mode 100644 media/atree/connect_angle.png create mode 100644 media/atree/connect_line.png create mode 100644 media/atree/node.png diff --git a/builder/index.html b/builder/index.html index 9fe56ed..634bc22 100644 --- a/builder/index.html +++ b/builder/index.html @@ -418,17 +418,22 @@
-
+
-
+
+ +
+
-
+
@@ -607,6 +612,16 @@
+
+
+
+ +
+
+ Active: +
+
+
-
+
-
+
-
+
Active:
diff --git a/css/sq2bs.css b/css/sq2bs.css index 7bad703..6790cb9 100644 --- a/css/sq2bs.css +++ b/css/sq2bs.css @@ -473,3 +473,20 @@ a:hover { -o-transform: rotate(270deg); transform: rotate(270deg); } + +/* atree hover */ +.atree-node { + opacity: 75%; +} + +.atree-node:hover { + opacity: 100%; +} + +.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/sq2bs.js b/js/sq2bs.js index 5a8c677..8b97a88 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -559,7 +559,6 @@ function construct_AT(elem, tree) { // create node let node_elem = document.createElement('div') - node_elem.className = "atree-node"; node_elem.style = "background-image: url('" + node.image + "'); background-size: cover; width: 100%; height: 100%;"; if (node.connector && node.rotate != 0) { @@ -571,8 +570,8 @@ function construct_AT(elem, tree) { node_elem.addEventListener('mouseover', function(e) { if (e.target !== this) {return;} let tooltip = this.children[0]; - tooltip.style.top = this.getBoundingClientRect().bottom + window.scrollY + "px"; - tooltip.style.left = this.parentElement.parentElement.getBoundingClientRect().left + "px"; + tooltip.style.top = this.getBoundingClientRect().bottom + window.scrollY * 1.02 + "px"; + tooltip.style.left = this.parentElement.parentElement.getBoundingClientRect().left + (elem.getBoundingClientRect().width * .05 / 2) + "px"; tooltip.style.display = "block"; }); @@ -582,15 +581,50 @@ function construct_AT(elem, tree) { tooltip.style.display = "none"; }); - let node_tooltip = document.createElement('div'); - node_tooltip.addEventListener('mouseover', function() {}); - node_tooltip.style.backgroundColor = "#444444"; - node_tooltip.style.color = "#ffffff"; + + + node_elem.classList.add("atree-node"); + + let active_tooltip = document.createElement('div'); + active_tooltip.classList.add("rounded-bottom", "dark-7", "border"); + active_tooltip.style.width = elem.getBoundingClientRect().width * .95 + "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.textContent = node.title; + + 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.title.replaceAll(" ", ""); + node_tooltip.style.position = "absolute"; - node_tooltip.style.width = elem.getBoundingClientRect().width + "px"; - node_tooltip.style.display = "none"; - node_tooltip.textContent = node.title; + 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.title.replaceAll(" ", "")); + if (tooltip.style.display == "block") { + tooltip.style.display = "none"; + this.classList.add("atree-node"); + } + else { + tooltip.style.display = "block"; + this.classList.remove("atree-node"); + } + }); }; document.getElementById("atree-row-" + node.row).children[node.col].appendChild(node_elem); From 5216686040e6747c78bb775d2add578d5a0e3567 Mon Sep 17 00:00:00 2001 From: ferricles Date: Wed, 15 Jun 2022 17:07:54 -0700 Subject: [PATCH 03/33] ability trees for different classes + selection based on weapon --- builder/index.html | 8 +-- js/atree_constants.js | 110 +++++++++++++++++++++++++++++++++++++++++- js/build_utils.js | 1 + js/sq2bs.js | 8 ++- 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/builder/index.html b/builder/index.html index 919c603..3539c4b 100644 --- a/builder/index.html +++ b/builder/index.html @@ -272,7 +272,7 @@
- +
@@ -612,12 +612,12 @@
-
+
-
+
-
+
Active:
diff --git a/js/atree_constants.js b/js/atree_constants.js index 6161f9e..94dea24 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -1,3 +1,111 @@ +const atrees = +{ + "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": 5, + "col": 5 + }, + { + "title": "Text", + "desc": "desc", + "image": "../media/atree/node.png", + "connector": false, + "row": 6, + "col": 6 + }, + ], + "Warrior": [], + "Mage": [], + "Archer": [], + "Shaman": [] +} + const atree_example = [ { "title": "skill", @@ -10,7 +118,7 @@ const atree_example = [ { "image": "../media/atree/connect_angle.png", "connector": true, - "rotate": "270", + "rotate": 270, "row": 4, "col": 3, }, diff --git a/js/build_utils.js b/js/build_utils.js index 16bacb5..7bbcafd 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(tomeTypes).map(x => x.substring(0,1).toUpperCase() + x.substring(1)); //weaponTypes.push("sword"); diff --git a/js/sq2bs.js b/js/sq2bs.js index 8b97a88..092df9a 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -73,7 +73,7 @@ document.addEventListener('DOMContentLoaded', function() { }; }); - construct_AT(document.getElementById("atree-ui"), atree_example); + construct_AT(document.getElementById("atree-ui"), atrees["Assassin"]); //dagger is default atree document.getElementById("atree-dropdown").style.display = "none"; }); @@ -232,9 +232,13 @@ function update_field(field) { }; } - // set weapon img + // set weapon img and set ability tree if (category == 'weapon') { document.querySelector("#weapon-img").setAttribute('src', '../media/items/new/generic-'+type+'.png'); + construct_AT(document.getElementById("atree-ui"), atrees[wep_to_class[type.toLowerCase()]]); //dagger is default atree + document.getElementById("atree-dropdown").style.display = "none"; + + //TODO: reset chosen abilities (once ability implementation is here) } } /* tabulars | man i hate this code but too lazy to fix /shrug */ From 4f43a81313f9b77ab4293556b545979af3106547 Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 07:18:29 +0700 Subject: [PATCH 04/33] change columns to 9, adjust sizes, fix selecteds --- builder/index.html | 2 +- css/sq2bs.css | 9 +++------ js/sq2bs.js | 18 ++++++++---------- media/atree/connect-3.png | Bin 0 -> 7142 bytes 4 files changed, 12 insertions(+), 17 deletions(-) create mode 100644 media/atree/connect-3.png diff --git a/builder/index.html b/builder/index.html index 919c603..c307134 100644 --- a/builder/index.html +++ b/builder/index.html @@ -617,7 +617,7 @@
-
+
Active:
diff --git a/css/sq2bs.css b/css/sq2bs.css index 6790cb9..27fb6dd 100644 --- a/css/sq2bs.css +++ b/css/sq2bs.css @@ -475,12 +475,9 @@ a:hover { } /* atree hover */ -.atree-node { - opacity: 75%; -} - -.atree-node:hover { - opacity: 100%; +.atree-selected { + border: 5px solid blue; + border-radius: 50%; } .hide-scroll { diff --git a/js/sq2bs.js b/js/sq2bs.js index 8b97a88..cf57510 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -544,10 +544,10 @@ function construct_AT(elem, tree) { let row = document.createElement('div'); row.classList.add("row"); row.id = "atree-row-" + j; - row.style.height = elem.getBoundingClientRect().width / 5 + "px"; + row.style.height = elem.getBoundingClientRect().width / 9 + "px"; - for (let k = 0; k < 5; k++) { + for (let k = 0; k < 9; k++) { col = document.createElement('div'); col.classList.add('col', 'px-0'); row.appendChild(col); @@ -571,7 +571,7 @@ function construct_AT(elem, tree) { 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 * .05 / 2) + "px"; + tooltip.style.left = this.parentElement.parentElement.getBoundingClientRect().left + (elem.getBoundingClientRect().width * .2 / 2) + "px"; tooltip.style.display = "block"; }); @@ -581,13 +581,11 @@ function construct_AT(elem, tree) { tooltip.style.display = "none"; }); - - - node_elem.classList.add("atree-node"); + node_elem.classList.add("fake-button"); let active_tooltip = document.createElement('div'); - active_tooltip.classList.add("rounded-bottom", "dark-7", "border"); - active_tooltip.style.width = elem.getBoundingClientRect().width * .95 + "px"; + active_tooltip.classList.add("rounded-bottom", "dark-7", "border", "mb-2", "mx-auto"); + active_tooltip.style.width = elem.getBoundingClientRect().width * .80 + "px"; active_tooltip.style.display = "none"; // tooltip text formatting @@ -618,11 +616,11 @@ function construct_AT(elem, tree) { let tooltip = document.getElementById("atree-ab-" + node.title.replaceAll(" ", "")); if (tooltip.style.display == "block") { tooltip.style.display = "none"; - this.classList.add("atree-node"); + this.classList.remove("atree-selected"); } else { tooltip.style.display = "block"; - this.classList.remove("atree-node"); + this.classList.add("atree-selected"); } }); }; diff --git a/media/atree/connect-3.png b/media/atree/connect-3.png new file mode 100644 index 0000000000000000000000000000000000000000..736036614e8594d8f6ea71c1300c387407a62b4f GIT binary patch literal 7142 zcmeHMc{J2*`yXqvL?MI97?N$w3IQI;$v z(I$FQM2m>Dh-OevDV5)M)YEd__x+vIbAIpduVy)Of3M|pUDxNn?)%*LnRItIM;S>K zNeBcYOlW&PaiRf`{wE+TTSO*Got3( z^{#krfg3bEJ3mqodc17paQNJbQ;dt{f5mNk|74EW+Ok!=ZYgb0Eq}+G=D~L{9pSAb zyXoS(PdGh%wZ6J@WfszG7X{ZN@lsgvPt)(`jBKlPuDUL40ewPm^g+w9tE z^uWC$E6Vnd#n68F_M6c5%*H)@sI1uGIBtfFlJc(xSPxHO{O2g};%{ zZO@dd*JmobJo^>LaK~z@G7>|#k#!sB!?JJL-k%La+Os>q0F~3XxQjqC|!g|;7~TQ10!r>s8^KX1#RHlvS+Mv zU42uTu%N>p6NrZ@@E*Cc`qx9PDYaDXm`>J6V-C(ZoVtcxz&P zC`Wvc1t;IbF%RY;XQe5%K1Y}KVX^K_W9qZc+HPDCH&mrqYxT_={&k@(hojp*Onedw z{cMfUKkBl#x^l$eH6XzlNs=~#EZ;I?eNaYN4hN-dp4Jhw{S);tG~U-eK9^jWZhARB z=z!(k4^q(vlW8iA((%b&dD_mHx`#^HOTBqzQ;?Z^dZ{kV7+TEskM*t z`-`o5R5;=}t3qbt(>Lxr*gmE1tG(EFoVZtbTp43RbMrssTwhmNsAyJ~uKh4r_3h?7 z~ekizb$qz-O>qX?JVkk)mVI^Ns-MklP&6Fv4uvo>~arQ(w68+ZH^KOs3~C;kej9+Y@h3 z zQ`^r^drLi!$Ow6+mKqbkvt`%g(D$iu;b|1ZdS_>Y@#;-dMD@XxQ|rQdy=OJelx-g> zC6tP$zMR8p?K2~9p_FinykvU$tvX`eTWT5=B)y=m>RELa#B-jBP-htpX=>(y(fGW- zcp*_j8&2;Sq|6=6rcB*Zp~T%Hz>QNF4A4p(Lxt^)**gQhapj%0<-l+8U_~Jna`l5`#6es+VNv zmw%#nK5r!sJ5RKxrvzW>iIbPP74lp#?qdzxb=39~8+@$FH=J0K8@+V0RMTly4ORU$ zam@Q5m+b(^uNP`u>s~9j_pS0ATI1BX-deg{L*(|OF8LG(!z6a~GV!VFm#n=r7gKo4 zxB6=&AdBA)mip7(w}b%ijgD8i;rRrRCY$dZ6HOe>yHk^`o#IH42jWHmau zx#jAlBZgmJH>RnIQPMf#ziZ{HRdsb;r`i-GH1Z5xL{mNb+~Y!2yTVIvZkRt}+WhL1 zFMn?QQT6+BgEzVbwTdrFhAa%?ufGRcQxy+}LOumn%C2p#ZyFhFU1oW?lw&bZFkAryC0_4cE~75R0?U?#--hI za~gkcy{^Kh%}x%d<|g&w%I95A>Le;MouoRl@QTZW%oiR0sGtzK`>1X3P@KLj)Y8ag z@r%Thk7gLN{0I75x~01!>yAEH5pm2m9s2|txaP=kMLe%S$m+~+S07(~uE|&Y+^ z{@g&=ToYsQY>3r6gwWDjO!{GKd&P7)UP=%y|6Yy*VN7P5Y=EMbSk&_EW)+9?9Ymci zLds9jY{i;pmUb5@Nox;ysBC73XvBmYUE0z@Or%XkJ3wa?LY(x~HSjh~(2*NU(c)3V zDO~2{h-}p%v3o=Cm)GtD<=2(L>UwO8{K$j7%fg>ZNb2=@d;GDNj@h2UGUOaM?c@-6 zqC4GVkht#X>}DE^<_=w(anHuu#fRIFB7xNk$(`2A44FPnLSjD2D;Dn^i43*-SR}^Vt9jI6AMbM3iZa;y@na;>+jpm>G(U@r zN+Y%H2^=5ZLnL&kdt+szUdT&=tos8gWH_muXc|eCP){Cj(o$YrU`iNH{M@>qra6>* zjh>UI)^HnkD`!o8Q43<|<>kIJCPz)u)Ow@y!-JbnagSV&tf|m6rwfmD8g@2MBw5Wq zz-?_IKoH?}%=8h&b3g}TwJyk~o;N1`qi z*YWNrS~d7)GzCAUUtBL-Qn1}=S$(`EqNVs+GWXa=l4H-Yx6JM^NB&Oa4hNSmc~s|z zV4*bqY>lX`y_?m^B{DBGwBc|{N%DG>vqNrBs*k^^rhj4n?)~gb(_Q^|B~IYDe|t2x zj8&cWLXMB%dY=_LYHLIU#LeD0E9_7deYD17%6q~xom z7QAeay@>aA;yHDoj`H<1-zEt(D!t2>*^H&g+8z636LzJ`Fn)THRVX!$5LbQ2; z3gP5~bBgY9$M7W-qr&YoY5MQ3lwQ$4mXZkg-d^Icn|d~@8P##V`*FWnm_iNqRcq}r z=!QdNO>1cR1m*I~++!XtcAOs|`m$_tk_m_G-~4N-Jb@M=Y@MQs_U09kt-G_W?cWDQ@OXGIE(h<_VZGu?;Kq7*0X$kR^16G}8JO;-AiM4 zWXqgwb4N$D8<(&6=ywv=Xg2Zkv91JH4VLBRw%fpSbUt@&22?g{Zkjjrgtrpb*X4pS zzbfQio9ShtMPca?A1ek(sHa(GuIuiTA5WIHxHf>_vExFWD{Jd&hGE;9Ww#6; z)uauiSC}G-Ut2~N7HB5V9^`bFN-eWu21LK#!@5mK2u|7K5}IY^qQCs1AD!f5=ryV{ znszueA4v}IF=Isfbb0rmU$cvVszy{axv?Z7_2CJccGoM3B7k4oo#Qz~xcwYjcE0q< zhTQd91L9EZGmiwx&gsPYOMLpx_OYZQg-oGhWWy)4v}kmK!_9_^*|e5O;n_n8dZ(UN z_a*$X;Z7I=!4yquNXVGjr^OfAZ{F6HXP}&`@t!J~EIhT-VK`sp10$it``o!_mTqeC z(oywnkrgY1HSBL}ea(r9+0K|Rp}u`5Ld#~Bhg_9!1yA%)DtL1Db9KRy7&HR{nLz{$ zIJ5}xWDkK@SaBi5L)h#H91wWdY;^$st4_ z(FQ0ajfVWugT=Ow20^|i^lv>_Uf=}?=?SnHQA`qG9}Upi8b3miN#FbEeufvk}(QJBqK}+02X0Pz+w?ZtRVqGMv(v_ z28|+{m=S(}a;CG`1Ud;2K!M-}R1k-RrI;8K(V(M=2?k+|CZiBo3<`xXLZi?aBa)dJ z8bJR5v4KeiyOI$8V^#tvG6-dChyhFtDW(XD3Bed)Y-VbRz?zbX2rLRi#$qr;QzL@u z0u-5qb6_xO1aLa3G(s?djGzZEC3*sU@(SQjIjyU6ooQ0HT-Vm129=&FA7l6CfOUA#u>;H@{$?w-4fDWF3V!+Fc2fs@eya_@ai6cminO?p*5i||ci-rZdO;Esm+m0IBcDkk|_ z+9$K4hMwZ$WR)N=NIZxGk@(fYKlS@xqW!lZi#pQ^DUffae)P30c|%Z)5c(%&|A+Kd zyRPL;)U8vDyZ1fL`5S2=6m7zR?~;Ed`5zGfA2Rrc{r?YHbDF|6JT@=&m0`8P+kR5H TO{u6v2>5cgce6XaHi-K_$P=Ah literal 0 HcmV?d00001 From 9036de536ba25469e9b0518ef62b02e06cf480be Mon Sep 17 00:00:00 2001 From: ferricles Date: Wed, 15 Jun 2022 22:03:20 -0700 Subject: [PATCH 05/33] modified atree graphics, added full assassin ability tree --- css/sq2bs.css | 6 +- js/atree_constants.js | 1148 ++++++++++++++++++++++++++++++++- js/sq2bs.js | 2 + media/atree/connect-3.png | Bin 7142 -> 0 bytes media/atree/connect_angle.png | Bin 1066 -> 1081 bytes media/atree/connect_line.png | Bin 1184 -> 1270 bytes media/atree/connect_t.png | Bin 718 -> 694 bytes media/atree/node-blocked.png | Bin 0 -> 2416 bytes media/atree/node-selected.png | Bin 0 -> 2418 bytes media/atree/node.png | Bin 5645 -> 2806 bytes 10 files changed, 1150 insertions(+), 6 deletions(-) delete mode 100644 media/atree/connect-3.png create mode 100644 media/atree/node-blocked.png create mode 100644 media/atree/node-selected.png diff --git a/css/sq2bs.css b/css/sq2bs.css index 27fb6dd..0532fc0 100644 --- a/css/sq2bs.css +++ b/css/sq2bs.css @@ -474,11 +474,7 @@ a:hover { transform: rotate(270deg); } -/* atree hover */ -.atree-selected { - border: 5px solid blue; - border-radius: 50%; -} + .hide-scroll { -ms-overflow-style: none; /* Internet Explorer 10+ */ diff --git a/js/atree_constants.js b/js/atree_constants.js index 94dea24..8ed02d6 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -88,7 +88,7 @@ const atrees = "image": "../media/atree/connect_line.png", "connector": true, "rotate": 90, - "row": 5, + "row": 6, "col": 5 }, { @@ -99,6 +99,1152 @@ const atrees = "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 + }, ], "Warrior": [], "Mage": [], diff --git a/js/sq2bs.js b/js/sq2bs.js index 67bbef3..a1de216 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -621,10 +621,12 @@ function construct_AT(elem, tree) { 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")'; } }); }; diff --git a/media/atree/connect-3.png b/media/atree/connect-3.png deleted file mode 100644 index 736036614e8594d8f6ea71c1300c387407a62b4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7142 zcmeHMc{J2*`yXqvL?MI97?N$w3IQI;$v z(I$FQM2m>Dh-OevDV5)M)YEd__x+vIbAIpduVy)Of3M|pUDxNn?)%*LnRItIM;S>K zNeBcYOlW&PaiRf`{wE+TTSO*Got3( z^{#krfg3bEJ3mqodc17paQNJbQ;dt{f5mNk|74EW+Ok!=ZYgb0Eq}+G=D~L{9pSAb zyXoS(PdGh%wZ6J@WfszG7X{ZN@lsgvPt)(`jBKlPuDUL40ewPm^g+w9tE z^uWC$E6Vnd#n68F_M6c5%*H)@sI1uGIBtfFlJc(xSPxHO{O2g};%{ zZO@dd*JmobJo^>LaK~z@G7>|#k#!sB!?JJL-k%La+Os>q0F~3XxQjqC|!g|;7~TQ10!r>s8^KX1#RHlvS+Mv zU42uTu%N>p6NrZ@@E*Cc`qx9PDYaDXm`>J6V-C(ZoVtcxz&P zC`Wvc1t;IbF%RY;XQe5%K1Y}KVX^K_W9qZc+HPDCH&mrqYxT_={&k@(hojp*Onedw z{cMfUKkBl#x^l$eH6XzlNs=~#EZ;I?eNaYN4hN-dp4Jhw{S);tG~U-eK9^jWZhARB z=z!(k4^q(vlW8iA((%b&dD_mHx`#^HOTBqzQ;?Z^dZ{kV7+TEskM*t z`-`o5R5;=}t3qbt(>Lxr*gmE1tG(EFoVZtbTp43RbMrssTwhmNsAyJ~uKh4r_3h?7 z~ekizb$qz-O>qX?JVkk)mVI^Ns-MklP&6Fv4uvo>~arQ(w68+ZH^KOs3~C;kej9+Y@h3 z zQ`^r^drLi!$Ow6+mKqbkvt`%g(D$iu;b|1ZdS_>Y@#;-dMD@XxQ|rQdy=OJelx-g> zC6tP$zMR8p?K2~9p_FinykvU$tvX`eTWT5=B)y=m>RELa#B-jBP-htpX=>(y(fGW- zcp*_j8&2;Sq|6=6rcB*Zp~T%Hz>QNF4A4p(Lxt^)**gQhapj%0<-l+8U_~Jna`l5`#6es+VNv zmw%#nK5r!sJ5RKxrvzW>iIbPP74lp#?qdzxb=39~8+@$FH=J0K8@+V0RMTly4ORU$ zam@Q5m+b(^uNP`u>s~9j_pS0ATI1BX-deg{L*(|OF8LG(!z6a~GV!VFm#n=r7gKo4 zxB6=&AdBA)mip7(w}b%ijgD8i;rRrRCY$dZ6HOe>yHk^`o#IH42jWHmau zx#jAlBZgmJH>RnIQPMf#ziZ{HRdsb;r`i-GH1Z5xL{mNb+~Y!2yTVIvZkRt}+WhL1 zFMn?QQT6+BgEzVbwTdrFhAa%?ufGRcQxy+}LOumn%C2p#ZyFhFU1oW?lw&bZFkAryC0_4cE~75R0?U?#--hI za~gkcy{^Kh%}x%d<|g&w%I95A>Le;MouoRl@QTZW%oiR0sGtzK`>1X3P@KLj)Y8ag z@r%Thk7gLN{0I75x~01!>yAEH5pm2m9s2|txaP=kMLe%S$m+~+S07(~uE|&Y+^ z{@g&=ToYsQY>3r6gwWDjO!{GKd&P7)UP=%y|6Yy*VN7P5Y=EMbSk&_EW)+9?9Ymci zLds9jY{i;pmUb5@Nox;ysBC73XvBmYUE0z@Or%XkJ3wa?LY(x~HSjh~(2*NU(c)3V zDO~2{h-}p%v3o=Cm)GtD<=2(L>UwO8{K$j7%fg>ZNb2=@d;GDNj@h2UGUOaM?c@-6 zqC4GVkht#X>}DE^<_=w(anHuu#fRIFB7xNk$(`2A44FPnLSjD2D;Dn^i43*-SR}^Vt9jI6AMbM3iZa;y@na;>+jpm>G(U@r zN+Y%H2^=5ZLnL&kdt+szUdT&=tos8gWH_muXc|eCP){Cj(o$YrU`iNH{M@>qra6>* zjh>UI)^HnkD`!o8Q43<|<>kIJCPz)u)Ow@y!-JbnagSV&tf|m6rwfmD8g@2MBw5Wq zz-?_IKoH?}%=8h&b3g}TwJyk~o;N1`qi z*YWNrS~d7)GzCAUUtBL-Qn1}=S$(`EqNVs+GWXa=l4H-Yx6JM^NB&Oa4hNSmc~s|z zV4*bqY>lX`y_?m^B{DBGwBc|{N%DG>vqNrBs*k^^rhj4n?)~gb(_Q^|B~IYDe|t2x zj8&cWLXMB%dY=_LYHLIU#LeD0E9_7deYD17%6q~xom z7QAeay@>aA;yHDoj`H<1-zEt(D!t2>*^H&g+8z636LzJ`Fn)THRVX!$5LbQ2; z3gP5~bBgY9$M7W-qr&YoY5MQ3lwQ$4mXZkg-d^Icn|d~@8P##V`*FWnm_iNqRcq}r z=!QdNO>1cR1m*I~++!XtcAOs|`m$_tk_m_G-~4N-Jb@M=Y@MQs_U09kt-G_W?cWDQ@OXGIE(h<_VZGu?;Kq7*0X$kR^16G}8JO;-AiM4 zWXqgwb4N$D8<(&6=ywv=Xg2Zkv91JH4VLBRw%fpSbUt@&22?g{Zkjjrgtrpb*X4pS zzbfQio9ShtMPca?A1ek(sHa(GuIuiTA5WIHxHf>_vExFWD{Jd&hGE;9Ww#6; z)uauiSC}G-Ut2~N7HB5V9^`bFN-eWu21LK#!@5mK2u|7K5}IY^qQCs1AD!f5=ryV{ znszueA4v}IF=Isfbb0rmU$cvVszy{axv?Z7_2CJccGoM3B7k4oo#Qz~xcwYjcE0q< zhTQd91L9EZGmiwx&gsPYOMLpx_OYZQg-oGhWWy)4v}kmK!_9_^*|e5O;n_n8dZ(UN z_a*$X;Z7I=!4yquNXVGjr^OfAZ{F6HXP}&`@t!J~EIhT-VK`sp10$it``o!_mTqeC z(oywnkrgY1HSBL}ea(r9+0K|Rp}u`5Ld#~Bhg_9!1yA%)DtL1Db9KRy7&HR{nLz{$ zIJ5}xWDkK@SaBi5L)h#H91wWdY;^$st4_ z(FQ0ajfVWugT=Ow20^|i^lv>_Uf=}?=?SnHQA`qG9}Upi8b3miN#FbEeufvk}(QJBqK}+02X0Pz+w?ZtRVqGMv(v_ z28|+{m=S(}a;CG`1Ud;2K!M-}R1k-RrI;8K(V(M=2?k+|CZiBo3<`xXLZi?aBa)dJ z8bJR5v4KeiyOI$8V^#tvG6-dChyhFtDW(XD3Bed)Y-VbRz?zbX2rLRi#$qr;QzL@u z0u-5qb6_xO1aLa3G(s?djGzZEC3*sU@(SQjIjyU6ooQ0HT-Vm129=&FA7l6CfOUA#u>;H@{$?w-4fDWF3V!+Fc2fs@eya_@ai6cminO?p*5i||ci-rZdO;Esm+m0IBcDkk|_ z+9$K4hMwZ$WR)N=NIZxGk@(fYKlS@xqW!lZi#pQ^DUffae)P30c|%Z)5c(%&|A+Kd zyRPL;)U8vDyZ1fL`5S2=6m7zR?~;Ed`5zGfA2Rrc{r?YHbDF|6JT@=&m0`8P+kR5H TO{u6v2>5cgce6XaHi-K_$P=Ah diff --git a/media/atree/connect_angle.png b/media/atree/connect_angle.png index 3ea2c1650b9085635c3fd31d4868c18582e7df5f..46c5e81aa19b176dafaba4aa04be9b0359cc4982 100644 GIT binary patch delta 562 zcmZ3*v6ExNX2yD^0#6smkcv5PZ*1gsG8AAvX#DH%_8cyTMvn~%=}zwYQFHgS#c!0C z`*!%UVfNbP=kMP;n4Y(so#8nLLklP6sGf2oC^Dg*8lE801+m7P{reft6)-x?V5kRT z5W2B-yS>ATB9IWx(T!O%YpYo5v**ek$mY^x;1GtO$s3uICm&#D6K^PgcP5cbcWP+v QJO&`}boFyt=akR{0C4?~VE_OC delta 550 zcmdnVv5I5EX2yC3wj^(N7l!{JxM1({$qWn(oCO|{#S9F3${@^GvDCf{D9B#o>Fdh= zjE#p~P~SvC;5AT4vcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`Pn>~)iOJK& zF{I+w+iM4T8x#aw5B4wQSiRX|^g zE}peR2rGbfdS zL1SX=L|c!;4l+mMgSRS)vRijpq-4z1>FBcZ675b{xJ5Lo)L`cq?pY=(ntFXr*#{5y zA6?bly?Gtqx+aAmjE`PCS@J?j^`E}xmX41PcF4bfXZ!9RqtoI;A)B*h0!&YP98FF# z+pfhHcd=RF&kRSGq-FCw^wS<#?tAy}@$1+r>6P<;7k|;NoXlu9v7+x~o9iA&o4uJY z=X~#UUZbLU?N9FJ%3Rg6rL&Yfk~uk56rJ37Q$rFIy;i$*b&9+_Zu94GpS`Ev z%$QVzBAo?XqLUu8|8Ks3cUJ33PIFBO=3VhQzm=I-${N$|Zrk6VyStL<$NWa^wQtv( zHQe;S^g36!hJ`1GS^Rpg?>%O{@`i=#u|_KHpDv4Vu|D|Qvrm(q=N?mSc3%G4+BtR% zlCQFUvRPQLxOGq2`|jhrd*|-`v%UQ4J^RYoqP;J+FVkaSVAl0?aSW-L^Y+R@!3GBb z7RSCn#dS;!%@4b08@dqXV?!=X_$8UiCQ1oT|4 WvN7~ca0~>NXAGXMelF{r5}E+Vf})lH literal 1184 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$5xX)7d$|)7e>}peR2rGbfdS zL1SX=L|c!;4l+mMgSRS)vRijpq-4z1>FBcZ675b{xJ5Lo)L`cq?pY=(ntFXr*#{5y zA6?bly?Gtqx+aAmjE`PCS@J?j^`E}xmX41PcF4bfXZ!9RqtoI;A)B*h0!&YP98FF# z+pfhHcd=RF&kRSGq-FCw^wS<#?tAy}@$1+r>6P<;7k|;NoXlu9v7+x~o9iA&o4uJY z=X~#UUZbLU?N9FJ%3Rg6rL&Yfk~uk56rJ37Q$rFIy;i$*b&9+_Zu94GpS`Ev z%$QVzBAo?XqLUu8|8Ks3cUJ33PIFBO=3VhQzm=I-${N$|Zrk6VyStL<$NWa^wQtv( zHQe;S^g36!hJ`1GS^Rpg?>%O{@`i=#u|_KHpDv4Vu|D|Qvrm(q=N?mSc3%G4+BtR% zlCQFUvRPQLxOGq2`|jhrd*|-`v%UQ4J^RYoqP;J+FVh1?3tN)6y9>jA5L~c#`DCC7 zXMsm#F$061G6*wPEVVBK3bL1Y`ns||W8+~LwAg-nst!;{vcxr_#5q4VH#M(>!MP|k zu_QG`p**uBL&4qCHz2%`Pn>~)slwC6F{I+w+iMqj83cG797UaHoGVzinbrBn#T~O3 zWIlBj*>r<5oiDvQdMlFv!vp8DTtc&7&y92|=eK8Y0Hqxk1_4qT?mj0a*K_z@Z2X*f@bh^^>bP0l+XkK2ay&| diff --git a/media/atree/connect_t.png b/media/atree/connect_t.png index 8aa4f12c0fc15a07c8cc5e033756bc830c956e71..14d3c16b69250a233cd1de4ca7f2a0b44f98b040 100644 GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;3=B*Ko-U3d z6?5L+Fyv!0Y`KQ`W_}XlrNx5dCd*WBNtI?6u1u`@cU}owr<^ z;hZ1?hwvyOJp^{2KV!F-rT+BoUqyOIx}&S}bP0l+XkKd~%Vu diff --git a/media/atree/node-blocked.png b/media/atree/node-blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..42892b60f352bc10fd6c924985cdbaf9472d12ba GIT binary patch literal 2416 zcmZ`*dpy(YAAi2Hu`$f0QYoB%E~BhYC0cEB8AWWltU?+^Ds_s~(%6PbDRmNEu=)wd zWvE}mDV7FzSkvc0DjyfThIeaUr~*^eV*JC@xpVw0!4ABv zW&2KElCOV!=`4GOP`0Mj6MC{`r_}aB&iGVGn}IZ)=FrRYT0c98q(?sIF$AmGS;K>+ z2)V>?`fLTVjD$2z`gggCF3&(ze@WNh`0)6QmX0(%|L_*mCvgj`%7%?zS!Av1x#lAq z3v~K|fG5XUI-1#cUxZ5%j+DwEU)5f~444p5MiJF>?hq}qcyODQlK$f_Ay5byq1_iy zN@1W`f4oz2)PyT{UwT?CXfj3(tl&sW%MDF3)$%LEmFNUCI$yZo;dl|KP)i;?{BMff z-P*byk#57yiyQ0z7qY_nT33V#_pL=iz+qkIuUK(M(%SRiR3Ub&q)x8uNZv5`@ga9r2q-6GhhMLUho1PUJ>m}wVYq%Yz~DqTU&k|P&~8;Y zy~GB_YldQM`WL|-b5l;DblZiM(H%}I3eK!|*t9wbv~tY)?qb9W!=uDoJ41k3|Hlm? z2E2-9&LEk}bdvdtvNhnjJhqIpz#ZxPfM>p60M`A4pqTd;&qqRLnsD4%o0)nO?u12a zq#n4hbQ*F1=$J5&G`I;nyf@7k;BFweEcMOlMF3ehN7Q`QgkwYYI6)MqE{J%E#{=}( zs-HB?@^{}JMR3KY09gzyD=UEIS`^^H;ID5TpnhGk4;Pn?0f>O#)&6At$=Cr=EIVdq z*)b|FW{eF$!!<1ZPt<>cKG!1@U)!>R+n_+^A2}Z6{RT&d)BN9Op?RJGK46h2ZUD>k zyDm2T9T_H_@Lhnn;e9&{6Y#j!2RVmK{_0=ni&uq!0xj{Kx(6|T_Y`pIlonMaMN1qQ z>21K?{>$q8P`yC?0Bq6Wx_*99`Ny`~>M@!i=tpgeY&z;467a?xK>(Nxw=VCuna_Tw zH!x(O-5Q|>cq{BdFNp5FIzcWPLsaW?o8V8yOxF`TfuB#FRMJKhVGXg^?ui}$wZ2N)COK&yw;?tX`owHf1_-3p=DN6Nu+jqKL zZ*PGbzk-dv5jTwmKX1r?A-hhwjTi{G-lfT|Y{W({<2vPaMod_se@%prXAvI+MJ%dc z#JzoerAnl@%9K=f=&>>otTVVe1idwXkNrl-4q`E`rpxPqq`F~A_iMt?8B6rJzNvxl zDkqUl2QXv*IJy@>Nht{4@FigrUjXtZpO0{QZS!^_j!UjdX{FB=i@$>CwtUn8L9Yp- zRjKj61j4_aCP`hm3&l)dCKai!b+J|ghr{Q{)&woLpxP2?iLRIdE}uEDnKS2_F97T^ zmpQWfTvRrY*5cIJ%M!GiM2e{(m0YwLRh{s?H@Ca?RMva;!_E!?#k)=`bJSN+e&GIe z!&Ek~sxecS?PGaj*48kZ_o*&+*+FSNv5MQy+@;oHdaxnK`;z(dOk*Z`E3B4gaKIBI zsSSI^_usFxz7RR$PlGqmq;+d2;$%_1yrgHu^_3m;Sh8Oca9AOZV)$5EQz?m!Y2>0- z!((vgy@F=GzmAS`Au_u4vZ&_`weGQV`%-I4d?74;+2CZlfu}RNcYj_YgzF(uj9a*5cyxOWbZpMHqm>0!q>6$&ug4OW>0>#OFmLrF^v}_SQ>{Ajern^owRX(c84MdAV z(aI$=6Wbj_U2-i}Q}L+?9_>YANa{sa);F}9UiefuxK;({=_QDMCAicEV^Jwj2T6?? zdh-=tVVtLhmdCI&4&xo^LP`7?_m`r+i;ILKW9J##gQ4E#!UVnu3kc` literal 0 HcmV?d00001 diff --git a/media/atree/node-selected.png b/media/atree/node-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f67fef90e09f0bb730dde7b5736b9d7587c9beb0 GIT binary patch literal 2418 zcmZ`*dpy(YAAi0xY?I8Tq1>wD)<{LlPuX(6Z&}IRbP`3U4yO{b&25RIlcFNZEtjGa zJ5ifR7r$(Zt}?6T7PUf~o!QP;o!5E&{`j50p6C7fyg%>v`}6$u(0wy5p32NOgyw^DCx2 zd(O60xaD0ksPICoTQG7wab)yeh?`<1qRD4HPI0H-G_rN)HaW74jYrZ66-i@0S#5>Oyzkwa z1G;lgMK1i1hul@<#h;#CU^PXDW9BUww9%c*Sutt}Ya1O6r3=t`Ig4hK0C61+QW^YF z*X68yQi9;5!>!k9@*|IjBUV2@UNZf_&W}c$|JbKs^NJ3(pm2N-oDQeOr9)R5V_>Bu zmZ<2CQhJY^uO7#X+A?fr4jNiyH0Ds{M;DVInXkz4U^7b6abL1Uq1dDy{aZDOr#WmY;^liRELMAm8(Nvt3X#4bVz5*vG}~S-vf`@yV<0l zBK6jBSD*5sc4=#;`sV~8D@qGQiC)cGdgHt7J8dKeU#d~rkDj2+cMgo=G^-gyBu*W7 z%Kf5BvQv^^bZy01Vx#J6*`{B*w8o~&mCGjFSEXNE94Oh-ZDGpmVPFVP^e-WkH+l+c z_AGPbrQQu8a0WzbPS)eMkReVR1vU81XNmQyX0qRETeV`plxLP*o85-EYFHq$&5ZCa zugcI&%YN#DZcZ?{$1Mo4Vc-@!OY}o}Ov!(O%rb0b=I}+Q2VB>0`uc%Kh4%WSS(7ssd)|-c35~i3_Z2ZR|-)D$i zOif!6Ofz~(;uQZUWW&bO+@0F=0pp95y_k*Di#R=LYmTjGLuhQpzn=|eZ?1U3H=_^A)Jz>$vQ(O4xKR6rA8CnQK_a}isT5RVTODYKpnvWva zn8E$#5AkOFC9sEd)}GBYU#N`x+RqcQdT&N_nzn;(n%>|gG)JPb&++`$P@u=3uww_p zRTNc>q{^6129N5jL6<0@j<&!Z8yvEvzF26ieT5(z@T>ofhV&Fs*c3Byt2X_Mad)&D zxGuB%fCs4f2#_Y+uxKPa+Yexi5%eVaxo=AVvPJ5sm{de93Jtc0h*S*N`PkADpr%&7 zQgn)*uiJ;9b94Z*8kk&b048gc0RwKn8^A++49AC#WugIs@?Gt3*53?Yh-lIyo=c6N z_n^j`0Thg3>3^gCTWhigA(?u?k26#yGkzF7OnAKG|JY52LP@sRt|$cEB*OaB{~C3z zhx1OZtg^Evj8zf!dP1syEDy)+va6ce4<#)I8LuDT_-BtK`KzzAcImJ#7b@TXd0qTJ z`=2dqk@g@&20-PydE1Yb4EScU9m>>Yp!Cg!U~Tv*+kh{`W1eY9yD&)!v7r~y^z?GA z0rJol5U*6e&!byW*rLX<2P!dYfMK{AyaBP#`o0jV#0wfqj<=N8C=)|_8|0Q#ct8P* zCT3iS6woa2#))xsOCY_0zgZNaVy8?D-(j0n`Q7Sm@Ew`E2?g|TU6Im;F&S-_IwBd> zzBk+NDmu;Y64Pco2ny-@t{Oz|%bDdGoAu>|tKy+e8uUYh!9ackYap6|)A=bEB+5UJ z5|X!rLsvBAZwPaFqfpc3KndmRI+JbNQ3u-EUKCn)$~8y@?Q%mo97~->>VTSE(GBpO=Xtr53RBF zrmvpWkryuARIYDI+>xwC^FCqJpQlx>wmF+nm8}uK`xY`F0NMW{4xW?^!;^j!4l>Jw z2k7wR?n#Ny=I~whxfvx}5!*JvQ76WTG4?(trf!_0?iiYPso`Y$9{PhkoXjTNXeLi< z_)rC`dQu~``z$?lQZ~LhJm$*BjL0?WWZz6tjU5MVRjk5_7oMW+Db_x>6;YxUJy5o6 zVi!&aYBP{{-Rb-g&C(7bBjS&qVnU!hkx{8{^3m#$8S2~trk(xvV`jIOLig(SXf{d8M= zI=89Ym51(Nci)#3CSI)G6QaW3#w*vpL>ixth@5j`Rsmc>FWdLo4EqB!Kg}qb{QMEG zMrgzrzH4~sK!fYzubm!*{1vQ`$9v13PKZyDFvBI3m6hvWKG>@;(49Q*lj4;n>dfNM zel;!=-aC^x*AY<&VGB$d6D30SXrF6_{R95zi?VqbSv3q9v<5LBc Y>09jeIpAbuf8TfS@80izznOF9oZXyZ z;~gAAT)*AZEg-4%w-?le*WO037{7vYD6g`tclgOwDV2x6(le+KlS(YL-!VUKo)qqopbc;5`<;BLuyH1wYL>G5J0xIf`gg;B$fEE*e z8JEfpgadei|F*L{v(Q{KJfeF>QY15WlWSEI=1y}y-0yTiQ=jj{A4t?yJcMcHUh?28 zD~&h?BKLxosh@F0d6C=nGJCsameIq9{b$yh%)hQ%c&Fcr_x|z=k+k5Hm*XgrNGtTT zP0RO8IBhadz-|IP{{%-U_jDfIkr6Kn_ z_M0#y`JFBoZMtom!$z2=GI*|CV1of;k}1*)7aW0B5HB5HWw#r=RA`m8 zEjWr~WOD1zX%#s<@o8!cv`1U`mRyEVsjdWCfM0@b92@GTJX86&3(q*s+qvNODkmt_ zS9wkY;K4hs466?|ykWEQz_*5J`{8dBRSSth2z$)#W~}K8r;$Yuj|Nwr&9~vkg)Wx; zR*l95kNtc2@VoWcG$h#!o;91}5_%b$Gr%M?kHtV39?~E6VL#@9REEb+rz9=6O8O%P z$@sKeU;E-hVAfKO$g~*bs>Ll;pEkohMZNFzk>xHp&IH|vtSi566rz(HY8Lh^cl&=U zgO2-PfXT)6;GyE{ws0e!!c6nl;RJ+=Gf^K1Z2`J{O#cpuC;SDLY~yyZUPg}KL7FuJ zPD%OE;W#?0RxmxFGV5-<6uA=MuLAR{r57Nc*!6;vMv7fO_)kFCiIKFyt0&q3@&~#_ z5YIfUU0+@g9^eV_MZnw<#^nBF{lO3#0Q_wZf1u|l1m7KnnPW93{WmJ|m)ieg|An|V zym79&`KNeb_=l5S4d?&)br|wCX}GP%rhPU1s^RZWp%*cGS3kz!hm0`o%v*Jlqs#FD zvK(utKSOQAlLE(U^>!tH9>VsrUfokm<|j_etY+^YxOLYG@p}pYXqXRaVk%L5_=WTrL_N`!i?}L6&IIBy&ZVa@U9`Rb5|; zy36+2Y{XgNl7jMczzizX~6C&gC!0+A{_Ik%KAkBph(qRRTcK$=d79#C@&5q ztpT<%Su_g=4fnw2nu!{1VGuZfGGYs|;8s=-I5#K@G*wnq0hnmkRTZpC)?`uX2KAY= z>Md|%GID{z`?2|W-ZRdf{=RxTqeUb4jSpHIacl1WYynu?WTLtep5#q*YzpcMSDqcP z!etL7pe37mpIQia1(OlRxz!JI^;v|im|XTJ5#B^`b66+e?~s;L6<+4Y#1e=!ig!cb zRNs}?49VPnu)?*8525}ss4yyMhq;9p9Z7A^rd4;7k77r!ly~v{w6r!?;o05i1w(^g zEp3~7KeeDAtHRXJfAUS#9lW0(e(dlSOzYnw`y$Px@7W^t(@8gMtfQM^Q2)26@bFi} zdyo40F9(lhx4EM5Ab8|SKo}aO!t`ifpZA*i!fZ-DHoNuiAZ2T%Z7ddZ%`o&`w2b z?{!YD9V0qerMnSTt_PSLH$9TOJdcRrqK+5R8D}asT5^AFNTIb7j_kyj=`I}!&1F)g z(ZyFI1_OeuWq`_Gh4_c;3? z4m8fpv{m|%hPpZHdal|070^%F=x&pdS~oWkFKTFQDhwddLJ3R89~Il}Ln(!3c3#$* zP#W`bdr0Qlq`Y;^%iF9o-LYC3T&j~Sc;!H84h$y286B^ee>xWHwuK=bRpv)YA8n`l za_)(bo%DDj7&~itPxjlXAkC?EP0o-juQ#DzeOdWy6FScJrU~qoW`QL|Sro<&1;C!| MUcR0U?yU6x0PlfHm;e9( delta 5259 zcmZ`-XH-+$vp)$044@zoP>KO=kSakyP+E|p6p;=hNP=h(rMDm@Cjn`4m7>y=A|ePP zMXCfy4F0cjMG=tR!W9Lig(8HOym;69@YZ|lt+V!*DZiQ7v(N0=vx&H;URw_V0lup? z=gk4m@2|MM`~d&}@L)^#FaXf_?bHBlv~ikUMW>Ywt!rBnbdw->uBgI!BEzO@RIbzuMog&h8Gc z@=xmfpuDUI9Jvut)4eG|)cwl43SR3$K{Lk;*G!k{2ieFqn@a{&u%psp@du!-D)HZv zX-D3A^wC@NPdXNy{-JZ!{WV56p3r-mkDxw;jG4l)7#98?&n#`P?yp9pQ0L~hSIfL{*l(;6gkdt+Cr{HEm3~AXYz^LG%5#X?PC2C-tlOabW8_VaPM=Q;^by zT&6T5B~NxhO?{2yP5nCYaw0C3LU46+;~$8s7{IoE-Z4_3I%+U%XPo^$MUwX6GXbPGf!4p!ko^_m`jWlSjLpd6<*4 zn@-$#*4|%kH^sB4Tkkabk2Bx^XWzj6lY7$VCTL(_fOcaDdK?%S7*LXyl8T&&91Ae` zh7;gUp6-WQejwW@0S184q);FQ;=oddbHZc zszyShpkzng)&JZr0_<`}b}t(tOzht3;q*0)au{5`^1pls4-d+8>q7My4qyGq3GxKV zHXt9@-p!9MT2#1k>sHM5J&?7!psJ>(cWc1W3t0Bz>DH+~DL`z!i~IF+K(^ku$Lkh; zNtLt#ql)GR;16;+X}E>KSJDeVe;%`4s8RL!J05$e8}cJ}1R>CI7bq?(`_X=T{fANL z#}mzlSMlX8K$j559Ou;(G_S&%SBqy3PFrh_RX{B-GBLv4di61&cx+eMfyl+-Ro1&y zF{Exi<^}MNEZdJ3hu3v}o8x&GH(2HVzGHtW2&3aaT&v^)tO~O2aSlyN+u}sTSv$HF z9f6NjPwkJJ5XD4aMD<+_YQlnY#s{=9DV*_-C^7i%b_qNUL)@R>b19C#EFd<4s-$bg*f)OM|r1I_e66Gl1sAj9^i@!)k`r*o8ZObE%m2M->M@csN`Tatjiia+lRyh-Hn6@ThJr^*sd zR+y{i#dqhP+(dF%?@b6n+Vwfkz(^u^ZFoK1o~5{~Sc`ibpSeQiut}P58E44GF?O$a z57g+}}nJtt{XVA3ZW+EOVq2#S*S79^%y2&JMvbRs(0q5FWmUH@hW{RErym z+%OqWCnsm!Sc>rIojImYy3wYmlT&}(^R`Kxdnz47NN#7ObDb&T1%HPT$)J%r-cyW zuTnAmBE%x_UY^QcNf=ZzkaOiq{oObt@`b~l82QD01hE(OLoxwwYR)7 zZ*43oCrirnYW$S!fsz2@Le=@@Zh zri?HQ2&C?BW}AWs-QCG_Oo~@Wwav8TcKC6PC%j-&;DkPF^j1wk$kr6%r=XQ!#G&Fh z%^z>4T1HB!U(#F?#Ij7aHPI5Yz<8WMt@|^orB@ICxF5d9d`HHFb&zTyK(!?H@OKws zKnHmZ?ZDd_r1I{nv(u7Y98_(@!r;AMzkU%cLZQK1ekKWC`kC|>H8nw}LuWoTd_a&W zAb70Bj*ICn3@aq=%%vnms<#d9Q~oJ4!t(eTj24WsEJlvm2u&4#UuyMW z8U98s0MZh3M)S9Fh%hW$icx$&2xa1_PWmjGMJ zvu8+@hAqj|NYl-=Np+i@#mZr?1NHlarH!Ry+`fSD{?h>MGh?;)hI;n(i_Ti2m4 z7Bu!0M1`+hxxynXtM5ECWJclKRC8(Ey2%YCvgPokvr=|`;Dp(c|d@;w9i zCQJ?-S8|b^it4QIF*Z24UK;d->$P`h((1%MNWtwPg=CrorA)q2En_{Sv})Vh#_bC9UA*y1(T{<@`g(!{ zMKkBl#O*XB#%@I)uz$9SMX_5S4-dWaaO?lZ^$H8$YtFk;!X@8Mh9D3K5V^nI1G3$; zW11=OVyPDMkH@nvyiZ3`Q8R60W~5#zjzw175oUeSzJItKOjC7C`fz5{&7dIUuL|e^ zNp{QSkAGzOk2MET^=J0Q#Au%`OJ#m-*``BTNyK$KlP|Y7l8Kr|~QCBKozO>69=@nvDe&$IjU0{LSl3zm~X@*c5 z%t3{DE$%H>9R_2*&Nf3ucp19^XbAGAk$Io@?>;tZ{K3h3Di8XnA<0tzK1W(w8Y}dM z!+J)e_Bp1OcE-a5jX&?cfkt_KRLGL*0ZV}HMGNh60)U&hy39pa#Li%-fId0B!C0Zo*}-Ae;lp;hAgy~6 zwmHAVjqg6^)2C0nrk^PV05IAZuF%D8d^aj$v6p}zNMXRU6idTR_V@4KkF8CFL2^gn zxFA9@L_ri=ez9OwdTnBX7pOh|Q8DZE#E(`Abl6r{65i`gvfTTN^YbV8^MU-3BpT2* zfGzfMiCW>|;fn%qKHr1_!xh)Xto}T;?Jx-8PyzvkN`Yw4iB% zn(W~0uLP|ut;DF20%%8VAquPGyKXKn1@JSU+qs)@y4J#pWN9dC92;fxA*ARyK=KXs zlR2FF*Cgla_NPh!q$l!h`U!}nN)o0B>_p6tJ_PXZ6PFXEv~$Y*iR=;>4sSrx;NsSe z>=F{kH>p5;xehGl9e#!5+|-;I05OEOJykJ5jY?>Evd(?D<*J@sclCH}86_<#UPDGz zG_jpZ>Cvih+%5!wLSXVsUz&OJ3ddXn=YU|2XOcdoD8+t*X4?e2`a#7+@cIbPSe%$o6Nrn#l4iPSi1uFNU2K|IcB9TF(B^x z2kg9n+(X($MhMp{3+a8N@SA5dFcCu`87DaRdgHz=?kBc=PyD`+G#)3#bSe-LSDBmS zV7eE(J|Ik@g6$v&RUw)2cfe<0-o&Gx-M?qH>uP|>zNaKhVkahOvaQ*)W9{#?xP)b6 z*zkD2c(Ij9sa*`m;L~DW>=d>`37{uds5}yK3*W?+4Nft{)=<5B+Dr}7K;U;m%LsuCH#IN2W4nzy7e z=u>yqcr`7Kl3@*+^hvQZ(w}q;C`lv(k}`*?VA;Pm<>h4$Sz32etA?l1JG>%=bH1bj zlV`^v4y?BmLp)pgBmDm%dgfi7@{Y=~AqC{~non;9(6SuwP*E@uYXr_vKN>l3_1?ctVvol_D`Tb8xTCkiR)hb)5IClwyv zNdm!#$LcKt4o}3Pn1H6Kq8wcR2UhgC5qM2dPJQ^Gx9E`(5BQ4%D86aTkVFuVkIt8JGy0rYq*zj|4Y;JwNNrC;6(kNxBI z*{gG9C?xj2#E_(tXF$}+U^J-=qH>ny=JZZ5suE}g595IoG@LDuV`(O5TyN7*Vr%xM zRn*(@{cL;aA1+WwMmzhh2%BR~4{IuIi<%a+dQ5&ZA|uM(f*eM2fIotnU`li=0tJdW z7Mie2ys-|7a<@kpsIV&KuWsQlfi*1D%nYt`&50WqjG7bR=W~ElhpJ9c+_s3^;yzDl z_6YLKkv$)p8GiFx)=*~_JD##TOWvj#jTB1TA1;j^=Z}(!8t!IiY@DiVXk#rKAI{}> zzU~24jo(;Y?bPjqRq50h_<`<7oBqET%in2Fn6m;1ay+srZHsiCbiR8rJb$pOuO;Mn z*D8JE!}nSfi;NZqk3a9RQ}xgMJkd7mfBmz3igp2aK|`@vA%(!~yfp=>I#s`^Q}fub zA3~st-GFwKrOK_o1!0$b@sAs$RY~i5LOf;380_c91I~QC2jimRz$ri%knZkoysJto z)O`q{5lEEX%e<-yH}0_87#!XxdiUgzbtUk6B3O&2!_X+Uwh(#QZe$|K6la#^?K^R& zA9Hp`FF?znQ;W9_zYx0nx|x5N-(Ra<_Ocbiq$3T-s|jn7Ju*C`U@t$T#GGx{@Fks~ zY2za;)hfAjlf$4h5J9`f7-e68`KjNDjqSQMJVrg_&)<|c5)zQ7N^*So_6APDUeL3! zM$6JserCa=z--PAN+A_E?3UOfOj^?zS~#fYu_J`QfOQwX5alG(xHw9YE!ztxTszi% z(J##jV*W;mk2^<_`doOrtQ64#Q*>R From a1227f6e7510054b6c18ae8e88f9b64c666b401a Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 16:14:16 +0700 Subject: [PATCH 06/33] add archer tree --- js/atree_constants.js | 177 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 1 deletion(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 8ed02d6..38ca0a2 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -1,5 +1,181 @@ const atrees = { + "Archer": [ + {"title": "Arrow Bomb", "desc": "Throw a long-ranged arrow that explodes and deal high damage in a large area (self-damage for 30% of DPS) Mana cost: 50 Total damage: 180% (of DPS) - Neutral: 160% - Fire: 20% Range: 26 blocks AoE: 2.5 blocks (circular)", "image": "../media/atree/node.png", "connector": false, "row": 0, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 1, "col": 4, "rotate": 0}, + {"title": "Bow Proficiency", "desc": "Improve Main Attack damage and range w/ bow Main attack damage: +5% Main attack range: +6 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 2, "col": 5, "rotate": 90}, + {"title": "Cheaper Arrow Bomb", "desc": "Reduce Mana cost of Arrow Bomb Mana cost: -10 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 3, "col": 4, "rotate": 0}, + {"title": "Heart Shatter", "desc": "If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage Total damage: +100% (of DPS) - Neutral: 100% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 4, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 5, "col": 4, "rotate": 0}, + {"title": "Escape", "desc": "Throw yourself backward to avoid danger (hold shift to cancel) Mana cost: 25 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 3, "rotate": 90}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 5, "rotate": 90}, + {"title": "Double Shots Ability\nBoltslinger Archetype", "desc": "Double Main Attack arrows, but they deal -30% damage per arrow (harder to hit far enemies) Blocks: - Power Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 2}, + {"title": "Power Shots Ability\nSharpshooter Archetype", "desc": "Main Attack arrows have increased speed and knockback Blocks: - Double Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 6, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 2, "rotate": 0}, + {"title": "Arrow Storm", "desc": "Shoots 2 streams of 8 arrows, dealing damage to close mobs and pushing them back Mana cost: 40 Total damage: 40% (of DPS per arrow) - Neutral: 30% - Thunder: 10% Range: 16 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 2}, + {"title": "Cheaper Escape", "desc": "Reduce mana cost of Escape Mana cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 4}, + {"title": "Arrow Shield", "desc": "Create a shield around you that deal damage and knockback mobs when triggered (2 charges) Mana cost: 30 Total damage: 100% (of DPS) - Neutral: 90% - Air: 10% Duration: 60s AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 3, "rotate": 90}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 5, "rotate": 90}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 8, "col": 1, "rotate": 180}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 0, "rotate": 180}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 7, "rotate": 90}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 8, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 9, "col": 0, "rotate": 0}, + {"title": "Windy Feet Ability\nBoltslinger Archetype", "desc": "When casting Escape, give speed to yourself and nearby allies Effect: +20% Walk Speed Duration: 120s AoE: 8 blocks (circular) AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 9, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 2, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 6, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 8, "rotate": 0}, + {"title": "Air Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Air attacks Air Damage: +3-4 Air Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 0}, + {"title": "Thunder Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Thunder attacks Thunder Damage: +1-8 Thunder Damage: +10% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_c.png", "connector": true, "row": 10, "col": 4, "rotate": 0}, + {"title": "Fire Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Fire attacks Fire Damage: +3-5 Fire Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 6}, + {"title": "Earth Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Earth attacks Earth Damage: +2-4 Earth Damage: +20% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 2, "rotate": 0}, + {"title": "Water Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Water attacks Water Damage: +2-4 Water Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 6, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 8, "rotate": 0}, + {"title": "Arrow Rain", "desc": "When Arrow Shield loses its last charge, unleash 200 arrows raining down on enemies Total Damage: 200% (of DPS per arrow) - Neutral: 120% - Air: 80% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 1, "rotate": 90}, + {"title": "Nimble String", "desc": "Arrow Storm throws out +8 arrows per stream and shoot twice as fast Total Damage: -15% (of DPS per arrow) - Neutral: -15% Blocks: - Phantom Ray AP: 2 Req: Arrow Storm", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 6, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 8, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 2, "rotate": 0}, + {"title": "Phantom Ray", "desc": "Condense Arrow Storm into a single ray that damages enemies 10 times per second Mana cost: -10 Total Damage: 30% (of DPS per hit) - Neutral: 25% - Water: 5% Range: 12 blocks Blocks: - Windstorm - Nimble String - Arrow Hurricane AP: 2 Req: Arrow Storm Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 5, "rotate": 90}, + {"title": "Fire Creep\nSharpshooter Archetype", "desc": "Arrow Bomb will leak a trail of fire for 6s, damaging enemies that walk into it every 0.4s Total Damage: 50% (of DPS) - Neutral: 30% - Fire: 20% Duration: 6s AoE: 2 blocks (linear) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 7, "rotate": 90}, + {"title": "Bryophyte Roots\nTrapper Archetype", "desc": "When you hit an enemy with Arrow Storm, create an area that slows them down and deals damage every 0.4s Total Damage: 60% (of DPS) - Neutral: 40% - Earth: 20% Effect: 40% Slowness to Enemies Duration: 5s AoE: 2 blocks (circular) AP: 2 Req: Arrow Storm Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 8}, + {"title": "Triple Shot\nBoltslinger Archetype", "desc": "Triple Main Attack arrows, but they deal -20% damage per arrow AP: 1 Req: Double Shots", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 14, "col": 1, "rotate": 180}, + {"title": "Frenzy\nBoltslinger Archetype", "desc": "Every time you hit an enemy, briefly gain +6% Walk Speed (Max 200%). Decay -40% of the bonus every second AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 8, "rotate": 0}, + {"title": "Guardian Angels Ability", "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) Total Damage: 60% (of DPS per arrow) - Neutral: 40% - Air: 20% Range: 4 Blocks Duration: 60s AP: 2 Req: Arrow Shield Min Boltslinger: 0/3", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 3, "rotate": 180}, + {"title": "Focus Ability\nSharpshooter Archetype", "desc": "When hitting an aggressive mob 5+ blocks away, gain +1 Focus (Max 3). Resets if you miss once Damage Bonus: +35% (per focus) AP: 2 Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 5, "rotate": 270}, + {"title": "Basaltic Trap Ability\nTrapper Archetype", "desc": "When you hit the ground with Arrow Bomb, leave a Trap that damages enemies (Max 2 Traps) Total Damage: 200% (of DPS) - Neutral: 140% - Earth: 30% - Fire: 30% AoE: 7 Blocks (Circular) AP: 2 Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 7, "rotate": 180}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 0, "rotate": 180}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 16, "col": 2, "rotate": 90}, + {"title": "Cheaper Arrow Storm", "desc": "Reduces the Mana cost of Arrow Storm. Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 3}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 4, "rotate": 180}, + {"title": "Grappling Hook Ability\nTrapper Archetype", "desc": "When casting Escape, you throw a hook that pulls you when hitting a block. If you hit a mob, pull them towards you instead. (Escape will not throw you backward anymore) Range: 20 blocks Blocks: - Escape Artist AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 5}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 6, "rotate": 180}, + {"title": "More Shields Ability", "desc": "Give +2 charges to Arrow Shield AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 7}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 8, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 1, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 4, "rotate": 0}, + {"title": "Implosion Ability\nTrapper Archetype", "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 Total Damage: +40% (of DPS) - Neutral: +40% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 7, "rotate": 0}, + {"title": "Patient Hunter Ability\nTrapper Archetype", "desc": "Your Traps will deal +20% more damage for every second they are active (Max +80%) AP: 2 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 0, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 1}, + {"title": "More Focus Ability\nSharpshooter Archetype", "desc": "Add +2 max Focus Damage Bonus: -5% (per focus) AP: 1 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 7, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 7, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 1, "rotate": 180}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 20, "col": 3, "rotate": 90}, + {"title": "Twain's Arc Ability\nSharpshooter Archetype", "desc": "If you have 2+ Focus, holding shift will summon Twain's Arc. Charge it up to shoot a destructive long-range beam. (Damage is dealt as Main Attack Damage) Total Damage: 200% (of DPS) - Neutral: 200% Range: 64 blocks AP: 2 Min Sharpshooter: 0/4 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 5, "rotate": 180}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 6, "rotate": 270}, + {"title": "Bouncing Bomb Ability", "desc": "Arrow Bomb will bounce once when hitting a block or mob AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 7}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 8, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 0, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 4, "rotate": 0}, + {"title": "Scorched Earth Ability\nSharpshooter Archetype", "desc": "Fire Creep becomes much stronger Total Damage: +15% (of DPS) - Neutral: +10% - Fire: +5% Duration: 2s AoE: +0.4 Blocks (linear) AP: 1 Req: Fire Creep", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 5}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 6, "rotate": 0}, + {"title": "More Traps Ability\nTrapper Archetype", "desc": "Increase the maximum amount of active Traps you can have by +2 AP: 1 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 6, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 8, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 1, "rotate": 180}, + {"title": "Homing Shots Ability", "desc": "Your Main Attack arrows will follow nearby enemies and not be affected by gravity AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 3, "rotate": 90}, + {"title": "Shocking Bomb Ability\nSharpshooter Archetype", "desc": "Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder AP: 2 Min Sharpshooter: 0/5 Req: Arrow Bomb", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 5, "rotate": 180}, + {"title": "Better Arrow Shield Ability", "desc": "Arrow Shield will gain additonal AoE, knockback, and damage Total Damage: +40% (of DPS) - Neutral: +40% AoE: +1 Blocks (Circular) AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 7, "rotate": 90}, + {"title": "Mana Trap Ability\nTrapper Archetype", "desc": "Your Traps will give you 4 Mana per second when you stay close to them Mana Cost: +10 Range: 12 Blocks AP: 2 Min Trapper: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 0, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 24, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 2, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 5, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 8, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 1, "rotate": 90}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 25, "col": 4, "rotate": 180}, + {"title": "Initiator Ability\nSharpshooter Archetype", "desc": "If you do not damage an enemy for 5s for more, your next successful hit will deal +50% damage and add +1 Focus AP: 2 Req: Focus Min Sharpshooter: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 5}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 6, "rotate": 90}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 25, "col": 7, "rotate": 180}, + {"title": "Cheaper Arrow Storm Ability", "desc": "Reduce the Mana cost of Arrow Storm Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 0, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 2, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 4, "rotate": 0}, + {"title": "Call of the Hound Ability\nTrapper Archetype", "desc": "Arrow Shield summons a Hound that will attack and drag aggressive mobs towards your traps Total Damage: 40% (of DPS) - Neutral: 40% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 26, "col": 7}, + {"title": "Arrow Hurricane Ability\nBoltslinger Archetype", "desc": "Arrow Storm will shoot +2 stream of arrows Blocks: - Phantom Ray AP: 2 Min Boltslinger: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 27, "col": 1, "rotate": 180}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 3, "rotate": 90}, + {"title": "Cheaper Arrow Shield Ability", "desc": "Reduce the Mana cost of Arrow Shield Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 27, "col": 5, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 7, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 4, "rotate": 0}, + {"title": "Decimator Ability\nSharpshooter Archetype", "desc": "Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 50%) AP: 2 Req: Phantom Ray", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 5}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 6, "rotate": 90}, + {"title": "Cheaper Escape Ability", "desc": "Reduce the Mana cost of Escape Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 7}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 28, "col": 8, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 1, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 7, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 29, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 0, "rotate": 180}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 1}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 2, "rotate": 270}, + {"title": "Crepuscular Ray Ability\nSharpshooter Archetype", "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 Total Damage: 15% (of DPS per arrrow) - Neutral: 10% - Water: 5% AP: 2 Req: Arrow Storm Min Sharpshooter: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 6, "rotate": 180}, + {"title": "Grape Bomb Ability", "desc": "Arrow Bomb will throw 3 additional smaller bombs when exploding Total Damage: 40% (of DPS) - Neutral: 30% - Fire: 10% AoE: 2 Blocks (Circular) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 7}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 8, "rotate": 270}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 2, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 4, "rotate": 0}, + {"title": "Tangled Traps Ability\nTrapper Archetype", "desc": "Your Traps will be connected by a rope that deals damage to enemies every 0.2s Total Damage: 40% (of DPS) - Neutral: 20% - Air: 20% AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 6}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 7, "rotate": 0}, + {"title": "Stringer Patient Hunter Ability\nTrapper Archetype", "desc": "Add +80% Max Damage to Patient Hunter AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 8}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 2, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 4, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 7, "rotate": 0}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 1, "rotate": 180}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 2}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 3, "rotate": 90}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 4}, + {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 5, "rotate": 270}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 7, "rotate": 0}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 1}, + {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 5}, + {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, + {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, + ], "Assassin": [ { "title": "Spin Attack", @@ -1248,7 +1424,6 @@ const atrees = ], "Warrior": [], "Mage": [], - "Archer": [], "Shaman": [] } From a1179911abb2ef56268932a034c6b6d45dd3e00c Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 16:14:56 +0700 Subject: [PATCH 07/33] parse newlines to line breaks --- js/sq2bs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/sq2bs.js b/js/sq2bs.js index a1de216..4c25ad4 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -596,7 +596,7 @@ function construct_AT(elem, tree) { let active_tooltip_title = document.createElement('b'); active_tooltip_title.classList.add("scaled-font"); - active_tooltip_title.textContent = node.title; + active_tooltip_title.innerHTML = node.title.replaceAll("\n", "
"); let active_tooltip_text = document.createElement('p'); active_tooltip_text.classList.add("scaled-font-sm"); From 441300ec100ed22d6d732a9cd7411c1e589ba6fe Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 16:15:08 +0700 Subject: [PATCH 08/33] add cross --- media/atree/connect_c.png | Bin 0 -> 6254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/atree/connect_c.png diff --git a/media/atree/connect_c.png b/media/atree/connect_c.png new file mode 100644 index 0000000000000000000000000000000000000000..c274306f9ef6e69b70ab50b9f34a5f0b67d333c7 GIT binary patch literal 6254 zcmeHLX;f3!7QUej0wPfnq>6;#fMDhXk}yLUA|xPCWiH9hO^A?zBtU?o5wVIq2ZZ`m zKq<(eqD+D)h$t#5q6I4`76h#mBA|7wsP6`FTJQaMu4Vt3tR&~2^X+f%{hfWzJvSNt zY%c@7@AUuxFkpH!0ssI3Hxa-TZTKf#R>lVa?fuC?!HNJ*B1$Tg@P)AuN|7XmP>@mx z4=Q`wgG1^bT1_46wocaFux!ct$9a9OxD!6t9=9p%*N%9#F8VoY$zE&bhTmS^8)2>< zxSekBYU}*Fvkjb_UdQUwxpjUaiMFeHaprv^cDEG@Oz8S9k>UJdNyOP#p8pz1i>#k9 zU$oj^V$M5JyL?#l`oXyUS6KZp80EaDpL|EzPjpV zzADl%xHZInuKn5ud4mS~#P)F4MYk?txoFTWWJ}je>{OLQ%Y&D^Xz~v~yi;_B#YQA6 zE^j~b+9**+=Fn4m`}Dx@8vCxQZkrU^AAj=a4n5B_?=7gfNo%+Wk;<){GzRPE#1o)r z_zJFWMCg?L9@(P?$gHkk;&dC2RUPW`J#&>>qZN_un22>qDzA%MyRmOtwXRuAZhVY? zc=dJL(y^rD%AP-~AF`WyVTV%$h7n3kE~}_^SJa(LJ64*W3Vw6zN~TjPhi#z6x71nw zTU)5soRwDc{`eN7Ng2s;vY61j8eH*nk@|-L3*6uc(wTP(p!|P+L@eF)NQ6a zrfjI!6j$4z+Fk?in34VN3+nsbrx5m{EY{D6cuF`uJMj0t!P|Ux2Y3^T=Pxcrvl}%t zwlU`WoVT@~-@X-OhsZ7!N40C5*OHj{S{3&U?yp$0vV7mt_F8hi-(Q%+*8;M)hdrok z*gVz&`b8uUL!&Ai1Lsp4EDcPPa&%YZZZ6rwIlHsuqC?xs9`?hQXNZ`_8oo&&onThZ zAs1&(=~B$dAtCwaNwfWyBIfp33p}r-9JshxurQ3_QRz>#66F6vz~9%ofq!+%?E0o< z(6EstXUstIJnXLbzSmoidiCwD>WZJUGP4S!H!J8iGF9ocH+b=}>yC$?j=5sA30eHM zdBkM53se1tY;zw!@z3IImANgJt;}+{e+@pC?P7MOzC#ewS?Mmul;Z>GB`&MHDT+r| zHGl10Xjz0H;Od&?a}4|+2y%1fQ^TAm!!Y!*8Yy_t@n zqw0ami(Xk$gXU^;UZiD#{*M+eH$xL{cIF}*6#yNeJ^&7XC+$Jp*IZ)Pb*1)|V6N&A zih2i7?0$K$_z2j)?z`V+0i|A^8~PU5ZY@oGEN7kSe&2w93p+sBWIS z)-gjnJvX##Ws7IWa)$=vWlc$8+;;g!v!tC1Ow$x5$w-f*W1Fo4YFD`%iHvufc$idP z+F0mZzk1Q&t?Z}d`5~o+hghAJyEQAE=&bwVS0;n~yQ-`_ON^*epEdro3X#*#ZM-@_ zK54a_n`^A|0@Y+>gf)Iv^)|dVbWYpB+y?#FWL&M6-4Nf}`gHh{*s|kbUZ|GEA)k@o zecD=DwXTE8cKat%=xQA zYB{%Um50&3&=VFLZS^l_7U~BJJUYz(xSUZKqi3O~B^H=Jt=K-g%x6#2sIzf;V2{Sk zh78o2f+s6{v!+Y?%50GJ#w@~Oba~#XO~NU+svmvdnQ~!c(SXIAq1qCT?i;b{EkoH# zsXbG5r%>h3FDEic0c~~IfS-L3N85D309sDxR9g3*nMzKe-i>GZ0q15lw%;%!?ZOQk z6%}^}#06g5!J_!~1=$;|#rjZs=l@$~x4(lDB^WJ?X};9&(XD!uzQSu^*WP-?P|@Cj zSUW455_dNb=gmtI!XLO#YeMt(WyeQGxjZ#qzdY8WcRBAj^UNa$lM$ZzgF!F!{`R}u zRbs2Gu4v&iAQASqmE+^xETHKkY3Zys zJ}?b?=@`9UFRkBjLs52iVP=l<$AIYRx7W74rjF#dq`pA79lsb<18VqF+Pu#eau+sO zYe#mhTV);P%PpDbhbb92+B7_H`*lRRAnE37`7>);Ho_@Ox%t7*9*wRJHNppZFEZTA ztrnlYclx$A#e3{r{PjC_m$cSv?KUNLo=>`ktO||>k8TR-@XsjCXxX@bS<}|Ikb%ZC zA(#~*HGXeTMX|$}arrA}6P8$P)?}P3D@-RYVMKR(6SDUHRknWhxyOsnEyzBg>A6`e zsK8A&*1vi*rH;R9WhYC|bIm1_8*gVLG#Xrr_&090*7Z^mW0#wM>3Xtauz6_FgWB!J zP8xsLt;u}2ec=e=-}cS@*;vzUmaq1u|1?kOTqL=m@!b)Z%e(B4+@-P2Rpj=Sue7OD zO;7!t=(v z4$ev`2aJIfC@v%riXG7-4JXhjA2O=!jYFfxA&MABbTG>wqr`~imTHO# z4hAF#WkRV!C=sL7oE)wsUg3yF!{ey;@rk4?)(3jAd{PBi51f)C#SyT0oJfTG)IzTC zNPtNu1Nxs9@*wyyh6{k?l6V;ic_ct$h2^IdJn)0PG+q`vo(>PhL9vhshRR{DgwI@h zF2}2g4{9i_VaM@#^rH z3`exuKb7EjqhyzcjP{a{HIH_1L z9;RAwx~o6a5lzJ6Klb>?auj^n0A2$^F;9{x|2PyR6hVOsj#^KGErmjY^CsHSs6;zE z>POIWNG6ACQO!!gV@VUt>WQJl>A=!*)RhVoj9b9j(A{MaMoC~o3vViCj&$A?g;@xrBZzzHXEP6EUmcLdu_41v)cu>gWs z_+&}F?-%}$=^}8sGzymhPd16h!;ozu5JRPK$QT}%%i$3T1P+%-`dPR;?!&UeYOs`|I))@ z9Pr5|0NYLU!J7-bSK&TvR+DziC( zq`((}zg5>)lS}X8;|?T-Pe6(A!_3iO;5_^wq|Np5VgT>d?}Fo{*>I1p)H_5D0Qxi4 z9|W)~Z#LYiqhPW;bna>+wKa57{8C_?Mi!Id8l>!bbgfFyjeulym?gb?*9KZNdg{;N zSl-Lo=QacDL(D6b=s()kzTj2;P)|Y%RRamQsQ>HL1in_|>oI+Z=&MkwM#4#ft<77M zVGG}<9E=jB{;tyfYN;cE{_Q*Wfz-f;dxP8Rkuw1lpn~TGSQ6j<&~ob=_E`C|I^T(| rDeuSrpN0nT|De7I^UqT@|CppPdI&jIb0BaFT(1DrgUvYP7M1oNXi3{| literal 0 HcmV?d00001 From 112dd1b61931044553c110b2d2a2e5f4aa381b27 Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 16:15:25 +0700 Subject: [PATCH 09/33] add script to convert atree csv to json --- py_script/atree_csv_to_json.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 py_script/atree_csv_to_json.py diff --git a/py_script/atree_csv_to_json.py b/py_script/atree_csv_to_json.py new file mode 100644 index 0000000..4c63d06 --- /dev/null +++ b/py_script/atree_csv_to_json.py @@ -0,0 +1,24 @@ +import csv +import json +import re + +with open('atree.csv', newline='') as csvfile: + res = "" + reader = csv.DictReader(csvfile) + for row in reader: + if not row["connector"]: + row["connector"] = False + else: + row["connector"] = True + row["row"] = int(row["row"]) + row["col"] = int(row["col"]) + if row["rotate"].isdigit(): + row["rotate"] = int(row["rotate"]) + else: + row.pop("rotate") + row["desc"] = re.sub("\n", " ", row["desc"]) + + resjson = json.dumps(row) + res += str(resjson) + ",\n" + + print(res) From e2eaf489849522f83bd78555561e504885e79ecc Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 16 Jun 2022 16:53:59 +0700 Subject: [PATCH 10/33] remove empty title and desc --- js/atree_constants.js | 212 +++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 104 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 38ca0a2..2dea7bc 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -2,178 +2,182 @@ const atrees = { "Archer": [ {"title": "Arrow Bomb", "desc": "Throw a long-ranged arrow that explodes and deal high damage in a large area (self-damage for 30% of DPS) Mana cost: 50 Total damage: 180% (of DPS) - Neutral: 160% - Fire: 20% Range: 26 blocks AoE: 2.5 blocks (circular)", "image": "../media/atree/node.png", "connector": false, "row": 0, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 1, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 1, "col": 4, "rotate": 0}, {"title": "Bow Proficiency", "desc": "Improve Main Attack damage and range w/ bow Main attack damage: +5% Main attack range: +6 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 2, "col": 5, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 2, "col": 5, "rotate": 90}, {"title": "Cheaper Arrow Bomb", "desc": "Reduce Mana cost of Arrow Bomb Mana cost: -10 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 3, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 3, "col": 4, "rotate": 0}, {"title": "Heart Shatter", "desc": "If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage Total damage: +100% (of DPS) - Neutral: 100% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 4, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 5, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 5, "col": 4, "rotate": 0}, {"title": "Escape", "desc": "Throw yourself backward to avoid danger (hold shift to cancel) Mana cost: 25 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 3, "rotate": 90}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 5, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 5, "rotate": 90}, {"title": "Double Shots Ability\nBoltslinger Archetype", "desc": "Double Main Attack arrows, but they deal -30% damage per arrow (harder to hit far enemies) Blocks: - Power Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 2}, {"title": "Power Shots Ability\nSharpshooter Archetype", "desc": "Main Attack arrows have increased speed and knockback Blocks: - Double Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 6, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 2, "rotate": 0}, {"title": "Arrow Storm", "desc": "Shoots 2 streams of 8 arrows, dealing damage to close mobs and pushing them back Mana cost: 40 Total damage: 40% (of DPS per arrow) - Neutral: 30% - Thunder: 10% Range: 16 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 2}, {"title": "Cheaper Escape", "desc": "Reduce mana cost of Escape Mana cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 4}, {"title": "Arrow Shield", "desc": "Create a shield around you that deal damage and knockback mobs when triggered (2 charges) Mana cost: 30 Total damage: 100% (of DPS) - Neutral: 90% - Air: 10% Duration: 60s AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 3, "rotate": 90}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 5, "rotate": 90}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 8, "col": 1, "rotate": 180}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 0, "rotate": 180}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 7, "rotate": 90}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 8, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 9, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 5, "rotate": 90}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 8, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 0, "rotate": 180}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 7, "rotate": 90}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 8, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 0, "rotate": 0}, {"title": "Windy Feet Ability\nBoltslinger Archetype", "desc": "When casting Escape, give speed to yourself and nearby allies Effect: +20% Walk Speed Duration: 120s AoE: 8 blocks (circular) AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 9, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 2, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 6, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 8, "rotate": 0}, {"title": "Air Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Air attacks Air Damage: +3-4 Air Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 0}, {"title": "Thunder Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Thunder attacks Thunder Damage: +1-8 Thunder Damage: +10% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_c.png", "connector": true, "row": 10, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 10, "col": 3, "rotate": 90}, + + {"image": "../media/atree/connect_c.png", "connector": true, "row": 10, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 10, "col": 5, "rotate": 90}, + {"title": "Fire Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Fire attacks Fire Damage: +3-5 Fire Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 6}, {"title": "Earth Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Earth attacks Earth Damage: +2-4 Earth Damage: +20% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 2, "rotate": 0}, {"title": "Water Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Water attacks Water Damage: +2-4 Water Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 6, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 8, "rotate": 0}, {"title": "Arrow Rain", "desc": "When Arrow Shield loses its last charge, unleash 200 arrows raining down on enemies Total Damage: 200% (of DPS per arrow) - Neutral: 120% - Air: 80% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 1, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 1, "rotate": 90}, {"title": "Nimble String", "desc": "Arrow Storm throws out +8 arrows per stream and shoot twice as fast Total Damage: -15% (of DPS per arrow) - Neutral: -15% Blocks: - Phantom Ray AP: 2 Req: Arrow Storm", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 6, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 8, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 2, "rotate": 0}, {"title": "Phantom Ray", "desc": "Condense Arrow Storm into a single ray that damages enemies 10 times per second Mana cost: -10 Total Damage: 30% (of DPS per hit) - Neutral: 25% - Water: 5% Range: 12 blocks Blocks: - Windstorm - Nimble String - Arrow Hurricane AP: 2 Req: Arrow Storm Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 5, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 5, "rotate": 90}, {"title": "Fire Creep\nSharpshooter Archetype", "desc": "Arrow Bomb will leak a trail of fire for 6s, damaging enemies that walk into it every 0.4s Total Damage: 50% (of DPS) - Neutral: 30% - Fire: 20% Duration: 6s AoE: 2 blocks (linear) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 7, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 7, "rotate": 90}, {"title": "Bryophyte Roots\nTrapper Archetype", "desc": "When you hit an enemy with Arrow Storm, create an area that slows them down and deals damage every 0.4s Total Damage: 60% (of DPS) - Neutral: 40% - Earth: 20% Effect: 40% Slowness to Enemies Duration: 5s AoE: 2 blocks (circular) AP: 2 Req: Arrow Storm Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 8}, {"title": "Triple Shot\nBoltslinger Archetype", "desc": "Triple Main Attack arrows, but they deal -20% damage per arrow AP: 1 Req: Double Shots", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 14, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 14, "col": 1, "rotate": 180}, {"title": "Frenzy\nBoltslinger Archetype", "desc": "Every time you hit an enemy, briefly gain +6% Walk Speed (Max 200%). Decay -40% of the bonus every second AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 8, "rotate": 0}, {"title": "Guardian Angels Ability", "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) Total Damage: 60% (of DPS per arrow) - Neutral: 40% - Air: 20% Range: 4 Blocks Duration: 60s AP: 2 Req: Arrow Shield Min Boltslinger: 0/3", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 3, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 3, "rotate": 180}, {"title": "Focus Ability\nSharpshooter Archetype", "desc": "When hitting an aggressive mob 5+ blocks away, gain +1 Focus (Max 3). Resets if you miss once Damage Bonus: +35% (per focus) AP: 2 Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 5, "rotate": 270}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 5, "rotate": 270}, {"title": "Basaltic Trap Ability\nTrapper Archetype", "desc": "When you hit the ground with Arrow Bomb, leave a Trap that damages enemies (Max 2 Traps) Total Damage: 200% (of DPS) - Neutral: 140% - Earth: 30% - Fire: 30% AoE: 7 Blocks (Circular) AP: 2 Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 7, "rotate": 180}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 0, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 7, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 0, "rotate": 180}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 16, "col": 2, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 16, "col": 2, "rotate": 90}, {"title": "Cheaper Arrow Storm", "desc": "Reduces the Mana cost of Arrow Storm. Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 3}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 4, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 4, "rotate": 180}, {"title": "Grappling Hook Ability\nTrapper Archetype", "desc": "When casting Escape, you throw a hook that pulls you when hitting a block. If you hit a mob, pull them towards you instead. (Escape will not throw you backward anymore) Range: 20 blocks Blocks: - Escape Artist AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 5}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 6, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 6, "rotate": 180}, {"title": "More Shields Ability", "desc": "Give +2 charges to Arrow Shield AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 7}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 8, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 1, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 8, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 1, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 4, "rotate": 0}, {"title": "Implosion Ability\nTrapper Archetype", "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 Total Damage: +40% (of DPS) - Neutral: +40% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 7, "rotate": 0}, {"title": "Patient Hunter Ability\nTrapper Archetype", "desc": "Your Traps will deal +20% more damage for every second they are active (Max +80%) AP: 2 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 0, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 1}, {"title": "More Focus Ability\nSharpshooter Archetype", "desc": "Add +2 max Focus Damage Bonus: -5% (per focus) AP: 1 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 7, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 7, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 1, "rotate": 180}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 20, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 20, "col": 3, "rotate": 90}, {"title": "Twain's Arc Ability\nSharpshooter Archetype", "desc": "If you have 2+ Focus, holding shift will summon Twain's Arc. Charge it up to shoot a destructive long-range beam. (Damage is dealt as Main Attack Damage) Total Damage: 200% (of DPS) - Neutral: 200% Range: 64 blocks AP: 2 Min Sharpshooter: 0/4 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 5, "rotate": 180}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 6, "rotate": 270}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 5, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 6, "rotate": 270}, {"title": "Bouncing Bomb Ability", "desc": "Arrow Bomb will bounce once when hitting a block or mob AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 7}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 8, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 8, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 0, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 4, "rotate": 0}, {"title": "Scorched Earth Ability\nSharpshooter Archetype", "desc": "Fire Creep becomes much stronger Total Damage: +15% (of DPS) - Neutral: +10% - Fire: +5% Duration: 2s AoE: +0.4 Blocks (linear) AP: 1 Req: Fire Creep", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 5}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 6, "rotate": 0}, {"title": "More Traps Ability\nTrapper Archetype", "desc": "Increase the maximum amount of active Traps you can have by +2 AP: 1 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 6, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 6, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 8, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 1, "rotate": 180}, {"title": "Homing Shots Ability", "desc": "Your Main Attack arrows will follow nearby enemies and not be affected by gravity AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 3, "rotate": 90}, {"title": "Shocking Bomb Ability\nSharpshooter Archetype", "desc": "Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder AP: 2 Min Sharpshooter: 0/5 Req: Arrow Bomb", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 5, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 5, "rotate": 180}, {"title": "Better Arrow Shield Ability", "desc": "Arrow Shield will gain additonal AoE, knockback, and damage Total Damage: +40% (of DPS) - Neutral: +40% AoE: +1 Blocks (Circular) AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 7, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 7, "rotate": 90}, {"title": "Mana Trap Ability\nTrapper Archetype", "desc": "Your Traps will give you 4 Mana per second when you stay close to them Mana Cost: +10 Range: 12 Blocks AP: 2 Min Trapper: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 0, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 24, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 2, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 5, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 8, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 5, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 8, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 1, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 1, "rotate": 90}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 25, "col": 4, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 25, "col": 4, "rotate": 180}, {"title": "Initiator Ability\nSharpshooter Archetype", "desc": "If you do not damage an enemy for 5s for more, your next successful hit will deal +50% damage and add +1 Focus AP: 2 Req: Focus Min Sharpshooter: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 5}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 6, "rotate": 90}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 25, "col": 7, "rotate": 180}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 6, "rotate": 90}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 25, "col": 7, "rotate": 180}, {"title": "Cheaper Arrow Storm Ability", "desc": "Reduce the Mana cost of Arrow Storm Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 0, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 2, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 0, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 4, "rotate": 0}, {"title": "Call of the Hound Ability\nTrapper Archetype", "desc": "Arrow Shield summons a Hound that will attack and drag aggressive mobs towards your traps Total Damage: 40% (of DPS) - Neutral: 40% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 26, "col": 7}, {"title": "Arrow Hurricane Ability\nBoltslinger Archetype", "desc": "Arrow Storm will shoot +2 stream of arrows Blocks: - Phantom Ray AP: 2 Min Boltslinger: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_t.png", "connector": true, "row": 27, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_t.png", "connector": true, "row": 27, "col": 1, "rotate": 180}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 3, "rotate": 90}, {"title": "Cheaper Arrow Shield Ability", "desc": "Reduce the Mana cost of Arrow Shield Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 27, "col": 5, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 27, "col": 5, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 7, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 4, "rotate": 0}, {"title": "Decimator Ability\nSharpshooter Archetype", "desc": "Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 50%) AP: 2 Req: Phantom Ray", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 5}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 6, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 6, "rotate": 90}, {"title": "Cheaper Escape Ability", "desc": "Reduce the Mana cost of Escape Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 7}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 28, "col": 8, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 1, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 28, "col": 8, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 1, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 7, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 29, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 0, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 0, "rotate": 180}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 1}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 2, "rotate": 270}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 2, "rotate": 270}, {"title": "Crepuscular Ray Ability\nSharpshooter Archetype", "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 Total Damage: 15% (of DPS per arrrow) - Neutral: 10% - Water: 5% AP: 2 Req: Arrow Storm Min Sharpshooter: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 6, "rotate": 180}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 6, "rotate": 180}, {"title": "Grape Bomb Ability", "desc": "Arrow Bomb will throw 3 additional smaller bombs when exploding Total Damage: 40% (of DPS) - Neutral: 30% - Fire: 10% AoE: 2 Blocks (Circular) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 7}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 8, "rotate": 270}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 8, "rotate": 270}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 2, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 4, "rotate": 0}, {"title": "Tangled Traps Ability\nTrapper Archetype", "desc": "Your Traps will be connected by a rope that deals damage to enemies every 0.2s Total Damage: 40% (of DPS) - Neutral: 20% - Air: 20% AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 6}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 7, "rotate": 0}, {"title": "Stringer Patient Hunter Ability\nTrapper Archetype", "desc": "Add +80% Max Damage to Patient Hunter AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 8}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 2, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 4, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 7, "rotate": 0}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 1, "rotate": 180}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 2, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 4, "rotate": 0}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 1, "rotate": 180}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 2}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 3, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 3, "rotate": 90}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 4}, - {"title": "", "desc": "", "image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 5, "rotate": 270}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 7, "rotate": 0}, + {"image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 5, "rotate": 270}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 7, "rotate": 0}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 1}, {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 5}, - {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, + {"image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, ], "Assassin": [ From 1c3ef6d545369bd4b26a8f5fc2337aaaffab811a Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 16 Jun 2022 04:38:09 -0700 Subject: [PATCH 11/33] Add warrior abilities (71) --- js/atree_constants.js | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/js/atree_constants.js b/js/atree_constants.js index 38ca0a2..dda9834 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -176,6 +176,78 @@ const atrees = {"title": "", "desc": "", "image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, ], + "Warrior": [ + {"row": 0, "col": 4, "name": "Bash", "desc": "Violently bash the ground, dealing high damage in a large area"}, + {"row": 2, "col": 2, "name": "Cheaper Bash", "desc": "Reduce the Mana cost of Bash"}, + {"row": 2, "col": 4, "name": "Spear Proficiency 1", "desc": "Improve your Main Attack's damage and range w/ spear"}, + {"row": 4, "col": 4, "name": "Double Bash", "desc": "Bash will hit a second time at a farther range"}, + {"row": 6, "col": 2, "name": "Heavy Impact", "desc": "After using Charge, violently crash down into the ground and deal damage. (Does not work if Flying Kick is unlocked)"}, + {"row": 6, "col": 4, "name": "Charge", "desc": "Charge forward at high speed (hold shift to cancel)"}, + {"row": 6, "col": 6, "name": "Tougher Skin", "desc": "Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)"}, + {"row": 7, "col": 0, "name": "Vehement", "desc": "For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%). Damage Bonus: +5 (Raw)"}, + {"row": 8, "col": 2, "name": "Uppercut", "desc": "Rocket enemies in the air and deal massive damage"}, + {"row": 8, "col": 4, "name": "Cheaper Charge", "desc": "Reduce the Mana cost of Charge"}, + {"row": 8, "col": 6, "name": "War Scream", "desc": "Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies"}, + {"row": 10, "col": 0, "name": "Earth Mastery", "desc": "Increases base damage from all Earth attacks"}, + {"row": 10, "col": 2, "name": "Thunder Mastery", "desc": "Increases base damage from all Thunder attacks"}, + {"row": 10, "col": 6, "name": "Air Mastery", "desc": "Increases base damage from all Air attacks"}, + {"row": 10, "col": 8, "name": "Fire Mastery", "desc": "Increases base damage from all Fire attacks"}, + {"row": 11, "col": 4, "name": "Water Mastery", "desc": "Increases base damage from all Water attacks"}, + {"row": 12, "col": 0, "name": "Quadruple Bash", "desc": "Bash will hit 4 times at an even larger range"}, + {"row": 12, "col": 2, "name": "Fireworks", "desc": "Mobs hit by Uppercut will explode mid-air and receive additional damage"}, + {"row": 12, "col": 6, "name": "Flyby Jab", "desc": "Damage enemies in your way when using Charge"}, + {"row": 12, "col": 8, "name": "Flaming Uppercut", "desc": "Uppercut will light mobs on fire, dealing damage every 0.6 seconds"}, + {"row": 13, "col": 4, "name": "Half-Moon Swipe", "desc": "Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water"}, + {"row": 13, "col": 7, "name": "Iron Lungs", "desc": "War scream deals more damage"}, + {"row": 15, "col": 2, "name": "Generalist", "desc": "After casting 3 different spells in a row, your next spell will cost 5 mana"}, + {"row": 15, "col": 4, "name": "Counter", "desc": "When dodging a nearby enemy attack, get 30% chance to instantly attack back"}, + {"row": 15, "col": 7, "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)"}, + {"row": 16, "col": 1, "name": "Bak'al's Grasp", "desc": "After casting war Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)."}, + {"row": 17, "col": 0, "name": "Spear Proficiency 2", "desc": "Improve your Main Attack's damage and range w/ spear"}, + {"row": 17, "col": 3, "name": "Cheaper Uppercut", "desc": "Reduce the Mana Cost of Uppercut"}, + {"row": 17, "col": 5, "name": "Aerodynamics", "desc": "During Charge, you can steer and change direction"}, + {"row": 17, "col": 7, "name": "Provoke", "desc": "Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream."}, + {"row": 18, "col": 2, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 18, "col": 6, "name": "Air Shout", "desc": "War Scream will fire a projectile that can go through walls and deal damage multiple times."}, + {"row": 20, "col": 0, "name": "Enraged Blow", "desc": "While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)"}, + {"row": 20, "col": 3, "name": "Flying Kick", "desc": "While using Charge, mobs hit will halt your momentum and get knocked back"}, + {"row": 20, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 20, "col": 8, "name": "Manachism", "desc": "If you receive a hit that's less than 5% of your max HP, gain 10 mana (1s Cooldown)"}, + {"row": 22, "col": 0, "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"}, + {"row": 22, "col": 2, "name": "Ragnarokkr", "desc": "War Scream becomes deafening, increasing its range and giving damage bonus to players"}, + {"row": 22, "col": 4, "name": "Ambidextrous", "desc": "Increase your change to attack with Counter by 30%"}, + {"row": 22, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 22, "col": 8, "name": "Stronger Bash", "desc": "Increase the damage of Bash"}, + {"row": 23, "col": 1, "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"}, + {"row": 23, "col": 5, "name": "Collide", "desc": "Mobs thrown into walls from Flying Kick will explode and receive additonal damage"}, + {"row": 23, "col": 7, "name": "Rejuvenating Skin", "desc": "Regain back 30% of the damage you take as healing over 30s"}, + {"row": 24, "col": 2, "name": "Comet", "desc": "After being hit by Fireworks, enemies will crash into the ground and receive more damage"}, + {"row": 26, "col": 0, "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"}, + {"row": 26, "col": 2, "name": "Radiant Devotee", "desc": "For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)"}, + {"row": 26, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 26, "col": 7, "name": "Mythril Skin", "desc": "Gain +5% Base Resistance and become immune to knockback"}, + {"row": 27, "col": 1, "name": "Armour Breaker", "desc": "While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage"}, + {"row": 27, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 27, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 27, "col": 8, "name": "Sparking Hope", "desc": "Everytime you heal 5% of your max health, deal damage to all nearby enemies"}, + {"row": 28, "col": 0, "name": "Massive Bash", "desc": "While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)"}, + {"row": 28, "col": 2, "name": "Tempest", "desc": "War Scream will ripple the ground and deal damage 3 times in a large area"}, + {"row": 28, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 31, "col": 0, "name": "Cheaper War Scream", "desc": "Reduce the Mana cost of War Scream"}, + {"row": 31, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 1, "name": "Blood KO", "desc": "Gonna have to rewrite this one chief"}, + {"row": 32, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 1, "name": "Blood Pact", "desc": "If you do not have enough mana to cast a spell, spend health instead (1% health per mana)"}, + {"row": 34, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 8, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 35, "col": 0, "name": "TEXT", "desc": "IDFK MMMM"} + ] "Assassin": [ { "title": "Spin Attack", From 0417a68e6591f014137b3fe6eea2245244c4c53c Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 16 Jun 2022 04:39:20 -0700 Subject: [PATCH 12/33] Remove duplicate warrior tag --- js/atree_constants.js | 145 +++++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 73 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 195a192..5b90a40 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -180,78 +180,6 @@ const atrees = {"image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, ], - "Warrior": [ - {"row": 0, "col": 4, "name": "Bash", "desc": "Violently bash the ground, dealing high damage in a large area"}, - {"row": 2, "col": 2, "name": "Cheaper Bash", "desc": "Reduce the Mana cost of Bash"}, - {"row": 2, "col": 4, "name": "Spear Proficiency 1", "desc": "Improve your Main Attack's damage and range w/ spear"}, - {"row": 4, "col": 4, "name": "Double Bash", "desc": "Bash will hit a second time at a farther range"}, - {"row": 6, "col": 2, "name": "Heavy Impact", "desc": "After using Charge, violently crash down into the ground and deal damage. (Does not work if Flying Kick is unlocked)"}, - {"row": 6, "col": 4, "name": "Charge", "desc": "Charge forward at high speed (hold shift to cancel)"}, - {"row": 6, "col": 6, "name": "Tougher Skin", "desc": "Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)"}, - {"row": 7, "col": 0, "name": "Vehement", "desc": "For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%). Damage Bonus: +5 (Raw)"}, - {"row": 8, "col": 2, "name": "Uppercut", "desc": "Rocket enemies in the air and deal massive damage"}, - {"row": 8, "col": 4, "name": "Cheaper Charge", "desc": "Reduce the Mana cost of Charge"}, - {"row": 8, "col": 6, "name": "War Scream", "desc": "Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies"}, - {"row": 10, "col": 0, "name": "Earth Mastery", "desc": "Increases base damage from all Earth attacks"}, - {"row": 10, "col": 2, "name": "Thunder Mastery", "desc": "Increases base damage from all Thunder attacks"}, - {"row": 10, "col": 6, "name": "Air Mastery", "desc": "Increases base damage from all Air attacks"}, - {"row": 10, "col": 8, "name": "Fire Mastery", "desc": "Increases base damage from all Fire attacks"}, - {"row": 11, "col": 4, "name": "Water Mastery", "desc": "Increases base damage from all Water attacks"}, - {"row": 12, "col": 0, "name": "Quadruple Bash", "desc": "Bash will hit 4 times at an even larger range"}, - {"row": 12, "col": 2, "name": "Fireworks", "desc": "Mobs hit by Uppercut will explode mid-air and receive additional damage"}, - {"row": 12, "col": 6, "name": "Flyby Jab", "desc": "Damage enemies in your way when using Charge"}, - {"row": 12, "col": 8, "name": "Flaming Uppercut", "desc": "Uppercut will light mobs on fire, dealing damage every 0.6 seconds"}, - {"row": 13, "col": 4, "name": "Half-Moon Swipe", "desc": "Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water"}, - {"row": 13, "col": 7, "name": "Iron Lungs", "desc": "War scream deals more damage"}, - {"row": 15, "col": 2, "name": "Generalist", "desc": "After casting 3 different spells in a row, your next spell will cost 5 mana"}, - {"row": 15, "col": 4, "name": "Counter", "desc": "When dodging a nearby enemy attack, get 30% chance to instantly attack back"}, - {"row": 15, "col": 7, "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)"}, - {"row": 16, "col": 1, "name": "Bak'al's Grasp", "desc": "After casting war Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)."}, - {"row": 17, "col": 0, "name": "Spear Proficiency 2", "desc": "Improve your Main Attack's damage and range w/ spear"}, - {"row": 17, "col": 3, "name": "Cheaper Uppercut", "desc": "Reduce the Mana Cost of Uppercut"}, - {"row": 17, "col": 5, "name": "Aerodynamics", "desc": "During Charge, you can steer and change direction"}, - {"row": 17, "col": 7, "name": "Provoke", "desc": "Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream."}, - {"row": 18, "col": 2, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 18, "col": 6, "name": "Air Shout", "desc": "War Scream will fire a projectile that can go through walls and deal damage multiple times."}, - {"row": 20, "col": 0, "name": "Enraged Blow", "desc": "While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)"}, - {"row": 20, "col": 3, "name": "Flying Kick", "desc": "While using Charge, mobs hit will halt your momentum and get knocked back"}, - {"row": 20, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 20, "col": 8, "name": "Manachism", "desc": "If you receive a hit that's less than 5% of your max HP, gain 10 mana (1s Cooldown)"}, - {"row": 22, "col": 0, "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"}, - {"row": 22, "col": 2, "name": "Ragnarokkr", "desc": "War Scream becomes deafening, increasing its range and giving damage bonus to players"}, - {"row": 22, "col": 4, "name": "Ambidextrous", "desc": "Increase your change to attack with Counter by 30%"}, - {"row": 22, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 22, "col": 8, "name": "Stronger Bash", "desc": "Increase the damage of Bash"}, - {"row": 23, "col": 1, "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"}, - {"row": 23, "col": 5, "name": "Collide", "desc": "Mobs thrown into walls from Flying Kick will explode and receive additonal damage"}, - {"row": 23, "col": 7, "name": "Rejuvenating Skin", "desc": "Regain back 30% of the damage you take as healing over 30s"}, - {"row": 24, "col": 2, "name": "Comet", "desc": "After being hit by Fireworks, enemies will crash into the ground and receive more damage"}, - {"row": 26, "col": 0, "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"}, - {"row": 26, "col": 2, "name": "Radiant Devotee", "desc": "For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)"}, - {"row": 26, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 26, "col": 7, "name": "Mythril Skin", "desc": "Gain +5% Base Resistance and become immune to knockback"}, - {"row": 27, "col": 1, "name": "Armour Breaker", "desc": "While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage"}, - {"row": 27, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 27, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 27, "col": 8, "name": "Sparking Hope", "desc": "Everytime you heal 5% of your max health, deal damage to all nearby enemies"}, - {"row": 28, "col": 0, "name": "Massive Bash", "desc": "While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)"}, - {"row": 28, "col": 2, "name": "Tempest", "desc": "War Scream will ripple the ground and deal damage 3 times in a large area"}, - {"row": 28, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 31, "col": 0, "name": "Cheaper War Scream", "desc": "Reduce the Mana cost of War Scream"}, - {"row": 31, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 1, "name": "Blood KO", "desc": "Gonna have to rewrite this one chief"}, - {"row": 32, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 1, "name": "Blood Pact", "desc": "If you do not have enough mana to cast a spell, spend health instead (1% health per mana)"}, - {"row": 34, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 8, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 35, "col": 0, "name": "TEXT", "desc": "IDFK MMMM"} - ] "Assassin": [ { "title": "Spin Attack", @@ -1498,7 +1426,78 @@ const atrees = "col": 8 }, ], - "Warrior": [], + "Warrior": [ + {"row": 0, "col": 4, "name": "Bash", "desc": "Violently bash the ground, dealing high damage in a large area"}, + {"row": 2, "col": 2, "name": "Cheaper Bash", "desc": "Reduce the Mana cost of Bash"}, + {"row": 2, "col": 4, "name": "Spear Proficiency 1", "desc": "Improve your Main Attack's damage and range w/ spear"}, + {"row": 4, "col": 4, "name": "Double Bash", "desc": "Bash will hit a second time at a farther range"}, + {"row": 6, "col": 2, "name": "Heavy Impact", "desc": "After using Charge, violently crash down into the ground and deal damage. (Does not work if Flying Kick is unlocked)"}, + {"row": 6, "col": 4, "name": "Charge", "desc": "Charge forward at high speed (hold shift to cancel)"}, + {"row": 6, "col": 6, "name": "Tougher Skin", "desc": "Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)"}, + {"row": 7, "col": 0, "name": "Vehement", "desc": "For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%). Damage Bonus: +5 (Raw)"}, + {"row": 8, "col": 2, "name": "Uppercut", "desc": "Rocket enemies in the air and deal massive damage"}, + {"row": 8, "col": 4, "name": "Cheaper Charge", "desc": "Reduce the Mana cost of Charge"}, + {"row": 8, "col": 6, "name": "War Scream", "desc": "Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies"}, + {"row": 10, "col": 0, "name": "Earth Mastery", "desc": "Increases base damage from all Earth attacks"}, + {"row": 10, "col": 2, "name": "Thunder Mastery", "desc": "Increases base damage from all Thunder attacks"}, + {"row": 10, "col": 6, "name": "Air Mastery", "desc": "Increases base damage from all Air attacks"}, + {"row": 10, "col": 8, "name": "Fire Mastery", "desc": "Increases base damage from all Fire attacks"}, + {"row": 11, "col": 4, "name": "Water Mastery", "desc": "Increases base damage from all Water attacks"}, + {"row": 12, "col": 0, "name": "Quadruple Bash", "desc": "Bash will hit 4 times at an even larger range"}, + {"row": 12, "col": 2, "name": "Fireworks", "desc": "Mobs hit by Uppercut will explode mid-air and receive additional damage"}, + {"row": 12, "col": 6, "name": "Flyby Jab", "desc": "Damage enemies in your way when using Charge"}, + {"row": 12, "col": 8, "name": "Flaming Uppercut", "desc": "Uppercut will light mobs on fire, dealing damage every 0.6 seconds"}, + {"row": 13, "col": 4, "name": "Half-Moon Swipe", "desc": "Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water"}, + {"row": 13, "col": 7, "name": "Iron Lungs", "desc": "War scream deals more damage"}, + {"row": 15, "col": 2, "name": "Generalist", "desc": "After casting 3 different spells in a row, your next spell will cost 5 mana"}, + {"row": 15, "col": 4, "name": "Counter", "desc": "When dodging a nearby enemy attack, get 30% chance to instantly attack back"}, + {"row": 15, "col": 7, "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)"}, + {"row": 16, "col": 1, "name": "Bak'al's Grasp", "desc": "After casting war Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)."}, + {"row": 17, "col": 0, "name": "Spear Proficiency 2", "desc": "Improve your Main Attack's damage and range w/ spear"}, + {"row": 17, "col": 3, "name": "Cheaper Uppercut", "desc": "Reduce the Mana Cost of Uppercut"}, + {"row": 17, "col": 5, "name": "Aerodynamics", "desc": "During Charge, you can steer and change direction"}, + {"row": 17, "col": 7, "name": "Provoke", "desc": "Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream."}, + {"row": 18, "col": 2, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 18, "col": 6, "name": "Air Shout", "desc": "War Scream will fire a projectile that can go through walls and deal damage multiple times."}, + {"row": 20, "col": 0, "name": "Enraged Blow", "desc": "While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)"}, + {"row": 20, "col": 3, "name": "Flying Kick", "desc": "While using Charge, mobs hit will halt your momentum and get knocked back"}, + {"row": 20, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 20, "col": 8, "name": "Manachism", "desc": "If you receive a hit that's less than 5% of your max HP, gain 10 mana (1s Cooldown)"}, + {"row": 22, "col": 0, "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"}, + {"row": 22, "col": 2, "name": "Ragnarokkr", "desc": "War Scream becomes deafening, increasing its range and giving damage bonus to players"}, + {"row": 22, "col": 4, "name": "Ambidextrous", "desc": "Increase your change to attack with Counter by 30%"}, + {"row": 22, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 22, "col": 8, "name": "Stronger Bash", "desc": "Increase the damage of Bash"}, + {"row": 23, "col": 1, "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"}, + {"row": 23, "col": 5, "name": "Collide", "desc": "Mobs thrown into walls from Flying Kick will explode and receive additonal damage"}, + {"row": 23, "col": 7, "name": "Rejuvenating Skin", "desc": "Regain back 30% of the damage you take as healing over 30s"}, + {"row": 24, "col": 2, "name": "Comet", "desc": "After being hit by Fireworks, enemies will crash into the ground and receive more damage"}, + {"row": 26, "col": 0, "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"}, + {"row": 26, "col": 2, "name": "Radiant Devotee", "desc": "For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)"}, + {"row": 26, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 26, "col": 7, "name": "Mythril Skin", "desc": "Gain +5% Base Resistance and become immune to knockback"}, + {"row": 27, "col": 1, "name": "Armour Breaker", "desc": "While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage"}, + {"row": 27, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 27, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 27, "col": 8, "name": "Sparking Hope", "desc": "Everytime you heal 5% of your max health, deal damage to all nearby enemies"}, + {"row": 28, "col": 0, "name": "Massive Bash", "desc": "While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)"}, + {"row": 28, "col": 2, "name": "Tempest", "desc": "War Scream will ripple the ground and deal damage 3 times in a large area"}, + {"row": 28, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 29, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 31, "col": 0, "name": "Cheaper War Scream", "desc": "Reduce the Mana cost of War Scream"}, + {"row": 31, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 1, "name": "Blood KO", "desc": "Gonna have to rewrite this one chief"}, + {"row": 32, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 32, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 1, "name": "Blood Pact", "desc": "If you do not have enough mana to cast a spell, spend health instead (1% health per mana)"}, + {"row": 34, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 34, "col": 8, "name": "TEXT", "desc": "IDFK MMMM"}, + {"row": 35, "col": 0, "name": "TEXT", "desc": "IDFK MMMM"} + ], "Mage": [], "Shaman": [] } From ec13bdea1ed50e1974cd305268eba135f37a0e85 Mon Sep 17 00:00:00 2001 From: ferricles Date: Fri, 17 Jun 2022 20:46:52 -0700 Subject: [PATCH 13/33] small bug fixes for atree swapping - some unwanted behavior still exists --- js/atree_constants.js | 1411 +++++------------------------------------ js/sq2bs.js | 13 +- 2 files changed, 176 insertions(+), 1248 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 5b90a40..31c22eb 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -181,1250 +181,173 @@ const atrees = {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, ], "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 - }, + {"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}, ], "Warrior": [ {"row": 0, "col": 4, "name": "Bash", "desc": "Violently bash the ground, dealing high damage in a large area"}, diff --git a/js/sq2bs.js b/js/sq2bs.js index 4c25ad4..3d8161e 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -73,11 +73,9 @@ document.addEventListener('DOMContentLoaded', function() { }; }); - construct_AT(document.getElementById("atree-ui"), atrees["Assassin"]); //dagger is default atree document.getElementById("atree-dropdown").style.display = "none"; }); -// phanta scheduler let calcBuildTask = null; let updateStatTask = null; let doSearchTask = null; @@ -235,8 +233,13 @@ function update_field(field) { // set weapon img and set ability tree if (category == 'weapon') { document.querySelector("#weapon-img").setAttribute('src', '../media/items/new/generic-'+type+'.png'); - construct_AT(document.getElementById("atree-ui"), atrees[wep_to_class[type.toLowerCase()]]); //dagger is default atree - document.getElementById("atree-dropdown").style.display = "none"; + //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'); + } //TODO: reset chosen abilities (once ability implementation is here) } @@ -538,6 +541,8 @@ function init_autocomplete() { // atree parsing function construct_AT(elem, tree) { + console.log("constructing ability tree UI"); + elem.innerHTML = ""; //reset the atree in the DOM for (let i = 0; i < tree.length; i++) { let node = tree[i]; From 6277b50d12343252c7e55f29c8daeaeeb71af182 Mon Sep 17 00:00:00 2001 From: ferricles Date: Sat, 18 Jun 2022 21:00:32 -0700 Subject: [PATCH 14/33] fixed atree display bugs | functional atree toggle on/off + switching based on inferred class type --- builder/index.html | 3 +-- js/sq2bs.js | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/builder/index.html b/builder/index.html index 443bd8b..398110c 100644 --- a/builder/index.html +++ b/builder/index.html @@ -617,8 +617,7 @@
-
- Active: +
diff --git a/js/sq2bs.js b/js/sq2bs.js index 3d8161e..41612bd 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -233,6 +233,13 @@ function update_field(field) { // set weapon img and set ability tree if (category == 'weapon') { document.querySelector("#weapon-img").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)]); @@ -542,7 +549,15 @@ function init_autocomplete() { // atree parsing 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 + + // 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); + for (let i = 0; i < tree.length; i++) { let node = tree[i]; @@ -553,12 +568,16 @@ function construct_AT(elem, tree) { let row = document.createElement('div'); row.classList.add("row"); row.id = "atree-row-" + j; - row.style.height = elem.getBoundingClientRect().width / 9 + "px"; + //was causing atree rows to be 0 height + console.log(elem.scrollWidth / 9); + 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); }; elem.appendChild(row); @@ -594,7 +613,8 @@ function construct_AT(elem, tree) { let active_tooltip = document.createElement('div'); active_tooltip.classList.add("rounded-bottom", "dark-7", "border", "mb-2", "mx-auto"); - active_tooltip.style.width = elem.getBoundingClientRect().width * .80 + "px"; + //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 From 554de7ea87da38470ec45352ee3438f9c9b0d35a Mon Sep 17 00:00:00 2001 From: ferricles Date: Sat, 18 Jun 2022 21:40:43 -0700 Subject: [PATCH 15/33] fixed asymmetric connector line images --- media/atree/connect_angle.png | Bin 1081 -> 1079 bytes media/atree/connect_c.png | Bin 6254 -> 1316 bytes media/atree/connect_line.png | Bin 1270 -> 1270 bytes media/atree/connect_t.png | Bin 694 -> 692 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/media/atree/connect_angle.png b/media/atree/connect_angle.png index 46c5e81aa19b176dafaba4aa04be9b0359cc4982..b1b03fd5193027c1a6854b70ffbf65cbde6be8c4 100644 GIT binary patch delta 115 zcmV-(0F3{+2)78Zv;jG8Nkl3cX`LRxdy}sNa~J@Cm+pA4 V3M)Je{Jj7G002ovPDHLkV1iVPFeLy0 delta 111 zcmV-#0FeK;2)PKbv;jGANkl}peR2rGbfdS zL1SX=L|c!;0V1vb!CRF?S*<%PQda0i35XU>(Gol8l&QVtRl=uB_8FHZEZJefwT_j& zUTig=-nm^?JGh!2@OLbpJb6*~l#2ME48h0Er+-_#pL@9WJEPOyGa;LknF35tdmLMo zq_$g&E$(7#omPTR(lR-J-DMAV?tAy}@$cA{^ve6ci@$1FPG+>5Skd>g&2^8X&F0LP zbG~;vuhGyv^8CnSHdBv3CrWQVH9yDN&N@%h=+eo`M*wAJtE& zPF~I8*2fyMz^UlZgZdBE+tTW?F8Ok~HJ%f{{ZE3CX}81TwA=TOZ@X*3_~-nAsn)WuMyFld#FtCZfd$$D2s{?$Js}E-!31lv$9G`tF!(0+Op#Q^_Pqd#Vibm zMiChyAeX(iwuibu0ISc}7Fl1JpKi^a!mAS!yk+x__pO Bg>3); literal 6254 zcmeHLX;f3!7QUej0wPfnq>6;#fMDhXk}yLUA|xPCWiH9hO^A?zBtU?o5wVIq2ZZ`m zKq<(eqD+D)h$t#5q6I4`76h#mBA|7wsP6`FTJQaMu4Vt3tR&~2^X+f%{hfWzJvSNt zY%c@7@AUuxFkpH!0ssI3Hxa-TZTKf#R>lVa?fuC?!HNJ*B1$Tg@P)AuN|7XmP>@mx z4=Q`wgG1^bT1_46wocaFux!ct$9a9OxD!6t9=9p%*N%9#F8VoY$zE&bhTmS^8)2>< zxSekBYU}*Fvkjb_UdQUwxpjUaiMFeHaprv^cDEG@Oz8S9k>UJdNyOP#p8pz1i>#k9 zU$oj^V$M5JyL?#l`oXyUS6KZp80EaDpL|EzPjpV zzADl%xHZInuKn5ud4mS~#P)F4MYk?txoFTWWJ}je>{OLQ%Y&D^Xz~v~yi;_B#YQA6 zE^j~b+9**+=Fn4m`}Dx@8vCxQZkrU^AAj=a4n5B_?=7gfNo%+Wk;<){GzRPE#1o)r z_zJFWMCg?L9@(P?$gHkk;&dC2RUPW`J#&>>qZN_un22>qDzA%MyRmOtwXRuAZhVY? zc=dJL(y^rD%AP-~AF`WyVTV%$h7n3kE~}_^SJa(LJ64*W3Vw6zN~TjPhi#z6x71nw zTU)5soRwDc{`eN7Ng2s;vY61j8eH*nk@|-L3*6uc(wTP(p!|P+L@eF)NQ6a zrfjI!6j$4z+Fk?in34VN3+nsbrx5m{EY{D6cuF`uJMj0t!P|Ux2Y3^T=Pxcrvl}%t zwlU`WoVT@~-@X-OhsZ7!N40C5*OHj{S{3&U?yp$0vV7mt_F8hi-(Q%+*8;M)hdrok z*gVz&`b8uUL!&Ai1Lsp4EDcPPa&%YZZZ6rwIlHsuqC?xs9`?hQXNZ`_8oo&&onThZ zAs1&(=~B$dAtCwaNwfWyBIfp33p}r-9JshxurQ3_QRz>#66F6vz~9%ofq!+%?E0o< z(6EstXUstIJnXLbzSmoidiCwD>WZJUGP4S!H!J8iGF9ocH+b=}>yC$?j=5sA30eHM zdBkM53se1tY;zw!@z3IImANgJt;}+{e+@pC?P7MOzC#ewS?Mmul;Z>GB`&MHDT+r| zHGl10Xjz0H;Od&?a}4|+2y%1fQ^TAm!!Y!*8Yy_t@n zqw0ami(Xk$gXU^;UZiD#{*M+eH$xL{cIF}*6#yNeJ^&7XC+$Jp*IZ)Pb*1)|V6N&A zih2i7?0$K$_z2j)?z`V+0i|A^8~PU5ZY@oGEN7kSe&2w93p+sBWIS z)-gjnJvX##Ws7IWa)$=vWlc$8+;;g!v!tC1Ow$x5$w-f*W1Fo4YFD`%iHvufc$idP z+F0mZzk1Q&t?Z}d`5~o+hghAJyEQAE=&bwVS0;n~yQ-`_ON^*epEdro3X#*#ZM-@_ zK54a_n`^A|0@Y+>gf)Iv^)|dVbWYpB+y?#FWL&M6-4Nf}`gHh{*s|kbUZ|GEA)k@o zecD=DwXTE8cKat%=xQA zYB{%Um50&3&=VFLZS^l_7U~BJJUYz(xSUZKqi3O~B^H=Jt=K-g%x6#2sIzf;V2{Sk zh78o2f+s6{v!+Y?%50GJ#w@~Oba~#XO~NU+svmvdnQ~!c(SXIAq1qCT?i;b{EkoH# zsXbG5r%>h3FDEic0c~~IfS-L3N85D309sDxR9g3*nMzKe-i>GZ0q15lw%;%!?ZOQk z6%}^}#06g5!J_!~1=$;|#rjZs=l@$~x4(lDB^WJ?X};9&(XD!uzQSu^*WP-?P|@Cj zSUW455_dNb=gmtI!XLO#YeMt(WyeQGxjZ#qzdY8WcRBAj^UNa$lM$ZzgF!F!{`R}u zRbs2Gu4v&iAQASqmE+^xETHKkY3Zys zJ}?b?=@`9UFRkBjLs52iVP=l<$AIYRx7W74rjF#dq`pA79lsb<18VqF+Pu#eau+sO zYe#mhTV);P%PpDbhbb92+B7_H`*lRRAnE37`7>);Ho_@Ox%t7*9*wRJHNppZFEZTA ztrnlYclx$A#e3{r{PjC_m$cSv?KUNLo=>`ktO||>k8TR-@XsjCXxX@bS<}|Ikb%ZC zA(#~*HGXeTMX|$}arrA}6P8$P)?}P3D@-RYVMKR(6SDUHRknWhxyOsnEyzBg>A6`e zsK8A&*1vi*rH;R9WhYC|bIm1_8*gVLG#Xrr_&090*7Z^mW0#wM>3Xtauz6_FgWB!J zP8xsLt;u}2ec=e=-}cS@*;vzUmaq1u|1?kOTqL=m@!b)Z%e(B4+@-P2Rpj=Sue7OD zO;7!t=(v z4$ev`2aJIfC@v%riXG7-4JXhjA2O=!jYFfxA&MABbTG>wqr`~imTHO# z4hAF#WkRV!C=sL7oE)wsUg3yF!{ey;@rk4?)(3jAd{PBi51f)C#SyT0oJfTG)IzTC zNPtNu1Nxs9@*wyyh6{k?l6V;ic_ct$h2^IdJn)0PG+q`vo(>PhL9vhshRR{DgwI@h zF2}2g4{9i_VaM@#^rH z3`exuKb7EjqhyzcjP{a{HIH_1L z9;RAwx~o6a5lzJ6Klb>?auj^n0A2$^F;9{x|2PyR6hVOsj#^KGErmjY^CsHSs6;zE z>POIWNG6ACQO!!gV@VUt>WQJl>A=!*)RhVoj9b9j(A{MaMoC~o3vViCj&$A?g;@xrBZzzHXEP6EUmcLdu_41v)cu>gWs z_+&}F?-%}$=^}8sGzymhPd16h!;ozu5JRPK$QT}%%i$3T1P+%-`dPR;?!&UeYOs`|I))@ z9Pr5|0NYLU!J7-bSK&TvR+DziC( zq`((}zg5>)lS}X8;|?T-Pe6(A!_3iO;5_^wq|Np5VgT>d?}Fo{*>I1p)H_5D0Qxi4 z9|W)~Z#LYiqhPW;bna>+wKa57{8C_?Mi!Id8l>!bbgfFyjeulym?gb?*9KZNdg{;N zSl-Lo=QacDL(D6b=s()kzTj2;P)|Y%RRamQsQ>HL1in_|>oI+Z=&MkwM#4#ft<77M zVGG}<9E=jB{;tyfYN;cE{_Q*Wfz-f;dxP8Rkuw1lpn~TGSQ6j<&~ob=_E`C|I^T(| rDeuSrpN0nT|De7I^UqT@|CppPdI&jIb0BaFT(1DrgUvYP7M1oNXi3{| diff --git a/media/atree/connect_line.png b/media/atree/connect_line.png index 02771e5dbeb70cba490f7f1011a6266174b75b61..41ee50731e02a10dae99c90a20decc01234064cf 100644 GIT binary patch delta 52 zcmeyy`HgeKEk<53gTe~ HDWM4fG*=SK diff --git a/media/atree/connect_t.png b/media/atree/connect_t.png index 14d3c16b69250a233cd1de4ca7f2a0b44f98b040..8ed976eb9f0d5d3c8d87891a0c058fa5598b8603 100644 GIT binary patch literal 692 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;3=B+po-U3d z6?5L+Fyv!0$Te-*MEOd-G7;z z;W-CG3+E^zJp^pi)8@xD?SB$`w}G4C5DN@lyLUUC*JUSzf)9;R&e=0|dszzFkSqr# d3HpEsi^UU5cvNTD9S{Lo=;`X`vd$@?2>@Frgo6M8 literal 694 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;3=B*Ko-U3d z6?5L+Fyv!0Y`KQ`W_}XlrNx5dCd*WBNtI?6u1u`@cU}owr<^ z;hZ1?hwvyOJp^{2KV!F-rT+BoUqyOIx}&S} Date: Thu, 23 Jun 2022 16:15:06 +0700 Subject: [PATCH 16/33] implement auto connectors --- js/sq2bs.js | 222 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 154 insertions(+), 68 deletions(-) diff --git a/js/sq2bs.js b/js/sq2bs.js index 41612bd..9a21daf 100644 --- a/js/sq2bs.js +++ b/js/sq2bs.js @@ -546,7 +546,7 @@ function init_autocomplete() { } } -// atree parsing +// placeholder name, follow new schema 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 @@ -562,8 +562,8 @@ function construct_AT(elem, tree) { let node = tree[i]; // create rows if not exist - if (document.getElementById("atree-row-" + node.row) == null) { - for (let j = 0; j <= node.row; j++) { + if (document.getElementById("atree-row-" + node.display.row) == null) { + for (let j = 0; j <= node.display.row; j++) { if (document.getElementById("atree-row-" + j) == null) { let row = document.createElement('div'); row.classList.add("row"); @@ -585,77 +585,163 @@ function construct_AT(elem, tree) { }; }; + let connector_list = [] + // create connectors based on parent location + for (let parent of node.parents) { + let parent_node = tree.find(object => { + return object.display_name === 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')"; + connector.id = "r" + i + "-c" + node.display.col + "-line" + document.getElementById("atree-row-" + i).children[node.display.col].appendChild(connector); + resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col]); + } + // connect left + for (let i = parent_node.display.col + 1; i < node.display.col; i++) { + let connector = connect_elem.cloneNode() + connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; + connector.classList.add("rotate-90"); + connector.id = "r" + parent_node.display.row + "-c" + i + "-line" + document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i]); + } + + // connect right + for (let i = parent_node.display.col - 1; i > node.display.col; i--) { + let connector = connect_elem.cloneNode() + connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; + connector.classList.add("rotate-90"); + connector.id = "r" + parent_node.display.row + "-c" + i + "-line" + document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i]); + } + + // connect corners + if (parent_node.display.col > node.display.col && (parent_node.display.row != node.display.row)) { + let connector = connect_elem.cloneNode() + connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; + connector.classList.add("rotate-180"); + connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" + document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + } + + if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { + let connector = connect_elem.cloneNode() + connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; + connector.classList.add("rotate-270"); + connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" + document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + } + } + // create node let node_elem = document.createElement('div') - node_elem.style = "background-image: url('" + node.image + "'); background-size: cover; width: 100%; height: 100%;"; - - if (node.connector && node.rotate != 0) { - node_elem.classList.add("rotate-" + node.rotate); - }; + node_elem.style = "background-image: url('../media/atree/node.png'); background-size: cover; width: 100%; height: 100%;"; // add tooltip - if (!node.connector) { - 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('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]; + 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")'; + } - 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.title.replaceAll("\n", "
"); - - 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.title.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.title.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.row).children[node.col].appendChild(node_elem); + toggle_connectors(connector_list); + }); + document.getElementById("atree-row-" + node.display.row).children[node.display.col].appendChild(node_elem); }; }; + +// resolve connector conflict +function resolve_connector(elem) { + if (elem.children.length < 2) {return false;} + let line = 0; + let angle = 0; + let t = 0 + for (let child of elem.children) { + let type = child.id.split("-")[2] + if (type == "line") { + line += 1; + } else if (type == "angle") { + angle += 1; + } else if (type == "t") { + t += 1; + } + } + + let connect_elem = document.createElement("div"); + + if ((line == angle) || (angle == 1 && t == 1)) { + connect_elem.style = "background-image: url('../media/atree/connect_t.png'); background-size: cover; width: 100%; height: 100%;" + connect_elem.classList.add("rotate-180") + connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-t" + elem.replaceChildren(connect_elem); + } + if (line > 1 && angle == 0) { + elem.replaceChildren(elem.children[0]) + } + if (t == 1 && line == 1) { + connect_elem.style = "background-image: url('../media/atree/connect_c.png'); background-size: cover; width: 100%; height: 100%;" + elem.replaceChildren(connect_elem); + } +} From 3939f83ffc747f63fce5d5592b80288ef16bdf90 Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 23 Jun 2022 16:15:51 +0700 Subject: [PATCH 17/33] partially change to new format --- js/atree_constants.js | 4237 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 3991 insertions(+), 246 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 31c22eb..41cfb16 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -1,185 +1,1993 @@ const atrees = { "Archer": [ - {"title": "Arrow Bomb", "desc": "Throw a long-ranged arrow that explodes and deal high damage in a large area (self-damage for 30% of DPS) Mana cost: 50 Total damage: 180% (of DPS) - Neutral: 160% - Fire: 20% Range: 26 blocks AoE: 2.5 blocks (circular)", "image": "../media/atree/node.png", "connector": false, "row": 0, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 1, "col": 4, "rotate": 0}, - {"title": "Bow Proficiency", "desc": "Improve Main Attack damage and range w/ bow Main attack damage: +5% Main attack range: +6 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 2, "col": 5, "rotate": 90}, - {"title": "Cheaper Arrow Bomb", "desc": "Reduce Mana cost of Arrow Bomb Mana cost: -10 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 2, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 3, "col": 4, "rotate": 0}, - {"title": "Heart Shatter", "desc": "If you hit a mob directly with Arrow Bomb, shatter its heart and deal bonus damage Total damage: +100% (of DPS) - Neutral: 100% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 4, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 5, "col": 4, "rotate": 0}, - {"title": "Escape", "desc": "Throw yourself backward to avoid danger (hold shift to cancel) Mana cost: 25 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 3, "rotate": 90}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 6, "col": 5, "rotate": 90}, - {"title": "Double Shots Ability\nBoltslinger Archetype", "desc": "Double Main Attack arrows, but they deal -30% damage per arrow (harder to hit far enemies) Blocks: - Power Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 2}, - {"title": "Power Shots Ability\nSharpshooter Archetype", "desc": "Main Attack arrows have increased speed and knockback Blocks: - Double Shots AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 6, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 6, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 7, "col": 2, "rotate": 0}, - {"title": "Arrow Storm", "desc": "Shoots 2 streams of 8 arrows, dealing damage to close mobs and pushing them back Mana cost: 40 Total damage: 40% (of DPS per arrow) - Neutral: 30% - Thunder: 10% Range: 16 blocks AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 2}, - {"title": "Cheaper Escape", "desc": "Reduce mana cost of Escape Mana cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 4}, - {"title": "Arrow Shield", "desc": "Create a shield around you that deal damage and knockback mobs when triggered (2 charges) Mana cost: 30 Total damage: 100% (of DPS) - Neutral: 90% - Air: 10% Duration: 60s AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 8, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 3, "rotate": 90}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 5, "rotate": 90}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 8, "col": 1, "rotate": 180}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 0, "rotate": 180}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 8, "col": 7, "rotate": 90}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 8, "col": 8, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 0, "rotate": 0}, - {"title": "Windy Feet Ability\nBoltslinger Archetype", "desc": "When casting Escape, give speed to yourself and nearby allies Effect: +20% Walk Speed Duration: 120s AoE: 8 blocks (circular) AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 9, "col": 1}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 2, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 6, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 9, "col": 8, "rotate": 0}, - {"title": "Air Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Air attacks Air Damage: +3-4 Air Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 0}, - {"title": "Thunder Mastery Ability\nBoltslinger Archetype", "desc": "Increases base damage from all Thunder attacks Thunder Damage: +1-8 Thunder Damage: +10% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 10, "col": 3, "rotate": 90}, + { + "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] + }, + { - {"image": "../media/atree/connect_c.png", "connector": true, "row": 10, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 10, "col": 5, "rotate": 90}, + } + ] + }, + { + "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"], + "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": 23, + "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"], + "dependencies": ["Focus"], + "blockers": [], + "cost": 2, + "display": { + "row": 26, + "col": 4 + }, + "properties": { + "range": 64, + "focusReq": 2 + }, + "effects": [ - {"title": "Fire Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Fire attacks Fire Damage: +3-5 Fire Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 6}, - {"title": "Earth Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Earth attacks Earth Damage: +2-4 Earth Damage: +20% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 10, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 2, "rotate": 0}, - {"title": "Water Mastery Ability\nSharpshooter Archetype", "desc": "Increases base damage from all Water attacks Water Damage: +2-4 Water Damage: +15% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 11, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 6, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 11, "col": 8, "rotate": 0}, - {"title": "Arrow Rain", "desc": "When Arrow Shield loses its last charge, unleash 200 arrows raining down on enemies Total Damage: 200% (of DPS per arrow) - Neutral: 120% - Air: 80% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 1, "rotate": 90}, - {"title": "Nimble String", "desc": "Arrow Storm throws out +8 arrows per stream and shoot twice as fast Total Damage: -15% (of DPS per arrow) - Neutral: -15% Blocks: - Phantom Ray AP: 2 Req: Arrow Storm", "image": "../media/atree/node.png", "connector": false, "row": 12, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 6, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 12, "col": 8, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 2, "rotate": 0}, - {"title": "Phantom Ray", "desc": "Condense Arrow Storm into a single ray that damages enemies 10 times per second Mana cost: -10 Total Damage: 30% (of DPS per hit) - Neutral: 25% - Water: 5% Range: 12 blocks Blocks: - Windstorm - Nimble String - Arrow Hurricane AP: 2 Req: Arrow Storm Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 5, "rotate": 90}, - {"title": "Fire Creep\nSharpshooter Archetype", "desc": "Arrow Bomb will leak a trail of fire for 6s, damaging enemies that walk into it every 0.4s Total Damage: 50% (of DPS) - Neutral: 30% - Fire: 20% Duration: 6s AoE: 2 blocks (linear) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 13, "col": 7, "rotate": 90}, - {"title": "Bryophyte Roots\nTrapper Archetype", "desc": "When you hit an enemy with Arrow Storm, create an area that slows them down and deals damage every 0.4s Total Damage: 60% (of DPS) - Neutral: 40% - Earth: 20% Effect: 40% Slowness to Enemies Duration: 5s AoE: 2 blocks (circular) AP: 2 Req: Arrow Storm Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 13, "col": 8}, - {"title": "Triple Shot\nBoltslinger Archetype", "desc": "Triple Main Attack arrows, but they deal -20% damage per arrow AP: 1 Req: Double Shots", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 0}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 14, "col": 1, "rotate": 180}, - {"title": "Frenzy\nBoltslinger Archetype", "desc": "Every time you hit an enemy, briefly gain +6% Walk Speed (Max 200%). Decay -40% of the bonus every second AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 14, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 14, "col": 8, "rotate": 0}, - {"title": "Guardian Angels Ability", "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) Total Damage: 60% (of DPS per arrow) - Neutral: 40% - Air: 20% Range: 4 Blocks Duration: 60s AP: 2 Req: Arrow Shield Min Boltslinger: 0/3", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 1}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 3, "rotate": 180}, - {"title": "Focus Ability\nSharpshooter Archetype", "desc": "When hitting an aggressive mob 5+ blocks away, gain +1 Focus (Max 3). Resets if you miss once Damage Bonus: +35% (per focus) AP: 2 Min Sharpshooter: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 4}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 5, "rotate": 270}, - {"title": "Basaltic Trap Ability\nTrapper Archetype", "desc": "When you hit the ground with Arrow Bomb, leave a Trap that damages enemies (Max 2 Traps) Total Damage: 200% (of DPS) - Neutral: 140% - Earth: 30% - Fire: 30% AoE: 7 Blocks (Circular) AP: 2 Min Trapper: 0/1", "image": "../media/atree/node.png", "connector": false, "row": 15, "col": 8}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 15, "col": 7, "rotate": 180}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 0, "rotate": 180}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 1}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 16, "col": 2, "rotate": 90}, - {"title": "Cheaper Arrow Storm", "desc": "Reduces the Mana cost of Arrow Storm. Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 3}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 4, "rotate": 180}, - {"title": "Grappling Hook Ability\nTrapper Archetype", "desc": "When casting Escape, you throw a hook that pulls you when hitting a block. If you hit a mob, pull them towards you instead. (Escape will not throw you backward anymore) Range: 20 blocks Blocks: - Escape Artist AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 5}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 16, "col": 6, "rotate": 180}, - {"title": "More Shields Ability", "desc": "Give +2 charges to Arrow Shield AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 16, "col": 7}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 16, "col": 8, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 1, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 4, "rotate": 0}, - {"title": "Implosion Ability\nTrapper Archetype", "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 Total Damage: +40% (of DPS) - Neutral: +40% AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 17, "col": 7, "rotate": 0}, - {"title": "Patient Hunter Ability\nTrapper Archetype", "desc": "Your Traps will deal +20% more damage for every second they are active (Max +80%) AP: 2 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 17, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 0, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 1}, - {"title": "More Focus Ability\nSharpshooter Archetype", "desc": "Add +2 max Focus Damage Bonus: -5% (per focus) AP: 1 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 18, "col": 4}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 18, "col": 7, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 19, "col": 7, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 0}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 1, "rotate": 180}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 20, "col": 3, "rotate": 90}, - {"title": "Twain's Arc Ability\nSharpshooter Archetype", "desc": "If you have 2+ Focus, holding shift will summon Twain's Arc. Charge it up to shoot a destructive long-range beam. (Damage is dealt as Main Attack Damage) Total Damage: 200% (of DPS) - Neutral: 200% Range: 64 blocks AP: 2 Min Sharpshooter: 0/4 Req: Focus", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 4}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 20, "col": 5, "rotate": 180}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 6, "rotate": 270}, - {"title": "Bouncing Bomb Ability", "desc": "Arrow Bomb will bounce once when hitting a block or mob AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 20, "col": 7}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 20, "col": 8, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 0, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 1}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 4, "rotate": 0}, - {"title": "Scorched Earth Ability\nSharpshooter Archetype", "desc": "Fire Creep becomes much stronger Total Damage: +15% (of DPS) - Neutral: +10% - Fire: +5% Duration: 2s AoE: +0.4 Blocks (linear) AP: 1 Req: Fire Creep", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 5}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 21, "col": 6, "rotate": 0}, - {"title": "More Traps Ability\nTrapper Archetype", "desc": "Increase the maximum amount of active Traps you can have by +2 AP: 1 Req: Basaltic Trap", "image": "../media/atree/node.png", "connector": false, "row": 21, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 6, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 22, "col": 8, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 0}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 1, "rotate": 180}, - {"title": "Homing Shots Ability", "desc": "Your Main Attack arrows will follow nearby enemies and not be affected by gravity AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 3, "rotate": 90}, - {"title": "Shocking Bomb Ability\nSharpshooter Archetype", "desc": "Arrow Bomb will not be affected by gravity, and all damage conversions become Thunder AP: 2 Min Sharpshooter: 0/5 Req: Arrow Bomb", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 4}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 23, "col": 5, "rotate": 180}, - {"title": "Better Arrow Shield Ability", "desc": "Arrow Shield will gain additonal AoE, knockback, and damage Total Damage: +40% (of DPS) - Neutral: +40% AoE: +1 Blocks (Circular) AP: 1 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 23, "col": 7, "rotate": 90}, - {"title": "Mana Trap Ability\nTrapper Archetype", "desc": "Your Traps will give you 4 Mana per second when you stay close to them Mana Cost: +10 Range: 12 Blocks AP: 2 Min Trapper: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 23, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 0, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 24, "col": 1}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 2, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 5, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 24, "col": 8, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 1, "rotate": 90}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 2}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 25, "col": 4, "rotate": 180}, - {"title": "Initiator Ability\nSharpshooter Archetype", "desc": "If you do not damage an enemy for 5s for more, your next successful hit will deal +50% damage and add +1 Focus AP: 2 Req: Focus Min Sharpshooter: 0/5", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 5}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 25, "col": 6, "rotate": 90}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 25, "col": 7, "rotate": 180}, - {"title": "Cheaper Arrow Storm Ability", "desc": "Reduce the Mana cost of Arrow Storm Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 25, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 0, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 2, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 26, "col": 4, "rotate": 0}, - {"title": "Call of the Hound Ability\nTrapper Archetype", "desc": "Arrow Shield summons a Hound that will attack and drag aggressive mobs towards your traps Total Damage: 40% (of DPS) - Neutral: 40% AP: 2 Req: Arrow Shield", "image": "../media/atree/node.png", "connector": false, "row": 26, "col": 7}, - {"title": "Arrow Hurricane Ability\nBoltslinger Archetype", "desc": "Arrow Storm will shoot +2 stream of arrows Blocks: - Phantom Ray AP: 2 Min Boltslinger: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 0}, - {"image": "../media/atree/connect_t.png", "connector": true, "row": 27, "col": 1, "rotate": 180}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 3, "rotate": 90}, - {"title": "Cheaper Arrow Shield Ability", "desc": "Reduce the Mana cost of Arrow Shield Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 27, "col": 4}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 27, "col": 5, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 27, "col": 7, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 1}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 4, "rotate": 0}, - {"title": "Decimator Ability\nSharpshooter Archetype", "desc": "Phantom Ray will increase its damage by 10% everytime you do not miss with it (Max 50%) AP: 2 Req: Phantom Ray", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 5}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 28, "col": 6, "rotate": 90}, - {"title": "Cheaper Escape Ability", "desc": "Reduce the Mana cost of Escape Mana Cost: -5 AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 28, "col": 7}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 28, "col": 8, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 1, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 29, "col": 7, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 29, "col": 8}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 0, "rotate": 180}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 1}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 2, "rotate": 270}, - {"title": "Crepuscular Ray Ability\nSharpshooter Archetype", "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 Total Damage: 15% (of DPS per arrrow) - Neutral: 10% - Water: 5% AP: 2 Req: Arrow Storm Min Sharpshooter: 0/8", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 4}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 6, "rotate": 180}, - {"title": "Grape Bomb Ability", "desc": "Arrow Bomb will throw 3 additional smaller bombs when exploding Total Damage: 40% (of DPS) - Neutral: 30% - Fire: 10% AoE: 2 Blocks (Circular) AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 30, "col": 7}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 30, "col": 8, "rotate": 270}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 2, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 4, "rotate": 0}, - {"title": "Tangled Traps Ability\nTrapper Archetype", "desc": "Your Traps will be connected by a rope that deals damage to enemies every 0.2s Total Damage: 40% (of DPS) - Neutral: 20% - Air: 20% AP: 2", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 6}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 31, "col": 7, "rotate": 0}, - {"title": "Stringer Patient Hunter Ability\nTrapper Archetype", "desc": "Add +80% Max Damage to Patient Hunter AP: 1", "image": "../media/atree/node.png", "connector": false, "row": 31, "col": 8}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 2, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 4, "rotate": 0}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 32, "col": 7, "rotate": 0}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 1, "rotate": 180}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 2}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 3, "rotate": 90}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 4}, - {"image": "../media/atree/connect_angle.png", "connector": true, "row": 33, "col": 5, "rotate": 270}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 33, "col": 7, "rotate": 0}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 1}, - {"title": "text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 5}, - {"image": "../media/atree/connect_line.png", "connector": true, "row": 34, "col": 6, "rotate": 90}, - {"title": "Minefield Ability\nTrapper Archetype", "desc": "Allow you to place +6 Traps, but with reduced damage and range Total Damage: -80% (of DPS) - Neutral: -80% AoE: -2 Blocks (Circular) AP: 2 Req: Basaltic Trap Min Trapper: 0/10", "image": "../media/atree/node.png", "connector": false, "row": 34, "col": 7}, + { + "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": 27, + "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": 27, + "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": 29, + "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": 29, + "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": 32, + "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"], + "dependencies": ["Focus"], + "blockers": [], + "cost": 2, + "display": { + "row": 32, + "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"], + "dependencies": ["Arrow Shield"], + "blockers": [], + "cost": 2, + "display": { + "row": 33, + "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": 34, + "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": 38, + "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": 38, + "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": ["Grappling Hook", "More Shields"], + "dependencies": [], + "blockers": [], + "cost": 2, + "display": { + "row": 38, + "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": 39, + "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"], + "dependencies": [], + "blockers": [], + "cost": 2, + "display": { + "row": 40, + "col": 4 + }, + "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": 41, + "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"], + "dependencies": ["Basaltic Trap"], + "blockers": [], + "cost": 2, + "display": { + "row": 41, + "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": 26, + "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": 27, + "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": 29, + "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": 30, + "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": 32, + "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": 32, + "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": ["Arrow Bomb"], + "dependencies": [], + "blockers": [], + "cost": 1, + "display": { + "row": 34, + "col": 2 + }, + "properties": { + "mainAtk_range": 6 + }, + "effects": [ + { + "type": "raw_stat", + "bonuses": [ + { + "type": "stat", + "name": "mdCritPct", + "value": 30 + } + ] + } + ] + }, + { + "display_name": "Cheaper Arrow Shield (2)", + "desc": "Reduce the Mana cost of Arrow Shield.", + "archetype": "", + "archetype_req": 0, + "parents": ["Precise Shot", "Initiator"], + "dependencies": [], + "blockers": [], + "cost": 1, + "display": { + "row": 34, + "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", "Initiator"], + "dependencies": ["Arrow Bomb"], + "blockers": [], + "cost": 1, + "display": { + "row": 34, + "col": 6 + }, + "properties": { + } + }, + { + "display_name": "Cheaper Escape (2)", + "desc": "Reduce the Mana cost of Escape.", + "archetype": "", + "archetype_req": 0, + "parents": ["Arrow Storm", "Arrow Shield"], + "dependencies": [], + "blockers": [], + "cost": 1, + "display": { + "row": 35, + "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"], + "dependencies": ["Grappling Hook"], + "blockers": [], + "cost": 1, + "display": { + "row": 36, + "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": 41, + "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": 20, + "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": 23, + "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": 27, + "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": 30, + "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": 14, + "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": 15, + "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": 18, + "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"], + "dependencies": [], + "blockers": [], + "cost": 1, + "display": { + "row": 32, + "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": 20, + "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": 17, + "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": 31, + "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": 14, + "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] + } + ] + } ], + "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}, @@ -350,76 +2158,2013 @@ const atrees = {"title": "Text", "desc": "desc", "image": "../media/atree/node.png", "connector": false, "row": 33, "col": 8}, ], "Warrior": [ - {"row": 0, "col": 4, "name": "Bash", "desc": "Violently bash the ground, dealing high damage in a large area"}, - {"row": 2, "col": 2, "name": "Cheaper Bash", "desc": "Reduce the Mana cost of Bash"}, - {"row": 2, "col": 4, "name": "Spear Proficiency 1", "desc": "Improve your Main Attack's damage and range w/ spear"}, - {"row": 4, "col": 4, "name": "Double Bash", "desc": "Bash will hit a second time at a farther range"}, - {"row": 6, "col": 2, "name": "Heavy Impact", "desc": "After using Charge, violently crash down into the ground and deal damage. (Does not work if Flying Kick is unlocked)"}, - {"row": 6, "col": 4, "name": "Charge", "desc": "Charge forward at high speed (hold shift to cancel)"}, - {"row": 6, "col": 6, "name": "Tougher Skin", "desc": "Harden your skin and become permanently +5% more resistant. For every 1% or 1 Raw Heath Regen you have from items, gain +10 Health (Max 100)"}, - {"row": 7, "col": 0, "name": "Vehement", "desc": "For every 1% or 1 Raw Main Attack Damage you have from items, gain +2% Walk Speed (Max 20%). Damage Bonus: +5 (Raw)"}, - {"row": 8, "col": 2, "name": "Uppercut", "desc": "Rocket enemies in the air and deal massive damage"}, - {"row": 8, "col": 4, "name": "Cheaper Charge", "desc": "Reduce the Mana cost of Charge"}, - {"row": 8, "col": 6, "name": "War Scream", "desc": "Emit a terrorizing roar that deals damage, pull nearby enemies, and add damage resistance to yourself and allies"}, - {"row": 10, "col": 0, "name": "Earth Mastery", "desc": "Increases base damage from all Earth attacks"}, - {"row": 10, "col": 2, "name": "Thunder Mastery", "desc": "Increases base damage from all Thunder attacks"}, - {"row": 10, "col": 6, "name": "Air Mastery", "desc": "Increases base damage from all Air attacks"}, - {"row": 10, "col": 8, "name": "Fire Mastery", "desc": "Increases base damage from all Fire attacks"}, - {"row": 11, "col": 4, "name": "Water Mastery", "desc": "Increases base damage from all Water attacks"}, - {"row": 12, "col": 0, "name": "Quadruple Bash", "desc": "Bash will hit 4 times at an even larger range"}, - {"row": 12, "col": 2, "name": "Fireworks", "desc": "Mobs hit by Uppercut will explode mid-air and receive additional damage"}, - {"row": 12, "col": 6, "name": "Flyby Jab", "desc": "Damage enemies in your way when using Charge"}, - {"row": 12, "col": 8, "name": "Flaming Uppercut", "desc": "Uppercut will light mobs on fire, dealing damage every 0.6 seconds"}, - {"row": 13, "col": 4, "name": "Half-Moon Swipe", "desc": "Uppercut will deal a footsweep attack at a longer and wider angle. All elemental conversions become Water"}, - {"row": 13, "col": 7, "name": "Iron Lungs", "desc": "War scream deals more damage"}, - {"row": 15, "col": 2, "name": "Generalist", "desc": "After casting 3 different spells in a row, your next spell will cost 5 mana"}, - {"row": 15, "col": 4, "name": "Counter", "desc": "When dodging a nearby enemy attack, get 30% chance to instantly attack back"}, - {"row": 15, "col": 7, "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)"}, - {"row": 16, "col": 1, "name": "Bak'al's Grasp", "desc": "After casting war Scream, become Corrupted (15s Cooldown). You cannot heal while in that state. While Corrupted, every 2% of Health you lose will add +4 Raw Damage to your attacks (Max 120)."}, - {"row": 17, "col": 0, "name": "Spear Proficiency 2", "desc": "Improve your Main Attack's damage and range w/ spear"}, - {"row": 17, "col": 3, "name": "Cheaper Uppercut", "desc": "Reduce the Mana Cost of Uppercut"}, - {"row": 17, "col": 5, "name": "Aerodynamics", "desc": "During Charge, you can steer and change direction"}, - {"row": 17, "col": 7, "name": "Provoke", "desc": "Mobs damaged by War Scream will target only you for at least 5s. Reduce the Mana cost of War Scream."}, - {"row": 18, "col": 2, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 18, "col": 6, "name": "Air Shout", "desc": "War Scream will fire a projectile that can go through walls and deal damage multiple times."}, - {"row": 20, "col": 0, "name": "Enraged Blow", "desc": "While Corriupted, every 1% of Health you lose will increase your damage by +2% (Max 200%)"}, - {"row": 20, "col": 3, "name": "Flying Kick", "desc": "While using Charge, mobs hit will halt your momentum and get knocked back"}, - {"row": 20, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 20, "col": 8, "name": "Manachism", "desc": "If you receive a hit that's less than 5% of your max HP, gain 10 mana (1s Cooldown)"}, - {"row": 22, "col": 0, "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"}, - {"row": 22, "col": 2, "name": "Ragnarokkr", "desc": "War Scream becomes deafening, increasing its range and giving damage bonus to players"}, - {"row": 22, "col": 4, "name": "Ambidextrous", "desc": "Increase your change to attack with Counter by 30%"}, - {"row": 22, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 22, "col": 8, "name": "Stronger Bash", "desc": "Increase the damage of Bash"}, - {"row": 23, "col": 1, "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"}, - {"row": 23, "col": 5, "name": "Collide", "desc": "Mobs thrown into walls from Flying Kick will explode and receive additonal damage"}, - {"row": 23, "col": 7, "name": "Rejuvenating Skin", "desc": "Regain back 30% of the damage you take as healing over 30s"}, - {"row": 24, "col": 2, "name": "Comet", "desc": "After being hit by Fireworks, enemies will crash into the ground and receive more damage"}, - {"row": 26, "col": 0, "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"}, - {"row": 26, "col": 2, "name": "Radiant Devotee", "desc": "For every 4% Reflection you have from items, gain +1/5s Mana Regen (Max 10/5s)"}, - {"row": 26, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 26, "col": 7, "name": "Mythril Skin", "desc": "Gain +5% Base Resistance and become immune to knockback"}, - {"row": 27, "col": 1, "name": "Armour Breaker", "desc": "While Corrupted, losing 30% Health will make your next Uppercut destroy enemies' defense, rendering them weaker to damage"}, - {"row": 27, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 27, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 27, "col": 8, "name": "Sparking Hope", "desc": "Everytime you heal 5% of your max health, deal damage to all nearby enemies"}, - {"row": 28, "col": 0, "name": "Massive Bash", "desc": "While Corrupted, every 3% Health you lose will add +1 AoE to Bash (Max 10)"}, - {"row": 28, "col": 2, "name": "Tempest", "desc": "War Scream will ripple the ground and deal damage 3 times in a large area"}, - {"row": 28, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 29, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 31, "col": 0, "name": "Cheaper War Scream", "desc": "Reduce the Mana cost of War Scream"}, - {"row": 31, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 1, "name": "Blood KO", "desc": "Gonna have to rewrite this one chief"}, - {"row": 32, "col": 3, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 5, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 32, "col": 7, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 1, "name": "Blood Pact", "desc": "If you do not have enough mana to cast a spell, spend health instead (1% health per mana)"}, - {"row": 34, "col": 4, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 6, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 34, "col": 8, "name": "TEXT", "desc": "IDFK MMMM"}, - {"row": 35, "col": 0, "name": "TEXT", "desc": "IDFK MMMM"} + { + "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": ["Charge"], + "dependencies": [], + "blockers": [], + "cost": 1, + "display": { + "row": 6, + "col": 2 + }, + "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": ["Heavy Impact"], + "dependencies": [], + "blockers": ["Tougher Skin"], + "cost": 1, + "display": { + "row": 7, + "col": 0 + }, + "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": [ + + ] + } ], "Mage": [], "Shaman": [] From d8d5b6caf643b6b9abb05e643a4229b7d74a66df Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 07:29:25 -0700 Subject: [PATCH 18/33] Minor code cleanup combine code in corners case combine cases in horiz. drawing --- js/display_atree.js | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/js/display_atree.js b/js/display_atree.js index 0758189..551a233 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -54,18 +54,10 @@ function construct_AT(elem, tree) { document.getElementById("atree-row-" + i).children[node.display.col].appendChild(connector); resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col]); } - // connect left - for (let i = parent_node.display.col + 1; i < node.display.col; i++) { - let connector = connect_elem.cloneNode() - connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; - connector.classList.add("rotate-90"); - connector.id = "r" + parent_node.display.row + "-c" + i + "-line" - document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i]); - } - - // connect right - for (let i = parent_node.display.col - 1; i > node.display.col; i--) { + // connect horizontally + let left = 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"); @@ -75,23 +67,18 @@ function construct_AT(elem, tree) { } // connect corners - if (parent_node.display.col > node.display.col && (parent_node.display.row != node.display.row)) { - let connector = connect_elem.cloneNode() - connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; - connector.classList.add("rotate-180"); - connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" - document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); - } - if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { - let connector = connect_elem.cloneNode() - connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; - connector.classList.add("rotate-270"); - connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" - document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + let connector = connect_elem.cloneNode() + connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; + connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" + document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); + if (parent_node.display.col > node.display.col && (parent_node.display.row != node.display.row)) { + 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(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); } // create node From e0f2dde9535d896016bcb79ee8c10912f91b2977 Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 07:42:58 -0700 Subject: [PATCH 19/33] Fix typo --- js/display_atree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/display_atree.js b/js/display_atree.js index 551a233..162488e 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -55,7 +55,7 @@ function construct_AT(elem, tree) { resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col]); } // connect horizontally - let left = Math.min(parent_node.display.col, node.display.col); + 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() From b5f05cb1e6b23ff6187e0a8134d346c415c67db5 Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 07:43:32 -0700 Subject: [PATCH 20/33] Whoops -- missing case --- js/display_atree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/display_atree.js b/js/display_atree.js index 162488e..85c2872 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -75,7 +75,7 @@ function construct_AT(elem, tree) { if (parent_node.display.col > node.display.col && (parent_node.display.row != node.display.row)) { connector.classList.add("rotate-180"); } - else {//if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { + else if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { connector.classList.add("rotate-270"); } resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); From c42e96d3607f62165330c5828e3807fa1a1e59a9 Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 07:53:55 -0700 Subject: [PATCH 21/33] Finally fixed bugs -- please test your code before pushing bad hpp --- js/display_atree.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/js/display_atree.js b/js/display_atree.js index 85c2872..8d2cf7a 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -68,17 +68,19 @@ function construct_AT(elem, tree) { // connect corners - let connector = connect_elem.cloneNode() - connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; - connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" - document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); - if (parent_node.display.col > node.display.col && (parent_node.display.row != node.display.row)) { - connector.classList.add("rotate-180"); + 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')"; + connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" + document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); + 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(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); } - else if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { - connector.classList.add("rotate-270"); - } - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); } // create node From d68af2f4c4ef837281e7f124b4d1fbc5a69fa4a5 Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 23 Jun 2022 22:00:04 +0700 Subject: [PATCH 22/33] fix archer tree --- js/atree_constants.js | 175 ++++++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 73 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 41cfb16..55e0032 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -1,15 +1,15 @@ 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"], + "archetype": "", + "archetype_req": 0, + "parents": ["Power Shots", "Cheaper Escape"], "dependencies": [], "blockers": [], - "cost": 1, + "cost": 1, "display": { "row": 9, "col": 6 @@ -18,17 +18,17 @@ const atrees = "duration": 60 }, "effects": [ - { + { "type": "replace_spell", "name": "Arrow Shield", "cost": 30, - "display_text": "Max Damage", - "base_spell": 4, - "spell_type": "damage", + "display_text": "Max Damage", + "base_spell": 4, + "spell_type": "damage", "scaling": "spell", - "display": "", + "display": "", "parts": [ - { + { "name": "Shield Damage", "type": "damage", "multipliers": [90, 0, 0, 0, 0, 10] @@ -44,7 +44,7 @@ const atrees = } ] }, - + { "display_name": "Escape", "desc": "Throw yourself backward to avoid danger. (Hold shift while escaping to cancel)", @@ -422,7 +422,7 @@ const atrees = "desc": "Arrow Storm shoot +1 stream of arrows, effectively doubling its damage.", "archetype": "", "archetype_req": 0, - "parents": ["Guardian Angels"], + "parents": ["Guardian Angels", "Cheaper Arrow Storm"], "dependencies": [], "blockers": ["Phantom Ray"], "cost": 2, @@ -480,7 +480,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 23, + "row": 22, "col": 6 }, "properties": {}, @@ -499,12 +499,12 @@ const atrees = "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"], + "parents": ["More Focus", "Traveler"], "dependencies": ["Focus"], "blockers": [], "cost": 2, "display": { - "row": 26, + "row": 25, "col": 4 }, "properties": { @@ -542,7 +542,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 27, + "row": 26, "col": 1 }, "properties": { @@ -577,7 +577,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 27, + "row": 26 , "col": 5 }, "properties": { @@ -624,7 +624,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 29, + "row": 28, "col": 4 }, "properties": { @@ -648,7 +648,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 29, + "row": 28, "col": 8 }, "properties": { @@ -675,7 +675,7 @@ const atrees = "blockers": ["Grappling Hook"], "cost": 2, "display": { - "row": 32, + "row": 31, "col": 0 }, "properties": { @@ -695,12 +695,12 @@ const atrees = "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"], + "parents": ["Shocking Bomb", "Better Arrow Shield", "Cheaper Arrow Storm (2)"], "dependencies": ["Focus"], "blockers": [], "cost": 2, "display": { - "row": 32, + "row": 31, "col": 5 }, "properties": { @@ -721,12 +721,12 @@ const atrees = "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"], + "parents": ["Initiator", "Cheaper Arrow Storm (2)"], "dependencies": ["Arrow Shield"], "blockers": [], "cost": 2, "display": { - "row": 33, + "row": 32, "col": 7 }, "properties": { @@ -751,7 +751,7 @@ const atrees = "blockers": ["Phantom Ray"], "cost": 2, "display": { - "row": 34, + "row": 33, "col": 0 }, "properties": {}, @@ -777,7 +777,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 38, + "row": 37, "col": 1 }, "properties": { @@ -803,7 +803,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 38, + "row": 37, "col": 4 }, "properties": { @@ -849,12 +849,12 @@ const atrees = "desc": "Arrow bomb will throw 3 additional smaller bombs when exploding.", "archetype": "", "archetype_req": 0, - "parents": ["Grappling Hook", "More Shields"], + "parents": ["Cheaper Escape (2)"], "dependencies": [], "blockers": [], "cost": 2, "display": { - "row": 38, + "row": 37, "col": 7 }, "properties": { @@ -881,7 +881,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 39, + "row": 38, "col": 6 }, "properties": { @@ -902,13 +902,13 @@ const atrees = "desc": "Enemies near you will be slowed down.", "archetype": "", "archetype_req": 0, - "parents": ["Geyser Stomp", "More Focus"], + "parents": ["Geyser Stomp", "More Focus (2)"], "dependencies": [], "blockers": [], "cost": 2, "display": { - "row": 40, - "col": 4 + "row": 39, + "col": 2 }, "properties": { "range": 2.5, @@ -925,7 +925,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 41, + "row": 40, "col": 1 }, "properties": { @@ -956,12 +956,12 @@ const atrees = "desc": "Allow you to place +6 Traps, but with reduced damage and range.", "archetype": "Trapper", "archetype_req": 10, - "parents": ["Grape Bomb", "Cheaper Arrow Bomb"], + "parents": ["Grape Bomb", "Cheaper Arrow Bomb (2)"], "dependencies": ["Basaltic Trap"], "blockers": [], "cost": 2, "display": { - "row": 41, + "row": 40, "col": 7 }, "properties": { @@ -1299,7 +1299,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 26, + "row": 25, "col": 0 }, "properties": {}, @@ -1323,7 +1323,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 27, + "row": 26, "col": 8 }, "properties": { @@ -1340,7 +1340,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 29, + "row": 28, "col": 6 }, "properties": { @@ -1365,7 +1365,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 30, + "row": 29, "col": 1 }, "properties": { @@ -1382,7 +1382,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 32, + "row": 31, "col": 2 }, "properties": { @@ -1409,7 +1409,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 32, + "row": 31, "col": 8 }, "properties": { @@ -1427,12 +1427,12 @@ const atrees = "desc": "+30% Critical Hit Damage", "archetype": "", "archetype_req": 0, - "parents": ["Arrow Bomb"], + "parents": ["Better Guardian Angels", "Cheaper Arrow Shield", "Arrow Hurricane"], "dependencies": [], "blockers": [], "cost": 1, "display": { - "row": 34, + "row": 33, "col": 2 }, "properties": { @@ -1452,7 +1452,7 @@ const atrees = ] }, { - "display_name": "Cheaper Arrow Shield (2)", + "display_name": "Cheaper Arrow Shield", "desc": "Reduce the Mana cost of Arrow Shield.", "archetype": "", "archetype_req": 0, @@ -1461,7 +1461,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 34, + "row": 33, "col": 4 }, "properties": { @@ -1479,12 +1479,12 @@ const atrees = "desc": "Arrow Bomb's self-damage will knockback you farther away.", "archetype": "", "archetype_req": 0, - "parents": ["Cheaper Arrow Storm", "Initiator"], + "parents": ["Cheaper Arrow Storm (2)", "Initiator"], "dependencies": ["Arrow Bomb"], "blockers": [], "cost": 1, "display": { - "row": 34, + "row": 33, "col": 6 }, "properties": { @@ -1495,12 +1495,12 @@ const atrees = "desc": "Reduce the Mana cost of Escape.", "archetype": "", "archetype_req": 0, - "parents": ["Arrow Storm", "Arrow Shield"], + "parents": ["Call of the Hound", "Decimator"], "dependencies": [], "blockers": [], "cost": 1, "display": { - "row": 35, + "row": 34, "col": 7 }, "properties": { @@ -1519,12 +1519,12 @@ const atrees = "desc": "Increase your Grappling Hook's range, speed and strength.", "archetype": "Trapper", "archetype_req": 5, - "parents": ["Cheaper Escape"], + "parents": ["Cheaper Escape (2)"], "dependencies": ["Grappling Hook"], "blockers": [], "cost": 1, "display": { - "row": 36, + "row": 35, "col": 8 }, "properties": { @@ -1541,7 +1541,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 41, + "row": 40, "col": 5 }, "properties": { @@ -1565,7 +1565,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 20, + "row": 25, "col": 7 }, "properties": { @@ -1593,7 +1593,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 23, + "row": 28, "col": 2 }, "properties": { @@ -1613,7 +1613,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 27, + "row": 34, "col": 1 }, "properties": { @@ -1639,7 +1639,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 30, + "row": 38, "col": 0 }, "properties": { @@ -1685,7 +1685,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 14, + "row": 17, "col": 0 }, "properties": { @@ -1731,7 +1731,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 15, + "row": 19, "col": 4 }, "properties": { @@ -1762,7 +1762,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 18, + "row": 22, "col": 4 }, "properties": { @@ -1788,12 +1788,12 @@ const atrees = "desc": "Add +2 max Focus", "archetype": "Sharpshooter", "archetype_req": 0, - "parents": ["Crepuscular Ray"], + "parents": ["Crepuscular Ray", "Snow Storm"], "dependencies": [], "blockers": [], "cost": 1, "display": { - "row": 32, + "row": 39, "col": 4 }, "properties": { @@ -1824,7 +1824,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 20, + "row": 25, "col": 2 }, "properties": { @@ -1859,7 +1859,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 17, + "row": 22, "col": 8 }, "properties": { @@ -1879,7 +1879,7 @@ const atrees = "blockers": [], "cost": 1, "display": { - "row": 31, + "row": 38, "col": 8 }, "properties": { @@ -1899,7 +1899,7 @@ const atrees = "blockers": [], "cost": 2, "display": { - "row": 14, + "row": 17, "col": 2 }, "properties": { @@ -1985,6 +1985,35 @@ const atrees = "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 + } + ] } ], @@ -2341,13 +2370,13 @@ const atrees = "desc": "After using Charge, violently crash down into the ground and deal damage", "archetype": "", "archetype_req": 0, - "parents": ["Charge"], + "parents": ["Uppercut"], "dependencies": [], "blockers": [], "cost": 1, "display": { - "row": 6, - "col": 2 + "row": 9, + "col": 1 }, "properties": { "aoe": 4 @@ -2368,13 +2397,13 @@ const atrees = "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": ["Heavy Impact"], + "parents": ["Charge"], "dependencies": [], "blockers": ["Tougher Skin"], "cost": 1, "display": { - "row": 7, - "col": 0 + "row": 6, + "col": 2 }, "properties": { }, From 39bbf45b12c0d57af2afd25a0dcb284987bf85af Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 23 Jun 2022 22:00:15 +0700 Subject: [PATCH 23/33] change connector logic --- js/display_atree.js | 81 +++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/js/display_atree.js b/js/display_atree.js index 0758189..19e3f22 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -14,28 +14,36 @@ function construct_AT(elem, tree) { let node = tree[i]; // create rows if not exist - if (document.getElementById("atree-row-" + node.display.row) == null) { - for (let j = 0; j <= node.display.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 - console.log(elem.scrollWidth / 9); - row.style.minHeight = elem.scrollWidth / 9 + "px"; - //row.style.minHeight = elem.getBoundingClientRect().width / 9 + "px"; + 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 + console.log(elem.scrollWidth / 9); + 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); + 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); + }; + elem.appendChild(row); }; - elem.appendChild(row); }; }; - }; + } + let connector_list = [] // create connectors based on parent location @@ -52,7 +60,7 @@ function construct_AT(elem, tree) { connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; connector.id = "r" + i + "-c" + node.display.col + "-line" document.getElementById("atree-row-" + i).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col]); + resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col], node); } // connect left for (let i = parent_node.display.col + 1; i < node.display.col; i++) { @@ -61,7 +69,7 @@ function construct_AT(elem, tree) { connector.classList.add("rotate-90"); connector.id = "r" + parent_node.display.row + "-c" + i + "-line" document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i]); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i], node); } // connect right @@ -71,7 +79,7 @@ function construct_AT(elem, tree) { connector.classList.add("rotate-90"); connector.id = "r" + parent_node.display.row + "-c" + i + "-line" document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i]); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i], node); } // connect corners @@ -81,7 +89,7 @@ function construct_AT(elem, tree) { connector.classList.add("rotate-180"); connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col], node); } if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { @@ -90,7 +98,7 @@ function construct_AT(elem, tree) { connector.classList.add("rotate-270"); connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col], node); } } @@ -165,11 +173,12 @@ function construct_AT(elem, tree) { }; // resolve connector conflict -function resolve_connector(elem) { +function resolve_connector(elem, node) { if (elem.children.length < 2) {return false;} let line = 0; let angle = 0; - let t = 0 + let t = 0; + let c = 0; for (let child of elem.children) { let type = child.id.split("-")[2] if (type == "line") { @@ -178,22 +187,36 @@ function resolve_connector(elem) { angle += 1; } else if (type == "t") { t += 1; + } else if (type == "c") { + c += 1; } } let connect_elem = document.createElement("div"); - if ((line == angle) || (angle == 1 && t == 1)) { + //if ((line == 1 && angle == 1) || (line == 2 && angle == 2) || (line == 1 && angle == 2) || (angle == 1 && t == 1)) { + // connect_elem.style = "background-image: url('../media/atree/connect_t.png'); background-size: cover; width: 100%; height: 100%;" + // connect_elem.classList.add("rotate-180") + // connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-t" + // elem.replaceChildren(connect_elem); + //} + //if (line > 1 && angle == 0) { + // elem.replaceChildren(elem.children[0]) + //} + //if (t == 1 && line == 1) { + // connect_elem.style = "background-image: url('../media/atree/connect_c.png'); background-size: cover; width: 100%; height: 100%;" + // elem.replaceChildren(connect_elem); + //} + if ((line == 1 && angle == 1)) { connect_elem.style = "background-image: url('../media/atree/connect_t.png'); background-size: cover; width: 100%; height: 100%;" connect_elem.classList.add("rotate-180") connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-t" elem.replaceChildren(connect_elem); } - if (line > 1 && angle == 0) { - elem.replaceChildren(elem.children[0]) - } - if (t == 1 && line == 1) { + if (node.parents.length == 3 && t == 1) { connect_elem.style = "background-image: url('../media/atree/connect_c.png'); background-size: cover; width: 100%; height: 100%;" + connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-c" elem.replaceChildren(connect_elem); } + elem.replaceChildren(elem.children[0]) } From bb98b2c5e43f382e0063e5622fc3cf818d951a49 Mon Sep 17 00:00:00 2001 From: reschan Date: Thu, 23 Jun 2022 22:11:47 +0700 Subject: [PATCH 24/33] fix archer tree (2) --- js/display_atree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/display_atree.js b/js/display_atree.js index 6e072cb..86d776b 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -87,7 +87,7 @@ function construct_AT(elem, tree) { else {// if (parent_node.display.col < node.display.col && (parent_node.display.row != node.display.row)) { connector.classList.add("rotate-270"); } - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col]); + resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col], node); } } From fe3445c16b1558785cfc52475b732a8543b215ed Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 09:36:50 +0700 Subject: [PATCH 25/33] fix: auto connector logic --- js/display_atree.js | 116 +++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 54 deletions(-) diff --git a/js/display_atree.js b/js/display_atree.js index 86d776b..82b2a94 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -1,4 +1,5 @@ -// placeholder name, follow new schema +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 @@ -10,6 +11,12 @@ function construct_AT(elem, tree) { 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]; @@ -31,12 +38,13 @@ function construct_AT(elem, tree) { 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); }; @@ -45,49 +53,47 @@ function construct_AT(elem, tree) { } - let connector_list = [] + let connector_list = []; // create connectors based on parent location for (let parent of node.parents) { - let parent_node = tree.find(object => { - return object.display_name === parent; - }); + 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() + let connector = connect_elem.cloneNode(); connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; - connector.id = "r" + i + "-c" + node.display.col + "-line" - document.getElementById("atree-row-" + i).children[node.display.col].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + i).children[node.display.col], node); + 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() + let connector = connect_elem.cloneNode(); connector.style.backgroundImage = "url('../media/atree/connect_line.png')"; connector.classList.add("rotate-90"); - connector.id = "r" + parent_node.display.row + "-c" + i + "-line" - document.getElementById("atree-row-" + parent_node.display.row).children[i].appendChild(connector); - resolve_connector(document.getElementById("atree-row-" + parent_node.display.row).children[i], node); + 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() + let connector = connect_elem.cloneNode(); connector.style.backgroundImage = "url('../media/atree/connect_angle.png')"; - connector.id = "r" + parent_node.display.row + "-c" + node.display.col + "-angle" - document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col].appendChild(connector); + 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(document.getElementById("atree-row-" + parent_node.display.row).children[node.display.col], node); + resolve_connector(parent_node.display.row + "," + node.display.col, node); } } @@ -159,53 +165,55 @@ function construct_AT(elem, tree) { }); document.getElementById("atree-row-" + node.display.row).children[node.display.col].appendChild(node_elem); }; + + atree_render_connection(); }; // resolve connector conflict -function resolve_connector(elem, node) { - if (elem.children.length < 2) {return false;} - let line = 0; - let angle = 0; - let t = 0; - let c = 0; - for (let child of elem.children) { - let type = child.id.split("-")[2] - if (type == "line") { - line += 1; - } else if (type == "angle") { - angle += 1; - } else if (type == "t") { - t += 1; - } else if (type == "c") { - c += 1; +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 == 1 && angle == 1) || (line == 2 && angle == 2) || (line == 1 && angle == 2) || (angle == 1 && t == 1)) { - // connect_elem.style = "background-image: url('../media/atree/connect_t.png'); background-size: cover; width: 100%; height: 100%;" - // connect_elem.classList.add("rotate-180") - // connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-t" - // elem.replaceChildren(connect_elem); - //} - //if (line > 1 && angle == 0) { - // elem.replaceChildren(elem.children[0]) - //} - //if (t == 1 && line == 1) { - // connect_elem.style = "background-image: url('../media/atree/connect_c.png'); background-size: cover; width: 100%; height: 100%;" - // elem.replaceChildren(connect_elem); - //} - if ((line == 1 && angle == 1)) { + 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") - connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-t" - elem.replaceChildren(connect_elem); + atree_connectors_map.set(pos, [{connector: connect_elem, type: "t"}]) } - if (node.parents.length == 3 && t == 1) { + 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%;" - connect_elem.id = elem.children[0].id.split("-")[0] + "-" + elem.children[0].id.split("-")[1] + "-c" - elem.replaceChildren(connect_elem); + 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) + } } - elem.replaceChildren(elem.children[0]) } From debbeee9f81faaffd94ea517d4a56239d52735c2 Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 09:49:24 +0700 Subject: [PATCH 26/33] for reference when creating beta atree data --- js/atree_constants_old.js | 171 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 js/atree_constants_old.js 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 From 32ee15dc2b023cb0fe3c22026c5cb587087e0404 Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 09:49:54 +0700 Subject: [PATCH 27/33] delete empty atrees, move assassin to old --- js/atree_constants.js | 172 ------------------------------------------ 1 file changed, 172 deletions(-) diff --git a/js/atree_constants.js b/js/atree_constants.js index 55e0032..add793f 100644 --- a/js/atree_constants.js +++ b/js/atree_constants.js @@ -2016,176 +2016,6 @@ const atrees = ] } ], - - "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}, - ], "Warrior": [ { "display_name": "Bash", @@ -4195,8 +4025,6 @@ const atrees = ] } ], - "Mage": [], - "Shaman": [] } const atree_example = [ From cba1bb5eb09baca8095e1a5fecfa46b01687975a Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 09:50:18 +0700 Subject: [PATCH 28/33] catch if given atree does not exist --- js/display_atree.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/display_atree.js b/js/display_atree.js index 82b2a94..8f0c08f 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -4,6 +4,8 @@ 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"); From e86152af181b7b82f819c317648db05ab22dd09a Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 09:51:43 +0700 Subject: [PATCH 29/33] delete nonexist function call --- js/display_atree.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/display_atree.js b/js/display_atree.js index 8f0c08f..0c5254a 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -162,8 +162,6 @@ function construct_AT(elem, tree) { this.classList.add("atree-selected"); this.style.backgroundImage = 'url("../media/atree/node-selected.png")'; } - - toggle_connectors(connector_list); }); document.getElementById("atree-row-" + node.display.row).children[node.display.col].appendChild(node_elem); }; From da97f593abd0b3face2b56e5aec4af206629e03e Mon Sep 17 00:00:00 2001 From: reschan Date: Fri, 24 Jun 2022 10:01:31 +0700 Subject: [PATCH 30/33] remove old script --- py_script/atree_csv_to_json.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 py_script/atree_csv_to_json.py diff --git a/py_script/atree_csv_to_json.py b/py_script/atree_csv_to_json.py deleted file mode 100644 index 4c63d06..0000000 --- a/py_script/atree_csv_to_json.py +++ /dev/null @@ -1,24 +0,0 @@ -import csv -import json -import re - -with open('atree.csv', newline='') as csvfile: - res = "" - reader = csv.DictReader(csvfile) - for row in reader: - if not row["connector"]: - row["connector"] = False - else: - row["connector"] = True - row["row"] = int(row["row"]) - row["col"] = int(row["col"]) - if row["rotate"].isdigit(): - row["rotate"] = int(row["rotate"]) - else: - row.pop("rotate") - row["desc"] = re.sub("\n", " ", row["desc"]) - - resjson = json.dumps(row) - res += str(resjson) + ",\n" - - print(res) From beb47c7f3d361a817b5b1bfdd162b02988eb160e Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 20:01:31 -0700 Subject: [PATCH 31/33] Minified atree constants file; remove unused (old) script --- builder/index.html | 2 +- js/atree_constants_min.js | 2 ++ py_script/atree_csv_to_json.py | 24 ------------------------ 3 files changed, 3 insertions(+), 25 deletions(-) create mode 100644 js/atree_constants_min.js delete mode 100644 py_script/atree_csv_to_json.py diff --git a/builder/index.html b/builder/index.html index b0c21b7..1a14ed3 100644 --- a/builder/index.html +++ b/builder/index.html @@ -1404,7 +1404,7 @@ - + diff --git a/js/atree_constants_min.js b/js/atree_constants_min.js new file mode 100644 index 0000000..9379944 --- /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}]}],Assassin:[{title:"Spin Attack",desc:"desc",image:"../media/atree/node.png",connector:!1,row:0,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:1,col:4},{title:"Dagger Proficiency I",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:2,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:3,col:4},{title:"Double Spin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:4,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:5,col:4},{title:"Dash",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:6,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:6,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:7,col:2},{title:"Smoke Bomb",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:7,col:6},{title:"Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:8,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:8,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:8},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:10,col:1},{title:"Backstab",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:90,row:10,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:10,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:10,col:7},{title:"Fatality",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:11,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:0},{title:"Violent Vortex",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:11,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:2},{title:"Vanish",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:13,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:13,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:7},{title:"Lacerate",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:15,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:15,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:5},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:15,col:8},{title:"Wall of Smoke",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:8},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:16,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:0},{title:"Silent Killer",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:16,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:2},{title:"Shadow Travel",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:5},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:8},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:4},{title:"Exploding Clones",desc:"desc",image:"../media/atree/node.png",connector:!1,row:19,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:18,col:6},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:7},{title:"Weightless",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:7},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:20,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:20,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:20,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:4},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:20,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:21,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:6},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:20,col:8},{title:"Dancing Blade",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:21,col:0},{title:"Spin Attack Damage",desc:"desc",image:"../media/atree/node.png",connector:!1,row:22,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:21,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:22,col:3},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:22,col:1},{title:"Marked",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:22,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:23,col:5},{title:"Shurikens",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:23,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:22,col:8},{title:"Far Reach",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:8},{title:"Stronger Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:24,col:5},{title:"Psithurism",desc:"desc",image:"../media/atree/node.png",connector:!1,row:24,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:24,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:24,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:25,col:5},{title:"Choke Bomb",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:6},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:25,col:7},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:26,col:5},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:25,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:0},{title:"Death Magnet",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:25,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:2},{title:"Cheaper Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:7},{title:"Parry",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:7},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:27,col:1},{title:"Fatal Spin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:1},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:27,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:3},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:27,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:6},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:27,col:8},{title:"Wall Jump",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:8},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:28,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:29,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:1},{title:"Harvester",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:28,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:28,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:7},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:30,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:2},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:30,col:5},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:30,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:5},{title:"Ricochet",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:1},{title:"Satsujin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:4},{title:"Forbidden Art",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:7},{title:"Jasmine Bloom",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:32,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:32,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:2},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:32,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:8},],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:[]}],Mage:[],Shaman:[]},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/py_script/atree_csv_to_json.py b/py_script/atree_csv_to_json.py deleted file mode 100644 index 4c63d06..0000000 --- a/py_script/atree_csv_to_json.py +++ /dev/null @@ -1,24 +0,0 @@ -import csv -import json -import re - -with open('atree.csv', newline='') as csvfile: - res = "" - reader = csv.DictReader(csvfile) - for row in reader: - if not row["connector"]: - row["connector"] = False - else: - row["connector"] = True - row["row"] = int(row["row"]) - row["col"] = int(row["col"]) - if row["rotate"].isdigit(): - row["rotate"] = int(row["rotate"]) - else: - row.pop("rotate") - row["desc"] = re.sub("\n", " ", row["desc"]) - - resjson = json.dumps(row) - res += str(resjson) + ",\n" - - print(res) From 3f3ed18455946a04431d5c498ba05d51fe2ac933 Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 20:10:02 -0700 Subject: [PATCH 32/33] Fix minified file / update --- js/atree_constants_min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/atree_constants_min.js b/js/atree_constants_min.js index 9379944..714b6d0 100644 --- a/js/atree_constants_min.js +++ b/js/atree_constants_min.js @@ -1,2 +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}]}],Assassin:[{title:"Spin Attack",desc:"desc",image:"../media/atree/node.png",connector:!1,row:0,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:1,col:4},{title:"Dagger Proficiency I",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:2,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:2,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:3,col:4},{title:"Double Spin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:4,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:5,col:4},{title:"Dash",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:6,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:6,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:6,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:7,col:2},{title:"Smoke Bomb",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:7,col:6},{title:"Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:8,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:8,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:8,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:8,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:10,col:8},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:10,col:1},{title:"Backstab",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:9,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:90,row:10,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:10,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:10,col:7},{title:"Fatality",desc:"desc",image:"../media/atree/node.png",connector:!1,row:11,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:11,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:0},{title:"Violent Vortex",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:11,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:2},{title:"Vanish",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:13,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:13,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:12,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:13,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:14,col:7},{title:"Lacerate",desc:"desc",image:"../media/atree/node.png",connector:!1,row:15,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:15,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:15,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:5},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:15,col:8},{title:"Wall of Smoke",desc:"desc",image:"../media/atree/node.png",connector:!1,row:16,col:8},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:16,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:0},{title:"Silent Killer",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:16,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:2},{title:"Shadow Travel",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:5},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:17,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:18,col:8},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:4},{title:"Exploding Clones",desc:"desc",image:"../media/atree/node.png",connector:!1,row:19,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:18,col:6},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:18,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:19,col:7},{title:"Weightless",desc:"desc",image:"../media/atree/node.png",connector:!1,row:20,col:7},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:20,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:20,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:1},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:20,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:4},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:20,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:21,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:6},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:20,col:8},{title:"Dancing Blade",desc:"desc",image:"../media/atree/node.png",connector:!1,row:21,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:21,col:0},{title:"Spin Attack Damage",desc:"desc",image:"../media/atree/node.png",connector:!1,row:22,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:21,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:22,col:3},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:22,col:1},{title:"Marked",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:22,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:23,col:5},{title:"Shurikens",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:6},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:23,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:22,col:8},{title:"Far Reach",desc:"desc",image:"../media/atree/node.png",connector:!1,row:23,col:8},{title:"Stronger Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:24,col:5},{title:"Psithurism",desc:"desc",image:"../media/atree/node.png",connector:!1,row:24,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:24,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:1},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:3},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:24,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:4},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:25,col:5},{title:"Choke Bomb",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:6},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:25,col:7},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:25,col:8},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:26,col:5},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:25,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:0},{title:"Death Magnet",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:25,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:2},{title:"Cheaper Multihit",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:2},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:26,col:7},{title:"Parry",desc:"desc",image:"../media/atree/node.png",connector:!1,row:27,col:7},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:27,col:1},{title:"Fatal Spin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:1},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:27,col:3},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:3},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:27,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:6},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:27,col:8},{title:"Wall Jump",desc:"desc",image:"../media/atree/node.png",connector:!1,row:28,col:8},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:28,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:29,col:0},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:1},{title:"Harvester",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:28,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:4},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:28,col:7},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:29,col:7},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:30,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:30,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:2},{image:"../media/atree/connect_t.png",connector:!0,rotate:180,row:30,col:5},{image:"../media/atree/connect_line.png",connector:!0,rotate:90,row:30,col:6},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:5},{title:"Ricochet",desc:"desc",image:"../media/atree/node.png",connector:!1,row:31,col:8},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:1},{title:"Satsujin",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:1},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:4},{title:"Forbidden Art",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:4},{image:"../media/atree/connect_line.png",connector:!0,rotate:0,row:31,col:7},{title:"Jasmine Bloom",desc:"desc",image:"../media/atree/node.png",connector:!1,row:32,col:7},{image:"../media/atree/connect_angle.png",connector:!0,rotate:180,row:32,col:0},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:0},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:32,col:2},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:2},{image:"../media/atree/connect_angle.png",connector:!0,rotate:270,row:32,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:5},{title:"Text",desc:"desc",image:"../media/atree/node.png",connector:!1,row:33,col:8},],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:[]}],Mage:[],Shaman:[]},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},] +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},] From 14ab20c4464fe96cf4ad7e3185974ce79443cb0f Mon Sep 17 00:00:00 2001 From: hppeng Date: Thu, 23 Jun 2022 20:18:08 -0700 Subject: [PATCH 33/33] Remove extra prints, make response time of nodes much faster hides a bug that we have where two updates are scheduled if you hit enter and tab... no....... --- js/builder_graph.js | 2 +- js/computation_graph.js | 4 ++-- js/display_atree.js | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/js/builder_graph.js b/js/builder_graph.js index a3e0052..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 @@ -337,7 +338,6 @@ class WeaponInputDisplayNode extends ComputeNode { toggle_tab('atree-dropdown'); toggleButton('toggle-atree'); } - console.log(document.getElementById("toggle-atree").classList.contains("toggleOn")); } } 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 index 0c5254a..888383e 100644 --- a/js/display_atree.js +++ b/js/display_atree.js @@ -36,7 +36,6 @@ function construct_AT(elem, tree) { row.classList.add("row"); row.id = "atree-row-" + j; //was causing atree rows to be 0 height - console.log(elem.scrollWidth / 9); row.style.minHeight = elem.scrollWidth / 9 + "px"; //row.style.minHeight = elem.getBoundingClientRect().width / 9 + "px";