From 3808cfe1d5fbd08264cf43b234f29130629f9d8d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 1 May 2021 00:12:55 +0200 Subject: [PATCH] Stormlord PrC --- LICENSE | 21 ++ overrides.zip | Bin 0 -> 16057 bytes overrides/mes/help/stormlord_help.tab | 8 + overrides/mes/stat_ext.mes | 337 ++++++++++++++++++ .../rules/char_class/class038_stormlord.py | 131 +++++++ .../feats/stormlord enhanced javelins.txt | 5 + .../stormlord immunity to electricity.txt | 5 + .../stormlord resistance to electricity.txt | 5 + .../rules/feats/stormlord shock weapon.txt | 5 + .../stormlord storm of elemental fury.txt | 5 + .../rules/feats/stormlord storm ride.txt | 5 + .../rules/feats/stormlord storm walk.txt | 5 + .../feats/stormlord thundering weapon.txt | 5 + overrides/scr/tpModifiers/stormlord.py | 231 ++++++++++++ readme.txt | 6 + 15 files changed, 774 insertions(+) create mode 100644 LICENSE create mode 100644 overrides.zip create mode 100644 overrides/mes/help/stormlord_help.tab create mode 100644 overrides/mes/stat_ext.mes create mode 100644 overrides/rules/char_class/class038_stormlord.py create mode 100644 overrides/rules/feats/stormlord enhanced javelins.txt create mode 100644 overrides/rules/feats/stormlord immunity to electricity.txt create mode 100644 overrides/rules/feats/stormlord resistance to electricity.txt create mode 100644 overrides/rules/feats/stormlord shock weapon.txt create mode 100644 overrides/rules/feats/stormlord storm of elemental fury.txt create mode 100644 overrides/rules/feats/stormlord storm ride.txt create mode 100644 overrides/rules/feats/stormlord storm walk.txt create mode 100644 overrides/rules/feats/stormlord thundering weapon.txt create mode 100644 overrides/scr/tpModifiers/stormlord.py create mode 100644 readme.txt diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..311fd39 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Sagenlicht + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/overrides.zip b/overrides.zip new file mode 100644 index 0000000000000000000000000000000000000000..51c603f131db11b1385bd7376a5a58b6e24bb424 GIT binary patch literal 16057 zcmb7r1z4TA+U-V)ySux)yA=20?o!;{y|}wWaV=1wNU;LN-Q9}26uU5U=L|FL{r_|K zem=6plVq*Dc_ZISA}<93iUN4~T!v*T{_*4g{(*W9ZJdqm?ahsh9q8r%lTJW6>mTXh z{*lh=A8Ez^l@|Gzv}VSZw*M&{0+6YnrKnhba0&?q0L;Py0HnXq;NWOuZ)Is?Z>0N@ zpUzR=ph8vK2AL7TlMeAo-z_f`p^bkfYI7b;NMj2QK}dOXk&`pP5PV@K2Hl&xuC0JH z_Y(vm>W^V{4^vaqZ(>AR2!P3t9vP&|VRUnQ@fb z33pSk99;l3dCBN_NuEq$8EQb!*wDC_jW%JXqneRfLzc2pY&=Nd^}E?y5lqAcRtR+n zbQJRGjz}|l1()3Yxc#hBb<}FaknhZ4RDoUDNMu3`Z1PrZSS>7>D*NJZ_9$<|2hb~~ z#l6b}$F$N`b?fb=RxEO-P%vqV0l@NJ3JTctqNEuV9CKgZ)=y~2B~BL$Fze>1zHc#- z4gzWE7&S*E)fj>ycN1NbR72^M52=NNvyvQ1=)K$iIOHBueJ%h+kdGe%2k)pSC{!$U zyTMGoW1B#Bd$a1Aklpa(n;0e9G(l0Z*ZJKy7EVq)qMSQE?j>}So(JUEBKqA@m2Fw+ zGY#LNh`amww6qB;@^H$Zw|6@3k}lbL!VNJR#B`}<{qInL-|;wa@xuPh<#sBH5Mhb} z-umW%>QAFvv7d|L?*tq-w=+$FoSGii^rg#8R>XGtOP-e5e!5W*5*Bpmd~UnJC~{bm zs@c9#5SUCk9F5da8pEzgdQzg1_L^89Wa=dsgfs>Yq=jFU%Sewj>JZP(e5U@mWQUEY zcN}2NXKTgzHcqcoN`l`%WjDCSBtg=h$nmuwL)fb8 zeX`?U39z#Z^6ltvKQ(SiX`+3yW@~}E?6#nXB*9GLhYyvpQJS?Fk*3(_?<2ka@KC5W z#)q+3-jf>WCnG_Frhz)Rf~y8!wfadi0fWY7Lmz2GhDs%37725oept(hM9onP$e?F_ zbb9b}3ld$ZIo%us(R5J!ENlEw<@PQdt^`%Zg(a3%=>bw%B`#3TWm#{IZAz>XYQsT? ztX(O@{zOv4v~j`?*nL|XeMV4Tbx1uv`(zX<6ltxh@D;UpnGB`qT$EZsxGW#4>9jue z*>IwkCR=C?&)0_^Y}c`koa>k|`jJnm<*f9PbEl=B%`97TB|c1w+I?WE`G zltQ(+rzu%9R%dT4*A)HZjlL_A%iz}z;6SKU1oY+sNIxk=V8-0CGZ%<3NU zJM5k-p+Y&Tnxa>=ny?9AN_TC8H@sQr!O{K*TBpTysCViW<)5foA7t@9ilEZo!ggAljy?Mn42T37>6d2FcV-ifs;ahw^<@qUhrc z@sEu+eg@89XcJ9I6+Bf4apTlK*QU*dE({u)t@$w{;%6QN`9p-9zrs(9t$kDqCYgx| z+*WX?Q%<*y*>DRZxvkzdD-lRupc2zb5SDuyd_uM~8qT)4iPC0mm*#fXHC-0_w$wOu z>0Mu1JAkH(JtZdk@c2gHbNc|U{%Haq(>~(%tmM$_mAt%~ZW7Ve2f3BOK0ayaouSWY zx48HW7uB9`Ke#5Zb z?`~CeB|m<&PkvIC;uxu`-0*QC2-lYVXvUaynz^|V*o}SKc(ULv#hGq2V>j<}ee{3; zR=2^vQ5JeQvQz(cu6<4>CmEY5C!j_$=>s;?&_EFpt#`f&c@`HdcdgfeIE{?Tcxhl?wdFP-_gh8Y$!3*fNBu89 zD;2AxTbYX9nUb@!v+Md?o*650=D+=zyw}Ry*1((}r{!UDKcj0EJhL#ADdlL6^7uVs zVSH7F`)1dY>AF55JNwjCWjA&05y9)YCYiR$r)}xWfD=wF;()4a6~H*cBb<^0cX zI(v0jzqQ`Y>6yh=5tqWHalN$EG$z;`Z7X)0v&lKG{z_k!5J9bjF)l z#EEr2s~OQ;*&$m38??6cjv{)Xpx!zGU}5fq(i@-g;3+Bm{+p_`|9$CrwPPMX+n(zYRbDKG#`{;Lp)DO%C z63T_MHq)+nSO$H1*HLun9aqa0WlglOp~!Ge7(f=Pw`tQ@cufRA#fOt*`fH?MWZ76D z8q*TIB>~@<0725<(OsqHiezf@Mm$h zou0^J4OK*G(OzQZ{^Do>;c4+H7XcF=d8yw6UyKtC6MH{nz#Y2Z<>-~NTt;uQ{$f0! zMD@^f^?W|%O>piFd<+Re>^ZvLC0LnM=5-NB3I3SMaos?|l>;@2;VSt@#QWoF$VeTK zZ}3A#xEE>Vpq3Q< zY?q?D0qo9Nx?1O?R5YyK(fc1^4^kh;4a<^;yXeMdCFn7l6EE`o;_z#jcw4=*`tSD<>wbq=m+9zwE8=jx8w#sa*P*`X-(>%m9px7J5 zL{<|ez+4DZ$CF2=W`rcrZ4lFeTbOoRz^bqK(BL%JP&q&S*-E>y0{--`#$EtjOlZ#9?_Z!LNL~-8iMwoF&toA*9%! zfaYDMNW@MEyw+Wq(=iS^J7CEYl(VE*e0oopHDJs| zwo0=jWM^;=?5i)Whnm04I&@1a$tZqVDL)fQgPyF-5+F!+R%q5erTBKtw*>V*CNDdohMc3V$$)pMJVjEJeD-jV9*yPRZUDo-&McfZ~Fg z(hj;!^mZRFtXzC+)bCYDj8{|>QuzatGJhZ;Y%SV-bCaoz#FR#M*~KE#Y9*DSYgfLJ}F4tSCO$# zEi6Hf6uGcWjg-KTWK}ar;Yy_rpQV3bM!-sAIVyziL$bhk8raqz)m@`(R;!IcMFXGo zF{=mG=xzz(tD-`oO>K{YFlVL}Ty?AVwVObJO|B(l`GWQn+y{r;Ons^++S=30P(@bb zkjq0nkT6yv8x4{yb2KsHRahPN`yS!ik`XH>j)9H9$F#Otks1G^juU#f0;^40KVA;S zDm%{eOCX(G31f%ahU^q?NPj1uK91ou`4qc%bV&3?re*iOhp`tm6gl#t%mBn3l7(-F z7D&2yRG#D^ivFe@=FPGJ7p)gGrT>x)6NW;PM$&dkK_xH*?$6vbRA&`{JCf&X#KSpIa zHH!=l7klj{?8b4x6BU9K+tL}mv6YClhxkDZJGx#9dR+Ds;tFdzjC7azQeAl}z^sZ1^o<&*Z79H|?8|VQc%DbWG=z1Q zi~<5sX7>4FG!ABoDU&1AIed(g)RC{afNT-WI@0d99q0?CF+kpK)XHq(`_Tz_pKl_U z5YVID-6<-^{-U{@<2?Pj_Fp-0$Zy?9ZefW+5LikucoElv#*smQ2;Ih<_N^gCaKXP5#AR;jIOi_5<`2c8M#n^l9Mf(zveWEAp0FzNRl zPh4b|kwz2^38s4DZaN~ACs68}=wG4r_H0--eOj*N)bvr$5G&Z%J}76?1_y+@UT3ti zr@fIfTa#fa)Zdc~NI}LL=t$TV3Pa=U;L^WZ1+f8|+~{9~Uqc>7-Jjjh72OWEqgD0+Qw2m&tR`7uO4+A z_8hV@2pbt zM_vLwSW0hb8p>R${4 zaI&e^-zdM|sO1tkiTp?$rj`Qw2voxw^xil~e$5a}6amh6(Lod{fF3TG;lzvpfwN0u zk|WQEy4dWn7=$90{AW#T$VBa&) zj6UffkUSYUR_p!)Y8*vu0uMI5@!aEIYzo|F;@dKh{KePjC;ju1*Pl+F+MwSh^VnlZ z%bPK0o_&MS7u|=CR*RVqw1p}&fGQ(NWvw_Z?ziSZ)C=($J8}@AN9#)jJ&NEV?SD&; zLH-7Nbl@^7643VH?HNh983-{;fnd%|-?C|fA|J@AfRsvdg#w{VKf{x5lIgdgt9ZYU zup{A1jR>)I9;kI5J#O9rE8|(vs*AL|{sHCyDI@`$?peZKQmb7=hP2%s~K@u}B%>pFF zRh<>FEgT@Gf)RMv91wE-okQ=ct_$(@mmG#}7e{sAKlg@*z}; ziqo+6*!DT~Kn4z_x^pLd__~B1+Mp{kUpT=pu5uX|2ha%AzV7b?BoLHs1*SKAxXhU+ zQ8)LoX$GXpBlKj(tl4Vsq8hB=*rN!q==P5S&u|KOy}jkalwLeK(?S+79&LH}x*AaM z^EMusA=1wQ!H>CEtZJZ`tyNYN^#NKR;oC66_NRwWr5)d$X)R@lb%%D|aDYIfYKoSi zO9fS@CXKtAtKc{@seDZe!dQ0cc$3l{4os&#&ktk&4GLvYxFHlvAb^xY;*Gp|ZTGf> z?f&~z2{(5GJut;UBgVar&IEyR#`qNS4Cr{Sgq_uOsF@tfDS5P6%QWos0**$MpK&}c zi@Qn*zJ9w%f;CASSV8T=x>B-YTd{`wfi(6w0U)` z+z-pinUM}ELRF%glmW%gV7Z+9hlgEK&NOegQra`OT?LDp4gf2AxrQC zT1c>MEA(wY&FbxdVjSF}tSB$V>Ln_dGDLNo3(oAux%(O?`(wS~?(0Jmvl25GG+;?K zp?1tIaD>+~^ra>OLgGyBC<}u2YGxy9#~pl8nCFRmibWhE<_PS5f(>D&c7w^g$3Z1Ijer%)`dmz& zTjDDo|?_ z#g0J4IfUeIuRD?_}_e_BW)O z0r9_668_;XJKbKLRTe9@dj)q|uCuoMruV}hBBQ0NU6u}FXEzZP=uXN9bc2k&_O}vn zI&SwYypB!65WwD>il^-KSH(>8z2xuHT=v$Ib(b?Uin+rtlM*;O>y;Eo z3b{A(+SW=Yd|@fLwahTY${Eh6IfMv?s|?NEgct3(QCF)mO+=SMMYuE&zw1kwcnveVW9`#FJeG+>YN6BLK9~Je= zLn6ifFzQlgd|N1~6*qdGG;66YVq}fvcJkh3`1(n*PBpzp!qcQN-sZKyyE- zZdg8~MS^y$;!+7Cn@Aa|--hfn0H1Daa&0>Pi&q%Pn8lX`x zbvK#h%mQkmsNS-$8l_{%=_(sN{eVPF&Bym6s#n=}RiR+~eJ z?>ZF-{oSQxH|0@#Ki;MADDp^FANzaPEqRE;^d(oXui9Dr--YzW#f*C_PX=?KUZp3b zMtGsyO&ZN?qCrEfDt9v891HAHm~3Wd*{=F6A8QA3J4=eqH13(!3LbD}6EE(%1hu8^2d$=RV zrSCAGgNk+_+#!)fK?8hI6YzVVjrD9 z^M4wR5B{mU36qR39nGI{n(8kpnOiLDkiDL=Q_GA;N&w$E-N~+l?#iB%CqynBv@3$X zv&Ms_(hv|kl7Dz~?hU1Dl#>Kh5B$UnE>JoCPTDU$&z(C_LY`h^4=l+arJK0O5i9x5-j_?^rl~HROvDUPFa8XIk_N#$jg^1Lec8Cxd5&N zV}V1OwchDV4ae`k>o3}^?dCHoMtkRg(|6$OwW6t`;u$N~Q)esY*KQ)o-cr7dP&O?a z-T08*Zz&Wq3IX4Lbzv$5=YKSDJ51M|;Mr(}gy!`zY{}CST0Sb>w4}>@I=r@juG0?T!BMa{ZIdcHOVZ>6z)ctnFJrSzSOUe9lGtfzgcN8E~a zx=%UO5OR$TS`q-yn5!MR-SIx$`b@x8V$m6t{&je`VxuP>UP~a=1oyi-OGGGMveqp@ ze|R@k2s-xOkr--`I*u-n%bl|cVww6QO+f@=?QO>tfncPKKpJzC+mig?pdpFoo=|Cf<>A0K_j0E3N$A?!utq|*80(BvC#3S_ zcDL?B*TiP_nQ&U9ROnN2yC{pk>IMtt`iaEN>uzUzR;PYZbUQwp3 z2i@%?sPmS1UKhG#jfs2(TEw~4bv{c8=aG@_07^X7HY8FZt&nWK_Io8qiAw4NiT26a zCtT#?1=ww#zP?`kdP0}Hb*vIP(f5gncoltOIb%iIa<`TPkpwN!d0oQm2f%Ag84QXy zrKA06Tq|LWcex}pw1Tsr9kzr?qTrjtR1H=payKS$7fyy*SS2nZtduBQf&5emZ}z~b z&=<7qb{EO{gDyjYWHX#{t}3Y7{K319T0=3iclkt=FQWizfV%NX72J2%9&`GLU}uRMYt=P$@h7p z9(I@fDk<%1dVGpbMuq4wKfnr()25167Q`6ZD4Pq>v$Qktyr&$1EWBWn43V*(Y{9i| zTf>9(ku~o;E_4ZTj?T&d66b&2ZASQqIB)M{`Hy|%VxWKSIb;7OwV|25y{@69zQf;} z)erzR#Vp15wkktzpa6iv^G-Fx|D5rU>fd;K3>9NZ??y|fhP26cvd2<0FuU5;6k1>>y#bd=bSTE1+oUp z_r$2|6KP{}<~^kvvkb`Bh}@E`&PiAV`!dHyhx?s&>yHbNghccmQ3)bAm75Wyqx<|n zoFN`rX5UHKf9ik;ljq_owN$qh3`Jx{yRbPT^Oo|}{2UQoI+hxw_G7WU)q!DAZO2cG$PmbHif8rer`agJBe%=G-iLZ9woTsZin!FS*5&{oqT|$A zqit}fbNkEz1Qt9K*iC)xzKoEVRQ#DCbcs00!D`mEiFh^|RL&950%Lz^#lwu2%wyxH z!C>e$tl4up7I`KCn;{%VFcM9erZ6Sz9M|Yn?SLY!w;1_*VNyxtJVwsPEwL8l1QC9c z!93>bGp<~AZ@La#6?u+7cQiRXHnH(|+OfQRTc&2Hl5&-M9gdkZsDWm=E7?CO|KYU6FK{Bz{Cg_J z`;;6G+L&x)=b$at_msRl2oIg71&*H4J&T}j89$)=-xSfkQ_A?zkc4Sk09>IideY-h ze3?5+`>qt^hSUG_3WoT?K$+~Av^QIBI;0x|xl+xG0@0Z94k5j`v3fTm(axb2o?f-YTr9Qr_Rc z(Lh8G;6Nr1<+v?7EjO_vfL-;HdC{w8>wv6MSd5;`U4&|Q5gFt2f5f4TTpAj%Z!O@i z`pBXP6g8g~2BF@2;mZGMzi$B=n{F3uAC~C55?0DxIBFZkIr078R#fypx$3uyh*zy! zVIlcQG5u5!!g{5b$kOiVqiy;GR%yhNY8!U;gzEkTuC3vUw1xSolE@GEd$hz2|L55p zoZk#%MobL4`i73?Hr9U+fB*nC;GZKW+HZ2280$O!od*Iy+?uIKq%cmE^PG0;`C( z=?t(nIkHRw|xr z%E8RW@I8TxvA(U1^-E)0#WKouF(3q8OFqEcfI^Dqft1$PFw~%i-D2q)1{j94NJ%~N zI*a6%Qn^)^U$Fk7jbUwx9?u%BpnND_f& zZ*iJovfD?}=MT?i4+9xr+vN==`1JYKSH?b6i$r-}_*fkQg-lunreLbNJ3GmBk+Z0C zUl8)%O32kw4#Ppb2(>SkJAU*{`kGlz)-m=MH@-VV6*^CRC^vkA#7v%Kmm(w+d#4BR(TZDWi_-qwjDp@xYZ!It19F8stAz}g2;;BGK4;AZ)@k^E z`DJ4Q&9z{qb3DlO&qE5)%f|Hz)AgmOpFh% z2V||&$~%Q4w9`(kREZxKrxT6Y_IlS9Eo&&%=mr2I%n$gWx3H{8u^$l>zf|c$wkksT zUyLR8BO%fDI_9!*hzLi#Q)_z6D;k6kvKg_y3N-o*2g2yU;X|iteB(p$)wPs)s0@I2 zwX$@5UDqVy0P?pXB-=9;kue3_wVn-O|NPKBKYt&e{C%hU(-1EQEdLlZ1_hyf2@u|{ zwXWiBgVGZ72!AR@7Jm%NiHZ~+Jq#c+yGFyWx`7et!5MfA+2aW*%}hbFwxvwl}vnebqya}3G&H|aVTGo@#(%hA zVuVXVhbDD&ssjqz>Xrb>4K41u4!RP=0iL8P&nJvdRDbuhI5&)M1+ul(my;GgHAUeY?+ z%Gem0o0uEhzg`YFWo0SugWQ>AK>z@J|YW%1i7eINmS?7*O zas40&e1uJ=wX2NsRba_r(8vtDIH}=>bXCj9QEF<##Q3w`e;PBKRMp>&SQ^GJj4Q? zKFqhp%h_9poe^!GJK|ZKW)XNwe9*QHd-fA@BjL#HrSlyG9>guX&HUaB@UdQKqK~nL zsUef+V1ag6xP6f%A7E)J+bt;a&UZTdE;%g*cLz|_7y{co-+xN(5c#Z-R6%JJGm!56 zMUc0fV{JD7<75|2CRMI4q!okBfkIA~S}MHZhIo{7<5ENe1J;#Zmvor=P#7?)4(!3CfMh#ltM;!1E zE+vA6qZ>-_juMm$oLj01*s0oS;l_e!_KJGyewXtC0c*HAU=jfHD3#zU*NM3WXhQs} z4sNS;j<>*&Le3h+&*zVkwMA-1_=6_R2}78;?SN|DZ27sK{UK zg1j-#{uxG8xN8FfB@)?<2`#nhG@jB`hD)>EWk8qw4X$FQu6UDBa&UJ%AO9%{%c5bW zqDyM#{4oj4pi(!UU+V0~I_{p;^KpiGAo(F8)s|z9X#dq#eGS(=^fN>#Drbdgtzh7E%T12?Xcl2gV+R3^W#E1Z4#MtCpWRGww=mZmt8glNe) zstMLo4M9kixqHWWfJo8^`O;l{KSMeb)kXiYF2RM>BkP*4nNsjlIFXTUQnd#9L|aC% z)#}mOl)qz&2atbZVNY37{C#)?1(;r-Z zb+zz>c?pw!t^b7SJ@3PTg+k65`1HOC0JwMhqDk0H z%z(Wj^YD0wUG{{K9xwLL-{EN?OXJCt$&=kK>N0knHmhtIVCTd4jof6#osW6P)mp|> z?%Tv1Ll5@)H~EBb`Th4+#5+eHLLi<@&pudhDK~-75Do;7A@DXuOnOTSQ6qrXBSbed3^rW%*#OV0*ZdP&eMftN5T-7UOk0$puY-zewNoWcF;x5t57n43@A@i-YfLdW6cF*<52T zo~vP5^_z^ z>6Y7xigo$(oJ(mWYRxb07!0?--yAJwl33M&kx;bzq3)Z#4-G6)FyW5tntD><-#D*#cQf=zkK@>gZvlbP#ndKkQQ-@3ke!?027(bRH57Dgpo=WgcON1*RP7q8Z zjx^{=P{LnvA;13nR6400uWhp-FEH8m?jGP76>)}rC*bPW|uBZ$#-Fo9F#FuDDaN*;~!cExbV zLO@X(cuO&&1qsA#w+Z4Psjm!q92S5sHSa#Z>;5j@95*Ax0#$BW@ng!V<=wJay39dW z-i0*x$EDOdNIe&6OZkD_Pux?H7xPmjK9$M^(Fvw2I)tR9P7;!ivwVbw(`}r9GKEOH z8@Sx@pFaiEc=qz(N!h*5Sp5&wnyD28Zqta8$OY85A=GF5cEr=_TQro+N`$Xb;uLAk z>b^50sA>yPg?cTwQ|P#mu*I*+!m%8B$0@UM-{?7R_G=yOO2O7SepYUK@-;jYlQbi( z`|>m(f(%9#(kE)j||^3;|6KAu=j4 zb&EAFiP||!9GkWs8YbZ9tLa;Ren@3Ap4~>dWCxN+IJGELXdMegsiHTY4`bvheyziO ze?3U=z76;mk)zYk5+?j3zlp~8=rR98ULjW}TdE`K_k-+{;>RE%P4OnFFGyyQ4Q?`X zdNPOC0Rs1rfyYZg4+>6GMMVWpL=_22VOsf4RAw@2T0cyH2!-Zz8A{A1+A1PquJDqu zn)LdPWQDUn^U-MWJ!xWFV^=A5*1d(D;NP5cOVqjZ$VO{kS`4OKVKkLKQK6?CsL-Mz zh4ZDp?f^D(yAfC%Aj%3@7PKR9->a4rs9}^Vsml3A->b%ncuhzl2l=t0x%qOzB;Gt^ z;^$~-1zx+=IE%a{x4m@LjnA{Z0tCzt_#`}H%li90;pO_&>+;WP*{d?1%ZpRTBHw-v zKLW4+QvR=(tX`M@?w9iaxN`Lxn$~OBV7nT_l4qFOkAK1%SRejT*VnMWp5cEDJNA4_?4P!KeWL$0R;R;aP~tPz zUv^aRJNd1e&mirUDWNZ5U*i4^_Pec*zrbEvZ0dgo`|U=^YX*uAo_49v$W-+* zjx*2UP!*vv`*Zkr;{gD_s+NB-crj=O@vjDbtzo`Ko9=+Eed$)7`8a=cgRuJZUyS>! z()k)~`Zs8Q3OlcHE?t}Pg`aU|!MDR+?D|)u{#~ozsiS}4yx0}$Ir6tl{{FT9w_53I z8XvwVXbL>T#|`{h-EsIQ;+Obq8ow%*uW3B|7c~9{{qi*#N%<9!7n|gr{z-;0QFB)4 zUu1q&9AA?ec)rE?zuDw})E{5dA>pNKE_jCTem>#)G9o&=Y8F1)_*E8r&4BHB(Encra0gqe8{7@Za9?tK{?=f9Jo( z|4V>+jejKpOZbBKwD2eX?t>E0zwv+7kzV7+QT^}r|E;R@n#LUaeE$n9G6>!uUdbtj zMfXn{ztd{|qVX~u)>FTx@uI4{F2BYI{Ev0U+u3r%mx1Z8b;sY${5yT;b@^+*l>b`o zd5y(GBjEeuLdKJ*MlV=@VgHQ<0r*uD`U~r25X7YUcU@j%{byD1tPs7%d|iZ=UD*XL= 9: + return 0 + if classLevel < 4: + resistanceBonus = 5 + elif classLevel < 7: + resistanceBonus = 10 + else: + resistanceBonus = 15 + evt_obj.damage_packet.add_damage_resistance(resistanceBonus, D20DT_ELECTRICITY, 1010) #ID 1010 in damage.mes is Electricity + return 0 + +electricityResistance = PythonModifier("Stormlord Resistance to Electricity Feat", 0) +electricityResistance.MapToFeat("Stormlord Resistance to Electricity") +electricityResistance.AddHook(ET_OnTakingDamage , EK_NONE, featResistanceToElectricity, ()) + +def featShockWeapon(attachee, args, evt_obj): + usedWeapon = evt_obj.attack_packet.get_weapon_used() + weaponList = stormlordWeapons() + if not usedWeapon.obj_get_int(obj_f_weapon_type) in weaponList: + return 0 + classLevel = attachee.stat_level_get(classEnum) + bonusDice = dice_new('1d6') + evt_obj.damage_packet.add_dice(bonusDice, D20DT_ELECTRICITY, 100) #ID 100 in damage.mes is Weapon + if classLevel >= 8: + if evt_obj.attack_packet.get_flags() & D20CAF_CRITICAL: + bonusDiceBurst = dice_new('1d10') + critMultiplier = evt_obj.damage_packet.critical_multiplier + if critMultiplier > 3: #unsure if needed; D20SRD description ends at x4 + critMultiplier = 3 + bonusDiceBurst.number = critMultiplier + print "bonusDiceBurst: {}".format(bonusDiceBurst) + evt_obj.damage_packet.add_dice(bonusDiceBurst, D20DT_ELECTRICITY, 100) #ID 100 in damage.mes is Weapon + return 0 + +shockWeapon = PythonModifier("Stormlord Shock Weapon Feat", 0) +shockWeapon.MapToFeat("Stormlord Shock Weapon") +shockWeapon.AddHook(ET_OnDealingDamage, EK_NONE, featShockWeapon, ()) + +def featThunderingWeaponDamage(attachee, args, evt_obj): + usedWeapon = evt_obj.attack_packet.get_weapon_used() + weaponList = stormlordWeapons() + target = evt_obj.attack_packet.target + if not usedWeapon.obj_get_int(obj_f_weapon_type) in weaponList: + return 0 + print "passed weapon test" + if evt_obj.attack_packet.get_flags() & D20CAF_CRITICAL: + print "passed crit flag" + bonusDice = dice_new('1d8') + critMultiplier = evt_obj.damage_packet.critical_multiplier + print "critMultiplier: {}".format(critMultiplier) + if critMultiplier > 3: #unsure if needed; D20SRD description ends at x4 + critMultiplier = 3 + bonusDice.number = critMultiplier + evt_obj.damage_packet.add_dice(bonusDice, D20DT_SONIC, 100) #ID 1012 in damage.mes is Weapon + # Thundering Weapons deafens on a critical hit on a failed dc save 14 + saveDc = 14 + if target.saving_throw(saveDc, D20_Save_Fortitude, D20STD_F_SPELL_DESCRIPTOR_SONIC, attachee, EK_D20A_STANDARD_ATTACK): + target.float_text_line("Not deafened") + else: + if target.condition_add_with_args('sp-Deafness', 0, 0, 0): + game.particles('sp-Blindness-Deafness', target) + return 0 + +thunderingWeapon = PythonModifier("Stormlord Thundering Weapon Feat", 0) +thunderingWeapon.MapToFeat("Stormlord Thundering Weapon") +thunderingWeapon.AddHook(ET_OnDealingDamage, EK_NONE, featThunderingWeaponDamage, ()) + +def featImmunityToElectricity(attachee, args, evt_obj): + evt_obj.damage_packet.add_mod_factor(0.0, D20DT_ELECTRICITY, 132) #ID 132 in damage.mes is Immunity + return 0 + +electricityImmunity = PythonModifier("Stormlord Immunity to Electricity Feat", 0) +electricityImmunity.MapToFeat("Stormlord Immunity to Electricity") +electricityImmunity.AddHook(ET_OnTakingDamage , EK_NONE, featImmunityToElectricity, ()) + +##### Spell casting + +# configure the spell casting condition to hold the highest Divine classs +def OnAddSpellCasting(attachee, args, evt_obj): + # arg0 holds the divine class + if args.get_arg(0) == 0: + args.set_arg(0, char_class_utils.GetHighestDivineClass(attachee)) + + return 0 + +# Extend caster level for base casting class +def OnGetBaseCasterLevel(attachee, args, evt_obj): + class_extended_1 = args.get_arg(0) + class_code = evt_obj.arg0 + if class_code != class_extended_1: + if evt_obj.arg1 == 0: # arg1 != 0 means you're looking for this particular class's contribution + return 0 + classLvl = attachee.stat_level_get(classEnum) + evt_obj.bonus_list.add(classLvl , 0, 137) + return 0 + + +def OnSpellListExtensionGet(attachee, args, evt_obj): + class_extended_1 = args.get_arg(0) + class_code = evt_obj.arg0 + if class_code != class_extended_1: + if evt_obj.arg1 == 0: # arg1 != 0 means you're looking for this particular class's contribution + return 0 + classLvl = attachee.stat_level_get(classEnum) + evt_obj.bonus_list.add(classLvl, 0, 137) + return 0 + + +def OnInitLevelupSpellSelection(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + class_extended_1 = args.get_arg(0) + classSpecModule.InitSpellSelection(attachee, class_extended_1) + return 0 + + +def OnLevelupSpellsCheckComplete(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + class_extended_1 = args.get_arg(0) + if not classSpecModule.LevelupCheckSpells(attachee, class_extended_1): + evt_obj.bonus_list.add(-1, 0, 137) # denotes incomplete spell selection + return 1 + + +def OnLevelupSpellsFinalize(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + class_extended_1 = args.get_arg(0) + classSpecModule.LevelupSpellsFinalize(attachee, class_extended_1) + return 0 + + +spellCasterSpecObj = PythonModifier(GetSpellCasterConditionName(), 8) +spellCasterSpecObj.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCasting, ()) +spellCasterSpecObj.AddHook(ET_OnGetBaseCasterLevel, EK_NONE, OnGetBaseCasterLevel, ()) +spellCasterSpecObj.AddHook(ET_OnSpellListExtensionGet, EK_NONE, OnSpellListExtensionGet, ()) +spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Activate, OnInitLevelupSpellSelection, ()) +spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Check_Complete, OnLevelupSpellsCheckComplete, ()) +spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Finalize, OnLevelupSpellsFinalize, ()) + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..5c0db37 --- /dev/null +++ b/readme.txt @@ -0,0 +1,6 @@ +Stormlord Prestige Class for ToEE +Temple+ required + +Work in Progress + +What is working?