From 8ea51a94d07c30a0adcb2345d6c37241a3ae7e36 Mon Sep 17 00:00:00 2001 From: Athene Date: Fri, 29 May 2015 23:33:04 +0200 Subject: [PATCH] Patch 3.9 --- .../Fonts/BlackCastleMF.ttf | Bin 0 -> 50176 bytes MikScrollingBattleText/Fonts/FuturaBold.ttf | Bin 0 -> 38308 bytes MikScrollingBattleText/Fonts/exocet.ttf | Bin 0 -> 50844 bytes MikScrollingBattleText/Fonts/mailrays.TTF | Bin 0 -> 62376 bytes MikScrollingBattleText/Fonts/pepsi.ttf | Bin 0 -> 11632 bytes .../Libs/AceLibrary/AceLibrary.lua | 711 +++ .../Libs/AceLocale-2.2/AceLocale-2.2.lua | 537 +++ .../Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua | 4134 +++++++++++++++++ .../MikCombatEventHelper.lua | 371 +- .../MikScrollingBattleText-enUS.lua | 25 + .../MikScrollingBattleText-frFR.lua | 25 + .../MikScrollingBattleText.lua | 406 +- .../MikScrollingBattleText.toc | 11 +- .../MikScrollingBattleText.xml | 129 +- .../MikTableRecyclerObject.lua | 1 + MikScrollingBattleText/localization.lua | 292 +- MikScrollingBattleText/sounds/LowHealth.mp3 | Bin 0 -> 8112 bytes MikScrollingBattleText/sounds/LowMana.mp3 | Bin 0 -> 9956 bytes MikScrollingBattleTextOptions/MSBTOptions.lua | 30 +- MikScrollingBattleTextOptions/MSBTOptions.xml | 16 +- .../MikScrollingBattleTextOptions.toc | 2 +- .../localization_options.lua | 2 + 22 files changed, 6477 insertions(+), 215 deletions(-) create mode 100644 MikScrollingBattleText/Fonts/BlackCastleMF.ttf create mode 100644 MikScrollingBattleText/Fonts/FuturaBold.ttf create mode 100644 MikScrollingBattleText/Fonts/exocet.ttf create mode 100644 MikScrollingBattleText/Fonts/mailrays.TTF create mode 100644 MikScrollingBattleText/Fonts/pepsi.ttf create mode 100644 MikScrollingBattleText/Libs/AceLibrary/AceLibrary.lua create mode 100644 MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua create mode 100644 MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua create mode 100644 MikScrollingBattleText/MikScrollingBattleText-enUS.lua create mode 100644 MikScrollingBattleText/MikScrollingBattleText-frFR.lua create mode 100644 MikScrollingBattleText/sounds/LowHealth.mp3 create mode 100644 MikScrollingBattleText/sounds/LowMana.mp3 diff --git a/MikScrollingBattleText/Fonts/BlackCastleMF.ttf b/MikScrollingBattleText/Fonts/BlackCastleMF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b3489ef3119dbb495891ffc2e4b87594bbbcadee GIT binary patch literal 50176 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 XCD$=?#2zJ9LTgwF#g>Lt;&T2Ubag?Q literal 0 HcmV?d00001 diff --git a/MikScrollingBattleText/Fonts/FuturaBold.ttf b/MikScrollingBattleText/Fonts/FuturaBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..576fc07950e014c40ba81c5405b4d8928983fe09 GIT binary patch literal 38308 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%0D_ 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 literal 0 HcmV?d00001 diff --git a/MikScrollingBattleText/Fonts/exocet.ttf b/MikScrollingBattleText/Fonts/exocet.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dcd7a494e6acf7ae3ab6b0c2eb679bc7c2418c85 GIT binary patch literal 50844 zcmeIb2b^S8l|O#&d#~zM&Z)bryQ{l8=Ug+>siwnBcTeg`FbSB*^bEr!a&Q=;h=3r7 z2m%VOq5`6#pg&hx6^!eu>zY9=$3I6M)T2i(x_IQip(}`d-V9e zqg#Hs^ov{;o=Ibm3I%_S?FJe#j|6!LPsvRo7k$?}R%x~9G>uDSt z^)!x+dK$+@J&j|dp2o3JPvcnDbM(m3D~=!7KXY-aVYD&TxpZk)YW%_j`;YHStvtT# z=*)pV7qz6u_FZ&f|KWXmQ@gK7O&vMB>*ASRhf^cFjvwBA{K%0DXq1l7QM!VT(*fE~ zGjuVfr~y|S@!LsD@vjR<<8-0Cf1LK=Y$cxFg|}vKZ4X^UEx0y@I~U1k4&!JquIxss zDVjq0hw=2qczPF(QfU1yynh(?kK^7Ex?ueBBYXB;jBi|yvpsnG;)#8`F1>;#aJY*u zr7MgFQpQ!wV<;^D%<@AQUv$MqsTD^KUwmXgH-6voR8Lz+8z3T!H{V`PhftM^P_>Kj z_6k|Ki}81VzDfIVl%gJL!ysxi8=tS(EBj(kdskok(mwigKGs9+_-G&gE~P%B>WkZ* zZ#88FwOl%$dQz<&Pw$#Zq-S=Hwa)!US*4r}{7w*Mbwv>ZNPOEfV(!NAnK9%4`&AVO z@7FZ^#n2**aq(g0%fL&W&dR2Q!;y6=x~2l_ZK|r+Kp=FxCKRFacvx|1dnQ4{1MLHW zQ~Y1F51hiusR8Qj5R)?>0g^i=XLdcA-LPdzF!K>|%ssngYj?0JSlb;;4~xrYKl7(Q zDPKO-F|2IFw>QuIP?RY%7*kFf%7%o?m35O-ao9Do=@>KS*V;uJHfn1#zoC)K`VAL< zL#TSanhERm8Bw+|5ZJh96E?**`>8-c4DLDg6`XNvr^SqT9$)0v4rYV0wPe>6(p8%f zcH@KXXp!+r^Mm#xjS~2jU*L1kPft(Zgk4EI`Q-F8cK*&9IxfDcOi&qB(wnlwB9+Qk zQDsGWvaB>73x|RMzt8J&I&7M%2&%xo!KsG@U_&Yt5TH}rBScj zsoQNDRcTEj&6cXP+wu*Q*wlVXf_z>(3SI7{PHPJ~xdpWm-L6N|y><0Hy>-2rSUlF< z)z{n8F6w%FGJToe?r1C?iQ1!jUAj6NsT48s`_{&xO`AGIiLb7@HCeZ0cyDF(@=Z%y zMJzhBrepoycZ|0;`_4PZz0ALKsZX?*B$Cl|b=|=J{-$>S=57DzN@}jbq+~h|;r>U8`sh=*$Hj06P>|kJNUw2z$UAm&g?@=>7oh|h>RmoVu=dqJB zOg=B=ux)r?*g)_?)93YP9tQ`k5Ezhs7_p;%y*+*1U9pTvi?HQfpw;$hB%bN1*BLOj z1?S?rJ!50LcaM$j`PuAS$Hm^S?H(K7y?cCY_pB$HsLObsa9P00GBLZwJQGn*rY;d}jmJ)SGIv^zG0rZT`?d00(4-#9(rUUW+acDh z$*!fbp(Qn_{@qyvtz$wvws{K?^ zIGIrL&>Ab0)-aT8fKjuk*9}-@On5~jdOQPksjsWg#ACpYN{nd0$S>l+q>Sh>;KiVe z^L4-y#~J0fPDi!<<_+x~>((CG*tLCmc6<9kSJbO$UfmPf=1JJ2wt(9g?VM=~YufCE ziC`#^2n7?(_0dF0I$e^8D9VP8&LeC0E@>alZr`3AX&vZ{_}l?ijq1MWHdjpd+PwTa zh_`rWu%sl2{ZxIl2Cqjj$|l54`lF;^y;-l&w5$!}MioLasRZLvjumCG z66?;dcvAfM$@0rj{R__<2k@2Dg0Co=s_JBabziAP^@Hd!k-|6DB_3*dvf^?jd3pJh z{FM#DDK1sEVJu#fZ51^&*;-0hrz*?KqG6`3Zl@}$DnM)FAhv#xUmf(95_VxCS^L6q z$e1>7Eb@gsrqx(sTO-G#-Y%kX)UcOlhIpnPhn1oihkA5a;091mTsmQ|iS+bDYV?(% zWKB&nv{EsGItnj9Y+?(6JmX>Mw)tE~n} zE-Q_CbUS9B;i3Lz8Czd85)6249#QqOvke0ww=IGW-!LImMVqV;+Qbm5t?z9U%>rX7 z-W`|YvfAD(GTlRBP+*MdQ61E55QA?}#G@6WU-b6W)u-!0-}*&YU%$}PK2a_(CNsU6 zXvAJFBC)7K2_>9d9*F679-HUcs+~@|9`k3DAtj;Ue<+#t^G#>9?L2$6gKq|wC&PU6 zb2dlJzr66^a(~QWoA+SWc#uDlwSIzoAUpRiFj#+u0kbsg7j}DAC!V{(NtmpQiBY-n zsFB?Y5xay4a0FZgJ(wIC+c_@(qU4+DbK(JUAJtU)fJ)zqqNvT8jotzZC0%d9W4_Fd(ikz(gLZs)XYr z*e!dX2Hw2N}YOHPD2U=<@?Jo*Lg+_`fcJNH1@+$!;PZ}7 z;}H)9Rl84fmT0O|!K%z;9C?b8lN5s;AU6SSr=%6&Nl7X!Q?)t0#B0r|TKW11PhRuX zQ`emQ;CCBaClAELy4Y{)+oukQ8oqkXQy)ymW~N#j&uVS_O>BmtaAIy&99E`)Eqk*~ z2Da4KRaS&UZdZB42^y&SedS58l(vXqrc>DPmeT;yFlJV;l?HvckUO*P&LYTSOsKhm z+Z$XwM593-;Nq|Yvt@p2vi3@o z(JOu{ajEKM4#AlG!4nt+t6s8O;WLeN_kE;~X)P{Nsrtty{+|bLk(N3+_Hnz&4Zem^rRFny-!PuCbkc9?UMfD0H zetT?s{W0Y==rVBc$?9NPZGT|%h5MNRsAA2z-NPS1W2RBVgr4$7YRi@eG{+}$)b^?k zcg4>Gd!o(FDh}mBw6vXW$Yw-GN4AsN+gfWXvGg&gDV(-6Hq_RntK}-moSe$dX^BKK zkFLdLX@*0ghYhHh{hXu@D-1d;3kU2!nk3rh?}e_ozL>DljyM{%8J zk{3qWcwQ+hAaa@FnVpd|5wGmWD-UkiAo1Gl_cl6+wL*J)wu4&G-)Xbw83ce!zS}Fx zPuuO*R_EzWyS2sbr|tDRFu>t%K%!h2bFvyJz}XzUOV# z-1B9%HdPlZugXoo8^tkR2{V@e6sx2tRneMknW(PLrl}<05Bp*&B~^Q+ruw{#Tga%* zP0Kf_+S;V*c})suOicER3ZYvVck$CBYu6sBzJ86qgGo?*c*WR`YttpnhnJ+ESbOBi z+J-fvUZ@Fs^8@Y!D-t!#WT&~0_RW10ojO6)v=MYaozB)!c_JPOR97)}#{D2V)#MQ6 zxoKwJy4>gzv*zWLw$?n&H5V$c%wk{&>#$mF7nv?zyJo_c(WfN-PEUYAb_9}_`zst? z#qQA~-q*doT=Fy%r+yT61-(L)s18q?=2D}Inil)=dlB>tRG%JR?}NjT~`+Jg-Wn$bENH8ieuB$$6o_suefJ)Cb)e30>!S? zmzLE!-JzsCp~mgtR%SP{Fqmhi-za~rY=z8yP;!_(=<8~!!x}3Yi-fSaTH4c% z6<3L$8dax9u@|`JVJq{MZ1{%7qJ9qCJ z-mrJ~ss^pX{nc<;U0+{a`H31eI*m2MhZN zy(8;VwmjhPtFOy&Kex?2t?JOswL*@&Ia_YXaXY}BHKr^5zK*tvSjg?5y0|VX@?$&C zY8L=uf}o<9+*U^qb0;%%-7czR4_hWfDag$@1y6~6nc8~LW=Ejxm^bOL+oP_s*=C2F}b-$v`{&Lk+gQj~2oB=JN`uy%_CKGl0eL_iSF8_e; z)xtuxRVpQ?eq3o&l-Iub&7jSP!J!7Rf~tk$Cj)xYEtV|FE~Va{?k*OYL?d2LdphQ( zI<=~&yIE~gg8>MV;#y2VMvvi_Ux62vQxMl1?0Eqw1$yG9C05i}QkYJgMe&6dCM1X~ zD+DH3$WK@*nLAK|`&K&J^~LKfy~VL~daR@WE$Na#pd{^SuJrjTo8L3BcmASldgHE#{$a-8Ld5hx^=H?tl9Z?s<1Y)!odFm zvV$(B!G7kD8=bA}R@Yy^i`@O2)r6z9bNS?f1Ct}2t@;l?xSUtM+3;)2n$vYNQxMa`8@ zXi_|7E`PNruAH2ieQ-vu4ewWKl`CnQK9pTA*00ZQpvke(pet{B&BAf{kBOnnlRcO@xos~ zv2-d9`R>bY^H4d*J$PxowVT&-H`~m$M9?P|%JkyBRr5qj^#(p?`s#BMJ*-4PjU<*2 z%So1ne6_p+`|#1yoJ_A&)X7DtQmWVAcV9Ea$O% z!rL5FJ{q<{dsq%C6JGkC1#X6|gxjsB2kytgK~;S6^{*PDIeKys^rW87hb%|RGwbUh zqxN}CMy;&WOHtJp(i{m5vH}RUZ6+IUm8qHdnFEUn5?hgRTKm#urq{B}>Q)YJIl=_z zyfs(_rrWYiaB6DY61Bd(Y?6siZ{mtbB3a8s$G0aZ5#? zs;S|jWlMW|8XKxo(MZ7Wc1>oxn<`^Y>R;wped@ZkOP2)IfLdEKIWa!AJloyX-q!4H z5|uom#H4u6jlwI<=I6z8m`|*OGzWuuL)HXHWf95ye4!nr?L~wiR%&LEwil7X8v;J% zDjqf0m@EFkow;GPcq+oslOjKUL<-`sv9PO^Wv22`}mV4P0!vR9Y#2o}YPr-o_rr=g$gW3CDidiW{j46avoJ52AJXtLS zv`iy!%}q`$m{q1&Uvlcjk15X@P|xA{-vH0EbX|5xEMJ}-q3qC-zV_y($_gpI>+fw$ zMLiJdF~KV{>vnf$pZf(kPIkgz-+*gdg zrkt~mxlX~VUFB~WYhU;GFORLaT)|ih_AcD^0pV%`*QqFfe_H_?tynsCivlXDw7q}! z-&u7lsl)wB08nd^TJPrOYztK<;vP4d({;>?X*yYko-I#m=m_p!8AMb5mVyjuNh0JDKfY*4qN2UsD-lD;Ot9Drn1Mwb$9v+G3%CK_E=; zJcP-$-uinwI@tTNbg(y=ma2;Ry2zKhngeAwI2c10Y0yFSFk{qfa&+({fFo6r`777R zrM&q}PWK_166FmN#SHaGP8)K?>}w0K7W2=FX-aq=dPGA1f$Taf^q1wQq5r;F=vB-? z^{;pk$6tC5dW2zrBnSI%_pG`M*!nBuHRI^G{Sw#)70X>%O6kT1}Zr0VblqaJRr$bX4E5a^nYqhDGT9Uxx ztx~HH%<{TzE)wB+IOU_dfEUaDzE2{GgEnWsI(F0R`xlUiic#Mk8 zwNnR9w5BR5Qmx`GQwQEw=tYxyt1~N8ZEtPkwjZ6lPHKEpv>Y>CpBNd*j?!@dvZYIy zIJLJmMZ!L>LmwVm+R@xpm57I+iKKe9tVXK{1zoDMLJ?&q0I;Gut%5F3!puG{qY*1G zMoeJnMPM#euH8V4{WNXxFRuSE1V$2UfeY$CYUXxua1_!f41ej&IJ5!ZB z;pz6Cww9`xmzFNUY7|3&O;EHdSlvm6#$XL%FM&CW^m-=1Vl-$4*r0_qczM>=5T@h| zy$pGZ@&m~h{KWH;$aK=)sZY+Ve6BUBYO^12t*oxDY*mz>JiG{{l>L)id!LsUTsKs< z-U~B)wvPM_tRpu_md8UbsAK$^R;Cq16PWb#LN%)%%vD4V&32HG zNfa}J?C#22Ktg~hO(2JsOdadDSU|RQZ=3E!SF9*+U<=6g-E9*KtRE-ZdTI^J$7D>J zKB6@nKqVf6d}5GZmt7{L1CAtgNMo|xV9axotH*CtQbWKwu=5ZEtIQaoG zU$1NSepM0Cs;R#$KA#ul@i}=tPvTZ9qKClvmftJK116N*qQ-x(wRa8eo4AEFy|b^g z+_@|_j(A;DnBdKVxc_J7eyw(6l=Q+vv`zH&Wi!;$TvMJ51{BfSP+yfQ3wb@@{hZX> z)!Ei+*a^e3M}!Ikqks~CPJyJFFbPqgbwu<@5@Hxk$;pDvsutT)v6#7U{;h7cn`cE( ziKlWZ2woaU;<0;te3u*`rXh#1Uicm_p}$vv$9LG2^gG5m+TJnu&&tox_7*x1tAAW!jH)BBn zwcQF_WESL*LC3*Md1(+XX?Q*nBa-$>_B`1YPaxw z2x*#KX9&G;>#bH8nLKOCe#7z!pFd()%w3&KUd^zRFr8R_gKk2PAI?EfxM%-eNhfV4 z1WR0=+1Zmfm-zwEOa_1aWjCJ`iq{3;8Zccx_hB`tyq2~|JGiY|v)gFP=5?$3o9nB} zeH*4mU`5Ks>v7be?u%`8M|F?pjXwUqsMqeZd7`ivwncHz z<&C}%*IYqGiQ0UzZSI)OCtwErz9(Q=ta|O9=vKBY78*bK1TMP$_TAFn7?!2>fN|01 z3c%Ri_zEn8jR)o1k?o#1-d2NddC}(z3N>o?#EAmDQhtYHq#ZbYL_#5Gl-f_hVoe&ip1E}gMB*S?m&vrqIH2-lthl%F+}k5$a-Pk z%aeE$da)vNzfk8bM9 zr!et+j{IMOF)S}}yPuuA8y4g5g~j-K*v1$Z;~Jb+SW2Y`Xv2t|T7)prf`_72f&rv3 z+arpYIM~ubc%=lp#br-Fy>8thHC}rP4v1_&ez!<1{H7g-p3;UKw(4Lm{`_zD!a1q8 zTcq&Grw`RBU#!I!uM)~e8EzW8g8fw{EEq>6_at_)w_u||}@yy)C&_1#!lC#F9 z63@(ziH|*A#juK@<}oFUa@i_5=OMsdlJgN@ehZa0>s-vxR$z7zu}zP?OZ?#6Gg{#@ zTH!NV;XK(oqZPJJQG8sO=lRT}DrdC9XSBkn)3ftT#U2)Cw8Ce!!e_L?In9q{8It#d zIinTkX@xg)YB{47KBEv&Ml1ZPwZg}tJ@^DPU>oW2>_#&p1;?Xks$wg_TqKI&z6E;W@i8_V z?CdC0OIM6{sO?&^%&ywZxDD3~8(?=OquIsf1ZLpfRGCN#|_VBo>4>NA?=Gn(czn&vZ_<};e+ zd>Fzrn&!VqP4l#=Y4*}N*&5;VWnnj?d*N`27(bct&(d%mw|)X`C%i zZ3V3}T$HUES|4j@p>;-7F({s+dR*$Bj~;z`-OS9oL!$ENQIV+q&zYIoIo1i!b<-1w zm1&9h1eG_<3zR1L4wKhVibNcOXFI~AJrTq9;dop<8jJCq&HC*-px?H%)a8V0DYWWd z54RLf-l`43I2Df@3gSPzr9x*-cQ8}m%Rk}{qn%HS^wHVx*9kE*^Pjb|KS6y;=@;Tk zv716P2EYDrI2)mmPA&>)8e;BfITy zivvZ#Jg6BaW*IX?MEoT@SjC~1)qAfi>czU|tg^p4xX6(etvWh)zfz~#(W(a7+S}+Z zdLGxMZNFNE>m0wBTl!;pT}G#p(CIRvQzD@wxj%Uw(U>LFR$HKELpft+`JbTY^3W_? zAEj?tu5*2i=bxkZ(`QLDd!=9chxgDDX_vKhX?7X)bxAMrI(8FB@XgMgtN4x5!u5?UIO-^FZ z!?ZjPyXWB#^x6D%##{rYbHa!${g;oqwTNX>2g^ssxZCiLF^e(UdVQ2WY`M;uWjy~J zosiHmp6}0Jzn#8KX_Uj!%|0m0f6**ICCgdLQO_*bM-lgtzk4CBUnNJ9@%(eJ;rT4A zVb$2)+$w9IASRu?UB3qPeLy8IJ`KPJ`nC!+kAPZc7SwUxQI&A;_DQ zI-3!KncDMaS!tT&!(JrpR1PU&o(1>jVm{>a{ffk6K&fl7f8*r?sr|-8zZX9>-@BjP z`J^fdkTGZp(X-ggheMNk}3Xzh#!?RVpmF_n zfw;I56Sy4yu5tZ&fgZtigH|!-aMXCloIlF)7hWGlymszc<2rxWc>X#1XG=N!UE})g zA`4s)v}JB5;-!pXwB45-6XWCA6*Q3P>*{2OG}GJ~4!DB@{mVM)3!#}^4%kZd^|DN& zy2_)vJK9^C8*KH?oF#TUhhaXw$Gim{4E!*WB1Gd>(l##VM#EJ;$RTfn7T4sQ-QFvT zfhoSuak)B5cJ3_eFr4<-s;@(u^uee(?`_**xOK42DlFLVDBZcURIuNlv~!ly1-AT_ zp7o4I;bdJdfSDm(P^d%fhb10IMT{fLP(&mW*%FF|;NaxfoQQ^)kA;|XVaVIY!3E0N z_=Ie{)s4v-E-JO6t8?XwuC5g;%A?V8-o-z4u3XuP3tiEQ3ckjC(~h}sioaF1z_NUM zHf30rH`i8{v@|zXmz5yyE`q#bx(@~%dOpajVfZmv91-8FDxYuS;?@&IC|$3&=RS?kD1>yo;V zh<)F+-VyCmc3oGoe{lQtwylT#o=8(y)M1PGQ_EXhm#6$;yMtSI^W2w|R=|1+_`6)J zT9sW*BmGOd+M632DwDCW-#N8%#puZL>_GpLzFxSIH>4^N<&gsrfH4LV4-O#IHl-DI zDb1Ul4zok){8@M&FpQH07;NHij8<8@a20o<4E2z%Lf~ZSM$ilSX)j!D3nv^*%ixrN z-Q@zt&@ylazQr(I zm7b}kj-=R5PL-lPA;{l9F9uSJbkb;d{fzxx{79;r|g${l8(~7Kz5r!P2spI zeZGDzZU>Ax?#p)YjWX^_UvFnaUBK7f-juE?D~X4^m=P)!%mF#Kgq%}?6@hSUg2`JX zx(i~Av2TtC3?yg*@a(MA&B#5lB%JrUlW^uZ^#O*!lw#L2!fi3NL9`6l)b=c^sp@rY@TenYk!Wel#AsDbPft~CnGfT|-kb~v zQw^H}0f7ivz^xg&Q`{`xk8#YgSY_lcQtb%Yl?#Fo*YZ<26H$AyP+gXxD{kIA(7$O@ z|G;KZ)xUXj{{TnZXZm|g8G$^wfevO{L}O#N3AWKG@Q1p+CS3tMg)<#+(};u*F216) zL@kGtcEO;0LBRVwR_5`s(Tb0a5+CK{3cp@UkQReqU*NT?j7ZPXY~E9}fBmL@%*v*x z3lQZEigNa;cY_Xw%EeK!vA=&4A16;e12HYP?=b9__5pWB5W%xmNNf3y_L_9k?;Kp# z)7@5^sw|DWJgOd4DWkNtBJ{GY7VL*;GaJaFY)iO3iA=dBnk{TAVloeM1b?r(`o0Xv zcm>u|GKx7ngZB2I(S}d*LXTz{(hlLKB;OoU_MJVQt*f+EZnWD2A{oxKtn{>G`jZv8 z;W3kQpWV53VozVwvPjd7BO6-lmg!Yt)g7p8DM_}t>-%a}#v6NTW;v7@yTkxCV#}(- zQ`y$#kx-&K(uBs!bqZj_QFJHiu54CJO=VZn1g2fM2qKUQqF=!Og}JRtHkKbBUD94x zS?aMz5Mr^417-AdW8oIpob$bAja3^*#IQs`%>mCGmX;qAoOYVBBFxmnIml)PRkDOG z%%tI_oQpta1_^|}RL*|}0lIQ(qrQUE?dpw|DN_d*_{dkE|Yhjn8HC*uv@x zHH=@U-|sX|wKBDNux7@u)#lxDGrs7`+I@H4xo_W{XJ5TOESTbn@E;IsR#66;J1S@V z>frqN#Bq3)aao zNX&)T&(V5>`DRp<-esBI0$>IWi0r%bDz$sr#LUdZvTil1_NHrlduwZY)I1PQ8UVO+ z;=+cR$;tioo^@eYNqJvwZC|of#==`q|DoO{bxrRT(d^ygvB$EH(<2W)aNk>Qz2&tx zU3=-VqZeLq?m64GZrZqE&8qD1vZXCD?1B-F;@;bCxbE7MC$6~c(n~Hnc;3|V!GR_4 z!2??;{WaY5-bdf@$R^vn)Q8`8wz}D&POp35t=rXY>dmh`svbFbVE^u&=Pk+fcC@ut zr793i-tBUzB2M?d>8>~4aog17it!Qmav?6AN5u?&5f0I(XB=}Fo9~L;g_rs@yXsPU z%!=2KF<#e#NK|8)k%r77(~bEUez6jd7hmn-0DJQU3#7 zgmzo%b0QCd)5TYuHlM@chn1wwVLs$?+Prwk97AG84cWYQT?G8j*(8R_I=t-D5bA3M zzwEW?ihnH_RYZsqk+ptB$0d9VH(eTz{L>*GV*ep;fBy5i2Mb4k$PdAYSTVmapW-kI z8&^>$kLD28FR6Bohx|CI$Fs#<@XNSMS?HGmub@}smjNDB-1Xkg+m!6N=aMq_edR_m ztS01|_P;2f%`k)**I~`6d`XHkCa0K7>X^GmBEu5E>md8!@sbZ98FFrHlKrI%B)x6+( z`sjU?o{*{mKT8hzl8%s~`SoB}w2KD0&{E254fo&Q=-|*~_U8NVZ?Kgq>g*kxjEE}l z&BQ!DuRvTvXJ7!~ey+D(A=;^=bIm zVjkhV7Zqh8M`aQjgb;_UMD@nBK$T_>2as3=K`e6t@P>IUkQaV3fF)o}U?O;)6_{p* z3oxUd zbInuBvJWhXW}ovxoTf*zlSb^j5k?~piC$Zis*Hp=z8XThI&5Nce7L_Gx9VyuqB0sh z7|a@#WBy^`KDDf(9FhNQaJcI(5aX9#yD!43Jj$66=`IrKPUvz4h`8}kAMjo@wMB0? z3*29wH{(@nAA0B^AcG7gllMoz`|i6(uX=@EjaTmM-dS4U%}Q~4Ac%_tX>4%oI%FRySsPpEx=Xbj0GnDJJ0j|4Bb3K zH{ntZUQF=f|Nko8R1jh0*NR8kgE^s=wn36nSC_5VjD#^hQHfy-Ax2b1yaEK&EzAKd zrpvFO@)R&X1=LxmfI6co2n?QE1;G0~YR^S0w!{vIi6;o|8rE>5$JQwT(iFwNjN_RYN@nq_O8(m$4S1A@OYW0@C(6ihWxZL`Am zVyOW!S0R#l7)hg&`0AcLdypVdR^ZeNd-jOI08)wyYMgyh{G)OWqS#yw%|K62wimHu z5$?Z~Q;bkI3xS&&s}bTv(m5O_02&MG)NqHn3rZ>@}MnHxghmeq1z*&E2BMQ zHqp~6l&158r$T6iBmtRj2pX+oGx3iJt)fMDZVGQ|ue!UD<5A#3v!i26hv{i|Se}iOf68iTl zW8L1?RFj&V7#SW|+S^`V84m}%P8v=0IK+SngCgS9d0fRnkrlYq?s5DHh%|siNQl6w zR6LXdTJ9GMpT!#prj1AqO2i%tb!u_D-N_LUF26kLRTU@VCv+lyLP)3~moG9ni1-PJ zfbh{iEoQg75FsIY*=13$&1JX8w7v_zZS$jqQoB8<$Z!jnp$r6OP=g4}(1m~rE=BW1 zhERs8w)C0L1rQ+s&mjVXEoifsYJGMYy#6)(Imh`kWjW1u?*;rLx z8jpaFK_-c8xY{8aUm^S&X~K#$6ULA<#5yvc1R}W)3C=dg*AQqMe-{SVeu)qkam4{R zC@QjhMEWkcpic$w;X)LO_5u_`A$v$sIF7{NV8rKQh$6H?CqgSoc#E3L7zh9yuJ&DU zs821`0TBkz$e zY%G^sfXBaESDkF{kz-?Fgpe0#=OmWJk_&M5C=NT$yLu8?6J9WP&L)-H2zn+N16|di zPpXl6sZsh8eL8=g^;pLB=jqoLy%%5alFvU+bI>?)e7O77Utra=l2$|Gb{1`?f5`3@ zJ9cExp{-la#%gK(+BK_JO_(7Ot3nRix?%mq%CS*HqAvp?HiNfC(vea`7MAi-tf4k- zT&=EBx17CJT~k}5MZ$vvnyo|+C@z@66hzcWnE2`gJR8K6Y3icQq_AGvVa2~4jDNXk z&%K!8%vHgk733L#%@zf+Q-8rafe#u??Da1}j0OjEh$t2n*;%x*CGcrm+DE!(4vJSDN*&%{oQ5 z@f0m}hOB9Z#@)>NXXeXhJ{tnO+)Bfm_U}e}DJy7`A%EyJdH<@tE=SSCf8c>Ncm$ov z{Flr8_m`ek?k_V3o8Zi7pgIrCqnxjnzGWnR`=iWPobk&728 z`HWm&vSj2kK58c9a?x3Hf6!W$^;jKo_W62PG-hZRD~)w@Hr;}ltXsBZw+1#$tsI77 z5QO0yr&mpkX9t&bceFNCn|bJ)G-qvzHnME<8ZGRsT$q$z2A*f73RDvYOW0g)+}y8t?Y80Jty_nOxBW<_ zuUBk1-^Tmw6S+IH{o!bJm*=hSW8rAJQ@JVL>UqRZWxj)fXx;bZR3kGnh4i69QD6T!wv%e8?vGcj7vTC8^1H_M=U~CjmY0LLe!t4)^L0DjzJp6|#?`}?QbrNgoJ%om z&H1aw`t~+@pXEBY%DDa^J$kVVlnOo`vgNj&c1t`X^b=!skcn zr}Sy?2>Zng;u2-(zc4o6C7ZjtHgDS|UMMR=ygM=XQ+#1c*-Sy$IEF>YUTK}0w2pZfty&A{TT z5Esy*e&*JggSl8#KpV8rO8@cZO|9#9GPcW@*3xdckFicD&<}s+rLKb;*ge-lH!1f? zsm_{gi4i-J12=-nKng>SeTYOMmcWsD!Xt@|S+insBg2Rp36rnxn`*E@kofu+?-94+ zi&r5(*u%&VRxL9RFEcE@TUnF~Wg<&df&q`asWDxG`0a?t+@RL0h{LP;Q;@i5CHahD zrhvDQG0fsxG>;M*gwm{Nu$T$B)B=E}8TrFtlmXRXAucl;6Tz&8)h4V?M0op$=j9O_ zAD8kAnDpi|iA_z-%O&>YUc(woCKJ1A@AWfhpukW7RvIe~rZUEg<2HIqdeSVu{uOxH zlArInGI)S+M%a&#Pi6zs>h1ihGhR|8h=@9yQTU+3rg@gz^Usc*(K}H1Y{5cP6 z!nDjvLYA4cC>z}%r}`qZz6EiveS%GEayZ245e}~E$;rGHrANr8V(*!{;6!spb#+BE z%#06C7xbCd6gT?$D=XUG3OA%PurX{MEz!F2un}|zeNL(QUnqA`YNU1bY(efKlvgfy zVT<8yN(@HOTcyv}wr$z%v=yvA~A z_9zG0hNcHfi0x2YB#a92cNDDp=~DU+;Zi24k#@tn zv#BZDOvn>o9S!?DRh*2p7HLSUDw1U-Hp2!H(to$9MuJ)FX);?P2bC4vO%mKz3qWbl zSJZ9~mVd%!n&#zf-u%+iORdPf-_^Y$9icUEe6wLOWD}(d)K+k%YCYbgvKtHwo;6=w~vT# zcczAohKAM2rFVGz710oE)kUg(bX2zNH)z=e`s!e=uTseV=W{z9(ryXn%}DSU3;FEG z`K8sO?{ZQdSiW(9?1gKr{QAlqBK9JEmRn6hs$&{fMkA&Xr_W{g!gz72cTE-ewF4mfUk4^O zK^wf8-h~`rYysH55$1kVlM`c0noP8mrm!?UwPIv=sH?S^Eoy@SH)VR&!KF*uwSn#~ zt);D5;;bGU8f;Zt@+iw`KsafRVV|`)8EGCK3jk$;$6dtq4=^YgwVn>8ySkksEy6E} zDCV?lpvkPXLR|q!!h94~rvW%-do^IcVQvcShpDPqJNxa8qV9*)iGZ6k}vhsema=L6l9!-kP+NS#^+JS&fcMO;a>kBksjZ@VB-`-a&Q=g?02WOkd_ zwJW>3edl@SqB~fhxS}6fVcX|-3GQy+y5%fWedmS`bZ^}>Gm$=OJhEr?&Ad8vLo^-WkH+gzcXv2aLq{u~C%UbaK-WIN=w zD_3&=?MJ3OzoZkbun;(pzK}gf?A)2%)pp*w=WO8an_4-(4Ed(oa@0e`jcr@b-n?Nw zlKx_}jrGGjslBbGsTf&lZK_jip+6oT=x@=R3xebP*qYxdFMak>qs?Mzv(ws}9M$r0d)56YCQnPmn&pstxeh!%t$T#W;4AA(LF?e*%o!fL==I2p+1;J(p{A-- z5~fy82XR_gEHkUCN`o$T#)Bo6T8W4iNPz{dy-hdmC1t)xr!m3Fbkyvg_Y&@cfTg z!8K)D%GgNN;!}49F7Sg|3>PW?LdFm&FM$J(l$Ts8c#1~R-k$BC7NAtx&=xgup7Y8IRu#oniXb_2`Ds-}7VIgQ%e7n4r(N=arc~CV zDT3V@SSIk$_2F);LX9jVFsWy0h4}5U>Gj8yoT{igSXNtA8o0UjKV|N?vtdg#ee45l z=Z8urY}MWfoB7#PU97wcdTP!o<=-fdF>eTaGjSO9Qmr(ZjbpljW~>!Ui#qUGeyk~C zdM-6myP@Y~;w9T;js-szQF|>|Lzw1e(pYTqx8h>?RVPP>6L(5KRBlK(WGvy{^!O76M*|gz5+g@K63AkNdz}3nqG@JGom3o1oR{XTuo#uKH zzh-CJi@4C{beMe^c0b4))3ddkw0MKPq|Czn6A1uU6QD&NtC3YSbOBi+7$=fBgx)mWm*+r+Ef=jvHhH3 zUhxLp;mY#91A*R08|rPZs(Mh7x&FiT6t**FMN@L7vih&WrX%}elm3%lS*9}G6VnZ4}3X4dI5ItW|KeYck8?Eg!Z`z`*% zxv1{fo?pJu%e$J0@zt#`vucMD=&lc0u+4Zz? zaGAX zqH$h^dYmPGBtEa4FZEjUyf9&cl@ExL&qG1K5XT&AjwrztlmHRxI z1UJju)eH7tqA_Pdq6F7cScZ|dlgRcYtD&)+gr3HE50MLvcYU15U5fqF zM4tPIyjK$W_7eGz69w>oFoyk`M4|T(g>fGKJW&MiN1h>yK1LLSzC89Pq6C~hO7Njl zJYR}3%TRuKHBkk=TZ!jWA1120m8cr}`}8)VniWK~_+~xsHQ?Pw4^a~YG0ihXEqz3- z_-#Wy+R>Jd2Z_3TMBU4XdY}>Sd8e`WCWv}b-`=kh_0Ms$kd5UPA zgJ}A4qV?|}+VEDQjrhjKn}{}{t()${{sHWO%jTQ0zYY5{*uRYZCj{ek>k3dJj+(*RDn#~F>X6w!@n%Z-4~jey}zc;+TNa}%Dq3Gcra z-?_l%v9p3gaqPLG>e+>I9(Zhi6 z!#lyeW&OIf9s zZsuR{ODa=W&{6SoI-zW%qjKLtTK@P-+6Vu!OK^T%KF{yQs1NU-#P5W1k`AgaI;!?j zn=(U(mCvG#-{ALA{GP=AW$gb-hq-+DjW6Tg7CNl{BlaM6d>i#Oem{$QsJrqj+MwP~ zGl((8a% z`}mrYpho2=$~;Ot)MtS+z`0yoxNHsm%sb!_P*W687(aj;=$9ev(_Du94)>uI#~8Ov zyu$NYZHCU`awQziUp_Wra{+z_u{Y;o!Emv_0`1!`TysCA@4@!xm*PQ*OTZ`kIqgy<89AoZLT1cPJ--S9j2*;!)a;-|c9_0qncfqXvwCuj_c{cH}nHi(#CHTkd+X zUv9H_2H$uFeT4QFduHJ^ZnHWIxW1l1mw@jNV*Gp$9A*!#6?Nd*zDH+q8)ch+hX+9A zc$@nPIgF$Ee}#r~B+mtRrNM&J4jXa@_*56TJ`dvM`e6SUfSpzd5fCDVeb*s5Ld{Omy-oj%AhmcZg; z8TG?XWRQkHt+KQnF`h;dM{t~0z{YX{9+6YD3ajEZv=-2vhIiKnWIfmf-Pl>MzuW>H z`8Mb}chEU>E~dJjw2OAr9@-16JRdzX1AW>-x_}PRg>;yX08YmM+l%O8x&%7k%jj~t zg07^iz&E`Hu`#cqlXNXzN7vI0bR*qFuce!T8Mn~u=~hHcydCxicOq8oJ@jVSp*{$E zz_-)G^a#C!-bwGK_t1OkG1wqJ0gJsS5yABX^g&p?d&JJ$;S-fxb@Pq;J6z@q6?y^h5dy{VVM8 zeg+)<1^tr#jeZ4hxZfaBG$ZdAJ9J|^c@&U`VswDXu>A!LKhC<6fWVWH_#jD zZh8~lOK+k3=ze-DJp_Nhcfo@2BlIy)%D+LZ$#2j<(s$^)um*gAz7Is1*rcppp^mK{ zSI0&>v3Ftb#@?fB*r;sYsE&=VmbjxD7$n%AfVU)Y2S+%EM#Q*xy1!8T!lvKpa(lc! ze;^nNBaBTvQBqo#EU&0cRaK{JYU}D78k?G1THD$?I=i}idiydNRWEO|Rduant6r&fc)!v|hd%edN4O&I ze$TreeeGYp^Z8pp|KvM}9)IX9H{AHd8^3VV?XSQ4t@nNPmd{*&=RbV?w!3crz-Pbq zrU$mwu@##-~YUWE{e%-+X z7hHJg@I6P49X)>0B^O_M+23A%8PU^XUA1z!O?&SFG4fMXw~ zIngOb#7418TrN(CH!7b|zNzFU1Z6-kw*DpJ*{x>QGMSygqlf)Hu`>S%Robwzb^ z^+ff~>V37J|CIvyHc<-r_Y6u}E;fjrDCspQ>3QXwW=Y{xB9%;~WJyacC6(k$+KZCd zvhcrV6QJap=nx;rzh}iK#i#M_dHnmV_^SEuYvP;YJ6QYjzaLos{fo%``;qt&>hqUP zdmh3VW7_cq#@rV`L2d`_xEmwxK8&$jFygNV1>w=nF{f|F`2QNlhUqqk1v9z{S9cyv!FZsK`HJ4C1H9p1M2Z*P^yEVb{Bxs z9RjVp2h{Eu=p9qLOF-|K+Wjr)-IbttSAp7H4SMxvP`ne8=KUQg&tvqWqykLQm@Yjo zX~F&U9IQ=G(Jb&*(DNAF{|3tQYfun_>U~gBlBYm5-w%5EASfQwzgt14eh)hJN6^9F zfpYx@l^Y1I~-0;bvQ`J z4Cz38VzR-(9dA2eo}zPINXHMJRc(llk8g4@Mj@JlfLAt!zkmn$23{kZ4NbKdXdxoY z^A%%*Ed%PVsz~aNi!P4=2h>8BZ3Y}{4isf<1{_c+G#lUmwCpaN;l$x|!1zVC;bW-$ zOW#**s46Oj=jA4W!B93%o!D%Mg~0vbaJXy;g-;GRII@!k!@s5%hL z>2%v*e?sUeaycQX1LWO!+v$ZN3U@N$gS=^WM0miVSqzFm!U7Zwg9LuUfgZ+dE&~J> zI54#HK(V>KsJny%fa8G$6Ny9=k-P%_}aUGG9W(4(k~Q}^HuwM0Gx zugm4I3%sNix$iRXV zBv5{x;eeOjF7A5?2RDYQvGF)V*Sk?kZVPJf@Zt<3!sT)KAiHNcpz@3FyUqK6gBvIW zHiVnZhuCBT+!z8*o6cLkbtrF^rgD0vtfloFJ0A2Nl2u z9AI*Wt_KdF%?xXo!-q2u(pz}lh*Rv+1zyrlb6?Z#9uF$z@p6;-5F29~SKs6DVgubp zX962MK3(&AFjmn&P&%#^(VCr$Xy+BTz&x^5&{_(mb9DI1& z8w}b#jO>JpaJ6iXU>**DBZ@HKpz#Or0PvPy133WzEN}p{3&^4SgMfpL;Q%BFgfUOy zw$tVHfP@1M_=*=Zm9a^3hDI=21029pSHSCad2!;NVKNE1+{9cSz^bZopfMB}(I-Wxu6EF7(;nTd?oFOmpF;@(V z0OA5aG%geU1x&|BeFg~Jpf={l_?$Z?M<9%WhmJ<8AdQ9!)PRG}%Tt+~;ovjifUc8p zaC?0Kg$Jn3a0uee=W%%hzL4MNG2l?-zR$dm8O8@x@Zwx<+-3MO;2=)}*qnA32o6St zFX*rZd>E_fADr$8DAI<{DcR1i`V=H z96X>lMd1*P7;y0NJROQkIG}VtEQ3)SOcqW*Dqw7q9(#O#fP%*|#;ZGoGr!mE3;M!- zzsD)?lD)`%zj+@sjNk7?5kc;HKE%eO&L>ZU*j#oOu6VqDf5>SM`Y~3~KYkA~+PK|8 zyzP%hbuyA0S63b0}lQG`U-8q8$Nd!X909a$PYteuK|Z5_XFmA z%rJp~&+89_xa;{4n{0qQ4PkTH-ALbqQ4t6`?V$kqL+Bqw=ETI|3E}NPEavbR;DB1W zq5&_)Cl`a;D1zYtZi_*S{$fM{cnmmrL3Pb-J{-a^5Ms=LKIT^7AN(g8@591fw%ZsT zJjer#3PFa0TL&D#Bm{#ImpvS$0N@Y~dL4u*C5*R&@wg)Z9>Gqi2v^JQjt6+0aWO_2 zE}I4b*!U9|Ul_l5Ed;U(0Qf+4&5f}xcTBEGoE$(h7g`0aRKg9iikZ$o-&sA8-f;{k}jbEZdDkY}^3u z#!x7X&8>UDiunAYP}F6QgeVwB|AY|I3zReB1gsJXN028g3I>f@xf4N*OIeIjhRbdP ze%SaEOp!6S;x&*}wAum(9@hmpL=zyyfJ1=!wpgiz1E3rV=$ITC4(<>tfDI@Nh7Rxz zhR~mA3pyp>jRgURfHxQkCXnjDE%1_F{4+&bV8iZC3Y$j3;G;_XmLi8BOtOQ%psR!jGkASi-S3~r+cx7`K+01o^FYyg~i zEo{KSkJ-oEfOQ2pxMQUt#Jb%L5EI4AJd6*Z=iwm30rQmZ4!gP2Fcf@%gBL>}3^<@I zcq8bG<18HT1*4%7I4v4*C~`k+-Ul4QVIXNZ%3aTg*cc8H6~a+$9)}k!8K^@z?$)DW z3L_X-6nQ2X4l%qPE-f|T5Dv>~>7LSX03~rTxQ!wh4&c5Szc2><;4uIm0~I*Xp1A>m z3WLO*C<7q|!Ux?LEQzEC(+kFdKN7;!<@SSl@I+7n{-7VBpwR(-nCfGAWA}hEBybi9 z`a`jBDd6A{U@RO(?nlh~y2llPeM~qKn34C2e+4syjci;CV_a?bZ?!DRf+?%9H+NMdHHtD`4rTb3l%GOf07FxPc+DHKr zkX2DourH!-t$^SHD5wP$L_v8)L4Dmf6eZ{TKXcB#O*ce;_5EJIFYU~kJLjC4XPal9 zd1g6`GsfJAbj&p{XLjEQueiMiKORNyr>D=ZYh3>5m9rS*x8nEGc|B7HSN&Bx2Rm)bs`q!na@N5+CXV)UbG)ey<{GNl~ zWotKFysdA8(}3T9W=wkQf>jr8+;Z0iS1@)D%I{|DH?3F}p4*CN?+)Rar5l!Q+bsRW z@-))8&te;wZCKT@&@jT-8~AOh+q~(bi*k1QpZTUZQ$>$Lk8s?O|YM*Noehxjnl6Q0t3ymLss@~^N)_70Vy69tJ#K9OW> zVEnA{Y#fWl($Y1`2U#Ux`yK8RE=>BQbO$amgclIL&m#OPWrTOIkTjlU`Hz@ETEVjH zhm3P4^Y96*9z~n@X69#KVnKcg<^G0^%wEU4pH*JrzhqgEsFWXPN$F;mmc}cJ)XJLpEGF~cFee|vb+Ym< zSCqe^%ryHG>*CJ6Y+0D`z_GPJtUB-Tda$kXb+{}F7PmuqRop11Q7o{nmaFi}*6;hPd>91p5LT(xR z6!&xdg(=ehLOi6VMrU&F&EF5?6My%LqWxM~fA?8D;Kkn=o-2S62!%!CbD_mOYIaDH zEbDc8T#T}$lXQAnr_<|o_>&~0bOt?g=n>@0Mr7cotk)x(o}_2B`*>QtkE?p0OL!Ld z>CYh3pM<|cmdF-2^+s`*qWtreuQM9y0E z`vkMzC17?C%vQGwvk@198Se-%2x>`?3owJYfD*rSCO~X7;FrOK!UWOP>*)LRw73tL z@r(+UiFhL52G)f?BNcYjxMBt>REt^+@DoUz zj7FV+61eEh2BQJU;{`JkBsZX-cAsz(_d#6sKEw^B8O7fTsOXKtpIJ?r1x6H&zG*O{ zJR{@=)p!A#$>^qT$L=GTO@LXavw)N`L4r~VZW#!ma+83GYBva&Ob`o`kt!1~8}s)G zU4q#JOw{|5jAsod@n;70RXP*a^rvQzzB>wLk!`S;QMwAVPcIwICNIJ42nd*sX2`A; z5X(leUo8{QQp#*Hk?<0P2E7Gkn2ZL%WI=*to$6Na1Ljli3z${dOcs(hvM3<#-I{1-?YQK}wL;wNCXnam~&8iv_qL#fEeV`slFV8(s=vx-(C zVAgUd*P_8}J8_q?)jx~LMzxrU&ZaP6wwi+kv%3h8=`AJ;T9_T=*O>@rK!!hp83eOf zNC^O42!#z0L&zX#R2muuo;dA3o>T8jIub~W_&Wg=us-o;JN549n zTP-270zFaWP!-Tg4zOQm0)%GB1Bd}O;)+rYX21-pnhbW_vI1tS*^bHpGoHxb*PV9% zB$!3BCOXp_^k=0%Dh7XcahC*S^i8wfZUM=tZ!t#!v&|AFn7t(gvsJ+C1jKlUU4Ei$KZlxh z6z-0`X?8dWGw3ywxx}Qi*sVnbv#%788Eh7!vkEgHB+L=%2x+t3W;I%jXu^84*@!YM zHo$DNP-Uc3ES9t1m-RM_(QFfcC!o?OY*n*QyQ?B0vMo-h)uzI1DHSkB31)vBFarcT zG@J_}tG56WAV**mqd+j5jbOG~Kp>+N5ZkSI!RjQKEkx$i?h{VpK47+*EGkq^p^Avk zz`F2fcb=0JkfnB7V+yG=T?-eNNf_5g0M5x_g`b|av~ zPiRXQ@U~mcCcD*z%FrC~?Ah+*Oef*;bbePZ7*! zYr;%0mtv5{f@R17%nrcp0n7#~sA?sSs4#&H^FQrGN1iE zU`E3q4Hc<0U@iU}^ryk>7BJJ@(KoGbx6NU^1f@Mj9cEQj1swWffyQQi?L-EWwhjjHNIR&9HJ- z!75o5tHubdmesL()_`$%6KiHI7%%5oD{Euz7%_IRPK;5;vT5c~~{J%n%`!Ya0!t!3-jg={Okg6&{e zvz_c(b`3_7*Rj2958KD~vjgmUb^|-e4zUlgVRj?Ci5+GiWVf(e89XM1zx$E8ihYuO z0@uZC5#lwBydh`*+s$rfOWDFx9{3o3FJmj&rR)y&VR7#x?4#^ncArS!&h9+rdBz@K zqdUihB$TqRfYy-QPU4s0J*mia~#(#|6#qQDGy_+oo$Nqp{&ES9z+==0- zD**pJDD7ePC_Bnt0(XB6FT|hNyG-G;`8Mfk>3hED=j93f?B}sc(H;d+Q7A zyYOoKhW(cP8E?%hycLQ?^KU7yvj*ig<@1awBg%uy$CP`NyOq1}>rUmv${orSCH?Lz z?>_zRR|wYEcfGz764p#<@mHNsh->1cU-ZKRDO3L*1`j^L9u$;&fDsKp{{JJ+M;WW` zKg#48ga5(#!J(sE*?pAt6n_qFR$j8W<|yOUu~_f5Ub#OuF}8Nu$|JgzxZ=jD{X=!JBW(8I`H1HX#*d5}iWHKohKAZvj*iN~ zD|meW5K365m4K_rs(Tj?>8tx=N96R3!I^_ccJxG!jO!VS#N)BvBTvp4Jo02uBtA5R zrwj#10r8dRhcuXtfZ0%q`zE!N*(d`=4DH`fWzHT<#*aL?e}7~@@X&rAiXRhd5{V~} z$e@jcA(d8Us$x&zk|+T3iSP`<%Ls2Fyp3R4G~S4g zzz1dT1GYXUZyB$L?)E`H`7)S4XExuP^ynhtcA)|I13kS@eN!<|wE`k^Ye zf@oZ2WZRDW6M>?&^xCD3EV)<4AjgTCQ)E=lu@n|xlX)Qf^-b& z80eq!5l*!n#BXZMrIUeVA|n{Aq6dxyjp<~3;jK8xrNF8n}%P`dn7-4EOc4RQNK!v6T~LuJ>GR^Ku>9 znE?p>Na_ZygMj;`qbv=;G6-n^X994<5Jqym8vMQ#;W~s{5UAh&EW*;3r6f( z8}kBRnPruqN(-eOu+@^V#I8C9{S<*X2t*@5G?GU&0z@M~Gy+5;Kr{kGBS16)L?b{n z0z@NuL?b{n0z^^NmSfNc5$4g_g_=6bJfLYEDIyX@CsCvdLWPE)$q{6UaQ8#ZazV5X z-VAB-`+`|-I%B{UQYS4uzhvIl>0^7Qr`ArJvv%o(@U&|bKTsBr1YOma zuZRvbWv8y{96NRDniX>{=&Whz$dm?nN7zvoPn3?lQ5OxDI&D^JC!9adj!6fh)T{u^ z0M2koy4Rm+$wJIOH_R)p8pEG+=*>+7Jsa@6NBKN-$tTf{79WEVtS7pW+&Lh34#=GY za_4~DIUsiq$ejan=YZTfAa{!G^e*~a_=DFQ?GoPcVd3ZPVh0&YY4uY!B=yh zuV(Po48EGdS2Or(24BtKs~LPXgRf@r6{bEZdo%up5h@Ub08`InBV`OlFC?_38HD1U z6`A>~CqzpYtk}bQE?qc({_5_|?xEY~uDu#i(AYuwlJq9%=Eb<61{VDQ?Dj>NQ##6A zD9`|bU})zqAu&=Rr7NUp1ft$G6;kFx%2G&K3n^P6B(*F;7M1nVqj(Cs9S;hjLn~A@ITA)Fbovb;L^Gu( z_~s3}UiWX9>igTxHw-`gZT+mn?nhUA=(5Z1u~gPfUS%&SO;4Gyq`J0$e1G2^{_Xvi zV|QM8<(1!ac1)|QK7Y!ZbWaQ&T)9p+CGIT>8gx&TIWp1e*=wRzJl^=7dG}p=!|hdf z*O$Cldu;XLha87Tjz3a2uA;HOu0dLJ!?iPW6IM@{+R`@2ldc=DnR|EQQzfYzs&`## z=xm!YW%I_A&sSUPZkW;Hs<|+Vw%}*?@(KKVXxTZk+t8K3g3@VyhK#G_I0E(RGGvhY zKx#qMKbl0tCQ5=fEt!^JOOugLkmpGI1_ofqTsN#6^!MwAb$ytE=Pal^${u5nK%{kHLoM>}Sv^gi*oD*%%i8klVw>c-;oD*#hMM0P9 zaAjy20F+vv2dythtq}K{M>3mZ<<0SQ<=mEg|H-$cB$RI3mCfc7`lL= z3mCe9p$izgfT0T*x`3ez7`lL=E03WI7`lL=3mC#cL6HH~Knb9u2%w_~prZ(&qX?j* z2%w_~prZ(&qX?j*2&knPkf48Q1kFGRprZ%?AP}uc2=p;{V_=3;M+%Y18)Rs&0i$T; zTDNIx9CPvBXLlkJLb*aymS7XO`!37 z%$&!h>(PfqNJOkC9#jGfX6n4j8W%J_xdVvV95DGDwl?Dz`Hb!jJL-&8SFIcW33(Xn zF&I~lV}-*WX*W9k>yE)7w}~=CD3cvWs1xnQ25Q^#)V6`zHc;CJYTH0<8>npqwQZob z4b--Q+O|BkZJ@Rd)JCzOHWeEqP<;TEqgfXV`9d?t4Fl>kKxELrLI)lSphRfMhy-F)8le#2#JYnP0R7u6K^t(w?< z-q_Z})&wW{w1IY?k#2&Y3w9Me^aa|fqc(x37kGN}czS`S7kGMsrx$p7fu|REdV!}G zczS`SH;<HTO6wpFPADx>UFC4OiKgr`3Vlx^p&IN!6IeEr4lkhG z#nIIGXKJf@$1j}N((1n6)KD6X4g{ixXh}2>Ntbr`u8wXRzvy!QrM}uR^A@yc6RGiK z#SV9LfvIm2rYpiF$(ru=@o+|QtkU@%e^J^FdE9yoAi}zV+z^l)KyvWHfwW40HBF;a z>i+2&H_~n`9U$h>4H?XH2*lJjqza3g9$k4FsV9fc6rN-`sPe7i_Y4Z6uopnGGxma9I*7w zn7(GlYNU8`PK$YRm>TrZrCk z5&?uXf~Ll7P-E26RkdVGtrPi8L2P=QRC>;`GuUa%(Gz64W zEp+)wIvjmESz#o{8SI`P17wTNiy~OpnRC)02wFbMeH{ zaKx9W^3M)?Ly1a%=8idaRrO6%`v=Di9ScoPj!V_T{A(Qp8_MU6216s?4Mc;ETs(s% ze4Lq;SNXHjJrK-qlDr*dMVbs4)gIA^wqVS+1tZ#m5pBVUwqQhCFrqCO(H4wo3r4gB zBie#7-xiE$3r4gBqi73Zh?LrD(W9J8ks?j#&GVml6d?10Y#X(|A|(jw!BtVq)$t~O zcGB4Oi=SKOXJe;Fi7o?yIlZuyDhDN7u&!B^7*+^}?xx7at-UA`GA3*Z40W z2SK)-1i*vB&#C8uM#*{IMrqrt(C&Us%3gW176920- zMXQ_Kwq%@8tJ90RX$Fo`^$lkD*fKf(*OB|@-}jB#ynp0x7wx+deXPWi%G+q4H^QW; zU^~c>SC*H*5@=*tR|vNt+>h{Cgr^Z+LUF>h@`LxJy)SgK|cwHFWD66kJPS-EGc;u7x}YsUv*k%81{#! z`qEYI7$4S6>R3IwrF~mlSy^jqSy>zZ9P)TU0WL`rhp`nt{P)TU0Bs5eK8Y&45 zm4t>$LPI5?p^|wGl|<`Kg04xSp?V>qjmHsCe3h!9szBl@khlsYt^$dxK;kNpxC$h$ z0*R|Y;;KA}t3cu^z+06kaTQ2hB|5z%if%>Gtz-z)K?brQEfF@P+47{T&{Qh z>{Bw<{63-j#mEmm0(pi4@F;2KHOl@oRSSc8ihotVh z4W>wWaj2(j)&;qS4c#m5pECWXt%Hk4Ub0%Msw@`1eA<*bE%tDkHaMHln>>jMTL(iyS#cnOuSBHS@#$%8Xk`AFa;viTY z1dD@UaS$vHg2h3wI0zO8!QvoTJWsGV2o^^XkTF#z;~-dE5G)RYB|)$x5sZ|&pKSUQ zNhdLV%wNT3H2=z#=!Ab}o8pa&A@fdqQ;66k>hdLV%) z3N0~;t6j9js5(H3qTp!0;3x`?qTnbBj-ucw3XY=SC<>0E;3x`?<_nIZ;3x{lG(Q<# znDxNYbWynAQv!TSfKLhVDFHquz^4TGlmMR+;8Oy8O62*J0G|@z6UG@TpAz6xLhva8 zK83(1G8`$b&KzhwvkKvcb&DGTJQN^AWZEb+c>rzVP$) zy76=MVVXyVc86^{OB#l0a3R^<1;4Eun7e_w8<@L+xf__ffw>!)yMehIn7i|syMehI zm_xo*%-z7;4a}h%y;O3q*2(NG=db^L!YP2q2^pG$Oe`Byyq% zF+h)k=IesJYZ5)3u*#slywqml%<^|}{_^my`yJW4*X_Ok(n#|nzWeSSmxQKleutZK z6F;ytbnQ<{FjYF5rvdb=Waqtq28iKd;3OWn218vrS66TJ`q7Ng@8iZ{Bfp%+_R71o zvjV<#4;y<75=0i6Iy;!3gK~moH1kSV`*E6Q1DFIp!XezbbF=zeu-Zh`*Z9rJ@9T z&Y??51(Sr0z&tTz60Q-|Ck)}GnHa6RSDhyOFPn$<49?3=*xNt8&vMAq+#L(S1swHy z%EQS}W7R-i_2Ub6EL*hi@QTYTYA02;%;_4K+LS8_7T5Upx>}l4ex{Wl^4FwY(5%BJ zd*{rmWS^Tk4At3}cQ*u1*f(m+qTVHh=09Jjn&-Vws>2qt*yPcZus7z%}?>j9sbec+itEt>9#+MIC zJE4w*ul5}Kq9M*6fI#lQg1fQFpb7)c0zFjKxN=@&?XXlHw-}~fx$L#IU6Z@o2gfBm zRo~e=>EnPes{E24#X1K+8&7U_l3{8~m>?1z9T~+su*7qmYC?5nq1(X{vW=-PB>PlN zk%gYlfDCeudJ8d7Ceh?a%U7-*E*drlL($NAm0dmOFWkDnWK!1$_?Jy{N=uTyP00nz zD~iYEgbry`zRoA1UvRSJGzud57j5d?jCg>65x~QJFWQq{wbL|Ep?@ar`aq~yKddhf zb@nwK-Zg92M;aZCAKo#2@>tAFD!<1Ls3WlTD|rveWT~K)YG=@}L9~C;_~&L!F3`3^ z)7zox?a=ggXnH#|y&am~4oz=|rnf`WW4#2;3>uIKAfypAO>c*$w?oqt#-)sWFr@0$ zlqf!g;zKAtgyKUeK7`^!C_aSZLnuCk;zRl3Lnxk1O8Cgs-Zq5dL!$VUX1svDG$TR_ zF*0J9k9LB#Le>RM;3tnCV=3fkMz>*glmbZ+b_et@lA|m~(WIp#c1P{ONu620&2y{E z=5Owrbg;&0ug8&;&-_b!b<6?Q_LTTI-|oGNh$Ic3Q(gt|1!x z7NKr4Ov(@jhUPq}M=47*N>I3^c`PR%CI9O3>k^TY=1C=ftf)T__wO}TOn!>r^vrLw zvo~KkWyzAU3+lRC+ZsOh(w*xSqqA)I2w$3p*ux%Djy>)+>zQ)Oj1S5!G&13ir<1b@_z$Nwcom-rey5Z>XiarYsO? z?5RxfO~Y5*xNPp#*I&AC{Tmc0aDgta7I&8wD{?3Bfpb}(;W}a*)!Z)(QGm7=Kt|h z+pH;1^5!nU;bX%jxpCRc-*Sl%STxaO03oRUjv@!yK>?`m_-^fgn<%i z3MifPk+=+DAHs(a9zggU!dDSqLHHTMUl6p_4zz|jgn<$%9n~QpQ~4i*>WV>i#h|)k zP+c*ot{7BT45}*z)fI#4ise;T45}*z)rAqGs=8uOT|fnzu?oiEDDSkNhGhAHth$2g z#IPUEy;Gz?T}LLhrV?#dz1_dOI+|@+F}`cn`u!{R+~^Nwru2^U2Fgnl;qv-{%4&Y| z%y~1q8=Pgnbrtg>{gYM>@4w~1n(|1=>c!KmO3MP{j8}znGli^FVSet{(gz_a5%v-4 zk;!RFGDDM#s#eWgBPT{Sg4RCJn%4daTKhn2A873Zt$m=i5484y);`eM2U`0;Yi${! z8Hq4L1pe#>d@?F{P%Ot7WlN!Gz)Ynz=AtUem>TXG2-FDS2JuTeX zu%A{{0d^X_kqM{T);U-}=+2Y8AL)Go6zQt45lwW8m8`D@_)kf`}{ERZ6j`m`saSAQoCk~Q5nV*NF z6^$x40T6ll)Hz*Taf8&VdJ`VaWS|)H1Q{#}2sH8OgD_S48lG?BzuWVrkMi}qhb5{H zE4}|H)nHB|&c3Rym`rM|lUx9K?d(>Y(YYCK14E`zh5&{kfMEz= z7y=lE0EQueVF+Lt0vOIW_AruR2w)g|0wruPBm6=;tFr}p?_0sN)C^tG2m?~hgn?bV zX7qUsB?n3+cP!I8p)Bflxema+#Ha6HwrS&veSHgJSH*WYW{#WEK5`a^2TIQoHPnY81%A=oikfLPiHD1~X~ zMFa7ofq2nCyl5a^G!QQuh!+jSiw5FF1JUNO4M+qK(g<1u@uGpylsL6H8&j=~sFo5i zmx0M;c_x>E$z@=28JJuKCYOQ9Wngj{m|O-Xmx0M;c_x&5+86SuJcV$E#4erwNpyF0Rb7frbAdev-1yOoqbOCGeNQnr_T?EXBz z{J`Cx$K4Oy{lMK1-2K4a58VC0-4ERTz}*krv5r|?yXOb)e&CLxKw4T6RU}ZQQ5Cgw zKTr)GCuBn z?4GSVXsB&)TR4|C&h9hJo4u&xf*()oU3|Et$e*dWa&qg%-K3+caPor%e$)udoopAA zA!`6gv=mbh5XlWi#)R6t157*JfC3esBRPY$p=3JIoNnGNk#3PJzT_s%^v|v>HyzM< z!*!iOk0foqdEDmk$SX2WhZap=l1aq8!CX~aMM7o#2`g$1N= z(D()oNQXvBf{B{R+f3`YbxEwAYmrLp7w_?2a?Om9&(G-k@hj54b+>&#VHmbt#rMdV z_2sNgd7RJ1SsfnMue!cSA5&*$0DdHOR$S?~19&=!6*O-R{~78qT2^39 z!cfH_i&6{uk-&~@6Q5i5fmFXO^o=&Rys5O)@TbYW+}S(4{noyPbUKP1b6+n>+tIa; zUhArMq$I`srR^mL*R@^Udj5e+2I{|a=LHkazvDRGo1r|<*J3@83wyT6pLIf1$oi)N zm;|_pS$PwI7J8U5k*CM}1^SL)TFy`p;`8vemCF~^txD*Oi!yg+?9CD%miBS4G%Q~{ zg6%&X^7?126S@wt`cW6jDe-_t|C&C;P)!p@f_Tr0+NQAM+M@btQeb{RU%IwxepPJD zn7Mm((VZKqyi#QwPAZ{28Z_TWLPh>K(yu4eR?rhIU3ADz{8yC^Rd1W)o3^3)ljXZ~ zwu4rh7kpm&FuznrTM}gvY&3UBv-%uzL9>Wz3jUc~(D?k&%vsXgB@0UMgv5->H?bc7 z64;e#w(egzM*<{Injaxi#Zas;KLSTdmaGdJ@scOnXdvf_)QV}=#Py!y<_YcXt{Wn< zQ`S$Mv1`{r&n?E1vi6>IiNyI})l_cp8;V_-?zqfSTvRj=-RBvcxPQrdoqo%z!LFLD zBu&iq7e^~x#XuRfXjGn(#>2JKe{(Rx;H<%H$S>JP3;H1?u|6Ks&Ne%D?1ACk`7i^apiTf z`c(Wl4RbMIw2(H2BCz1WyfsC>e|2>b`YAAxM%x)M77WD{N;Z?9Ldgmq6Nks@pFj9; zxk0v#z3LskZfg7V?@DugVIwb3RF9W1ks?`g9Wy?)ucN|n?5+jBmoS&I%57QvbiFLi zsnvNx->lbhY1}+r0NxyGS7zlIJ_Bo|{_o7EBq6(+B#ZeJNHL$`KRj!yUf(%or`H?w zcEv-I@!>XU)zVw`FW#)<@9aMlb70iHe)biZso^@oA!Rpsxyzhd+qK|$QQ><*=2n7J(q9x^ly5H8}wuPuU{Iy z=EsqnNAsBGu}{peIBC2FaimF({LtHnbfI55g*lDrn=#lwnLp0K;;vTf*xu0olUQWl zheg$wldjd{RHh~Hn|ToA%b_>iuDfTmZBG?YQTSjC9be)eFF1)hcqaKDly09{)JP|UZ!psEvs z&$EWN&M(%$~DlZ?Zz z=I&&XELB$bM>Cw4hs(T;Ra0v!?^w_=R@SXty6^C^ZF;G?equVy<=LGBQ(IakURPX$ zrQp|m%tu%2F>%^=}c z{T)7B1H#B7tt!l3&;yB_N6hyKy1Xg5e7Zw6mp+^E+vQ=S)qBWjXlb5NSNY4fMO#Z< z1GgWN_?_o%)<4Pp_qlRAQ<6NR7qT^0`3-whS`0T_DnI9Q3_rjgVU&}n3@5#jRY68L ztO$(#GFeaVP1&tGgdh#A8CkVPzlPtwM#yTL@@@XOv>JR}KxW9lVy{^)8wnq`@-7JiLyLy%pguLLRSG`HJ+EbTzBy3y-0(U|o!8#^jSCexKug z7-AHEZl=9pxPYUoQA4Iqel93KE2KJB)#aa}+AuU}7@9N;O&W$K4MUTLp-IEgq+w{% zFf^&=wJ{(OKu9BK)>RmqlpH|t2%%baJWCToszoRo6wL$Cc={L&M%4z*;CD(L&SAa3 zu%D=*8-i+*T0Kn+(IQdJ(hy2fdR!lCykV+Q-_=s&koB%xJ$l*fZtl|aF$c@STvyk& zer{{my!DNheERMiFDkwB#p@;M(g_Q9cNkhQNwi&(t}lr^a5%7X=ln$DMN<~&1K4gmZnuX5f(I_EYsS~0B+pgz(<&Yysu~GGpC?0{;I@Zsq#6b?Xy$V2T00W$_J%t>0Vf2Rb=f|qimX6BHXHh zOWwFuJx{_5c`oObN>wAW6soTjs;?BPuN11U6soTjs;?BPuN0~e2bCgdGw!8OeWg%+ z@bIhiN~KVJIHVN=;7X{wljfCZK{pW!5&?Mtu`;6sCIH2DLR7Tl38YFX9?RMc4*%ks z(w3GLJ>z8klC}F*95^V|mQNYqA#-1_yfhvuubNt2!H>=yoY_pk+wv(%5rD^OzV` zVP6IY8|d8mFXom`@2SxZbDVtF5e)2@wN|I!nd_If>v^|3wfvG`Z%6c2y#Z5C*Xejw z_QG2xH*tHTbNc!shwztReVOty-zq(Txu?1Rg1ILk5FiQ21#*o-RREbZ00%-s>jE2o zvAk(+Z~I)2H(bJb+q9A~I%)N^?&dj|cj8ieHaq6X+^c1&>S8-=|4?PFY|^5s7f5pY z5;NyzW9lm^)ipKX2JgZ;IVYaJlki}>i)_W%DS3M`$
    fsQ#n8A6pLT7zYl^+AO7|kNw-vL6v|eg*hl{ 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 i and not string.find(s, file .. "%.lua:%d+:") then + _G.error(message, j + 1) + return + end + end + _G.error(message, 2) + return +end + +local function assert(self, condition, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + if not condition then + if not message then + local stack = debugstack() + local _,_,second = string.find(stack, "\n(.-)\n") + message = "assertion failed! " .. second + end + error(self, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + return + end + return condition +end + +local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5) + if type(num) ~= "number" then + error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num)) + elseif type(kind) ~= "string" then + error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind)) + end + local errored = false + arg = type(arg) + if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then + local _,_,func = string.find(debugstack(), "`argCheck'.-([`<].-['>])") + if not func then + _,_,func = string.find(debugstack(), "([`<].-['>])") + end + if kind5 then + error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg) + elseif kind4 then + error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg) + elseif kind3 then + error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg) + elseif kind2 then + error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg) + else + error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg) + end + end +end + +local function pcall(self, func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 = _G.pcall(func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + if not a1 then + error(self, string.gsub(a2, ".-%.lua:%d-: ", "")) + else + return a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 + end +end + +local recurse = {} +local function addToPositions(t, major) + if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then + rawset(t, recurse, true) + AceLibrary.positions[t] = major + for k,v in pairs(t) do + if type(v) == "table" and not rawget(v, recurse) then + addToPositions(v, major) + end + if type(k) == "table" and not rawget(k, recurse) then + addToPositions(k, major) + end + end + local mt = getmetatable(t) + if mt and not rawget(mt, recurse) then + addToPositions(mt, major) + end + rawset(t, recurse, nil) + end +end + +local function svnRevisionToNumber(text) + if type(text) == "string" then + if string.find(text, "^%$Revision: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$Revision: (%d+) %$$", "%1"))) + elseif string.find(text, "^%$Rev: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$Rev: (%d+) %$$", "%1"))) + elseif string.find(text, "^%$LastChangedRevision: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$LastChangedRevision: (%d+) %$$", "%1"))) + end + elseif type(text) == "number" then + return text + end + return nil +end + +local crawlReplace +do + local recurse = {} + local function func(t, to, from) + if recurse[t] then + return + end + recurse[t] = true + local mt = getmetatable(t) + setmetatable(t, nil) + rawset(t, to, rawget(t, from)) + rawset(t, from, nil) + for k,v in pairs(t) do + if v == from then + t[k] = to + elseif type(v) == "table" then + if not recurse[v] then + func(v, to, from) + end + end + + if type(k) == "table" then + if not recurse[k] then + func(k, to, from) + end + end + end + setmetatable(t, mt) + if mt then + if mt == from then + setmetatable(t, to) + elseif not recurse[mt] then + func(mt, to, from) + end + end + end + function crawlReplace(t, to, from) + func(t, to, from) + for k in pairs(recurse) do + recurse[k] = nil + end + end +end + +-- @function destroyTable +-- @brief remove all the contents of a table +-- @param t table to destroy +local function destroyTable(t) + setmetatable(t, nil) + for k,v in pairs(t) do t[k] = nil end + table.setn(t, 0) +end + +local function isFrame(frame) + return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function" +end + +local new, del +do + local tables = setmetatable({}, {__mode = "k"}) + + function new() + local t = next(tables) + if t then + tables[t] = nil + return t + else + return {} + end + end + + function del(t, depth) + if depth and depth > 0 then + for k,v in pairs(t) do + if type(v) == "table" and not isFrame(v) then + del(v, depth - 1) + end + end + end + destroyTable(t) + tables[t] = true + end +end + +-- @function copyTable +-- @brief Create a shallow copy of a table and return it. +-- @param from The table to copy from +-- @return A shallow copy of the table +local function copyTable(from) + local to = new() + for k,v in pairs(from) do to[k] = v end + table.setn(to, table.getn(from)) + setmetatable(to, getmetatable(from)) + return to +end + +-- @function deepTransfer +-- @brief Fully transfer all data, keeping proper previous table +-- backreferences stable. +-- @param to The table with which data is to be injected into +-- @param from The table whose data will be injected into the first +-- @param saveFields If available, a shallow copy of the basic data is saved +-- in here. +-- @param list The account of table references +-- @param list2 The current status on which tables have been traversed. +local deepTransfer +do + -- @function examine + -- @brief Take account of all the table references to be shared + -- between the to and from tables. + -- @param to The table with which data is to be injected into + -- @param from The table whose data will be injected into the first + -- @param list An account of the table references + local function examine(to, from, list, major) + list[from] = to + for k,v in pairs(from) do + if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then + if from[k] == to[k] then + list[from[k]] = to[k] + elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then + list[from[k]] = from[k] + elseif not list[from[k]] then + examine(to[k], from[k], list, major) + end + end + end + return list + end + + function deepTransfer(to, from, saveFields, major, list, list2) + setmetatable(to, nil) + local createdList + if not list then + createdList = true + list = new() + list2 = new() + examine(to, from, list, major) + end + list2[to] = to + for k,v in pairs(to) do + if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then + if saveFields then + saveFields[k] = v + end + to[k] = nil + elseif v ~= _G then + if saveFields then + saveFields[k] = copyTable(v) + end + end + end + for k in pairs(from) do + if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then + if not list2[to[k]] then + deepTransfer(to[k], from[k], nil, major, list, list2) + end + to[k] = list[to[k]] or list2[to[k]] + else + rawset(to, k, from[k]) + end + end + table.setn(to, table.getn(from)) + setmetatable(to, getmetatable(from)) + local mt = getmetatable(to) + if mt then + if list[mt] then + setmetatable(to, list[mt]) + elseif mt.__index and list[mt.__index] then + mt.__index = list[mt.__index] + end + end + destroyTable(from) + if createdList then + del(list) + del(list2) + end + end +end + +-- @method IsNewVersion +-- @brief Obtain whether the supplied version would be an upgrade to the +-- current version. This allows for bypass code in library +-- declaration. +-- @param major A string representing the major version +-- @param minor An integer or an svn revision string representing the minor version +-- @return whether the supplied version would be newer than what is +-- currently available. +function AceLibrary:IsNewVersion(major, minor) + argCheck(self, major, 2, "string") + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 3, "number") + local data = self.libs[major] + if not data then + return true + end + return data.minor < minor +end + +-- @method HasInstance +-- @brief Returns whether an instance exists. This allows for optional support of a library. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return Whether an instance exists. +function AceLibrary:HasInstance(major, minor) + argCheck(self, major, 2, "string") + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 3, "number") + if not self.libs[major] then + return + end + return self.libs[major].minor == minor + end + return self.libs[major] and true +end + +-- @method GetInstance +-- @brief Returns the library with the given major/minor version. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return The library with the given major/minor version. +function AceLibrary:GetInstance(major, minor) + argCheck(self, major, 2, "string") + + local data = self.libs[major] + if not data then + _G.error(string.format("Cannot find a library instance of %s.", major), 2) + return + end + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 2, "number") + if data.minor ~= minor then + _G.error(string.format("Cannot find a library instance of %s, minor version %d.", major, minor), 2) + return + end + end + return data.instance +end + +-- Syntax sugar. AceLibrary("FooBar-1.0") +AceLibrary_mt.__call = AceLibrary.GetInstance + +local donothing + +local AceEvent + +-- @method Register +-- @brief Registers a new version of a given library. +-- @param newInstance the library to register +-- @param major the major version of the library +-- @param minor the minor version of the library +-- @param activateFunc (optional) A function to be called when the library is +-- fully activated. Takes the arguments +-- (newInstance [, oldInstance, oldDeactivateFunc]). If +-- oldInstance is given, you should probably call +-- oldDeactivateFunc(oldInstance). +-- @param deactivateFunc (optional) A function to be called by a newer library's +-- activateFunc. +-- @param externalFunc (optional) A function to be called whenever a new +-- library is registered. +function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc) + argCheck(self, newInstance, 2, "table") + argCheck(self, major, 3, "string") + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 4, "number") + if math.floor(minor) ~= minor or minor < 0 then + error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor) + end + argCheck(self, activateFunc, 5, "function", "nil") + argCheck(self, deactivateFunc, 6, "function", "nil") + argCheck(self, externalFunc, 7, "function", "nil") + if not deactivateFunc then + if not donothing then + donothing = function() end + end + deactivateFunc = donothing + end + local data = self.libs[major] + if not data then + -- This is new + local instance = copyTable(newInstance) + crawlReplace(instance, instance, newInstance) + destroyTable(newInstance) + if AceLibrary == newInstance then + self = instance + AceLibrary = instance + end + self.libs[major] = { + instance = instance, + minor = minor, + deactivateFunc = deactivateFunc, + externalFunc = externalFunc, + } + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + addToPositions(instance, major) + if activateFunc then + activateFunc(instance, nil, nil) -- no old version, so explicit nil + end + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + externalFunc(instance, k, data.instance) + end + end + end + + for k,data in pairs(self.libs) do + if k ~= major and data.externalFunc then + data.externalFunc(data.instance, major, instance) + end + end + if major == "AceEvent-2.0" then + AceEvent = instance + end + if AceEvent then + AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance) + end + + return instance + end + local instance = data.instance + if minor <= data.minor then + if DEBUG then + -- This one is already obsolete, raise an error. + error(string.format("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end", major, data.minor, minor, major, minor), 2) + return + end + return instance + end + -- This is an update + local oldInstance = new() + + addToPositions(newInstance, major) + local isAceLibrary = (AceLibrary == newInstance) + local old_error, old_assert, old_argCheck, old_pcall + if isAceLibrary then + self = instance + AceLibrary = instance + + old_error = instance.error + old_assert = instance.assert + old_argCheck = instance.argCheck + old_pcall = instance.pcall + + self.error = error + self.assert = assert + self.argCheck = argCheck + self.pcall = pcall + end + deepTransfer(instance, newInstance, oldInstance, major) + crawlReplace(instance, instance, newInstance) + local oldDeactivateFunc = data.deactivateFunc + data.minor = minor + data.deactivateFunc = deactivateFunc + data.externalFunc = externalFunc + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + if isAceLibrary then + for _,v in pairs(self.libs) do + local i = type(v) == "table" and v.instance + if type(i) == "table" then + if not rawget(i, 'error') or i.error == old_error then + rawset(i, 'error', error) + end + if not rawget(i, 'assert') or i.assert == old_assert then + rawset(i, 'assert', assert) + end + if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then + rawset(i, 'argCheck', argCheck) + end + if not rawget(i, 'pcall') or i.pcall == old_pcall then + rawset(i, 'pcall', pcall) + end + end + end + end + if activateFunc then + activateFunc(instance, oldInstance, oldDeactivateFunc) + else + oldDeactivateFunc(oldInstance) + end + del(oldInstance) + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + externalFunc(instance, k, data.instance) + end + end + end + + return instance +end + +local iter +function AceLibrary:IterateLibraries() + if not iter then + local function iter(t, k) + k = next(t, k) + if not k then + return nil + else + return k, t[k].instance + end + end + end + return iter, self.libs, nil +end + +-- @function Activate +-- @brief The activateFunc for AceLibrary itself. Called when +-- AceLibrary properly registers. +-- @param self Reference to AceLibrary +-- @param oldLib (optional) Reference to an old version of AceLibrary +-- @param oldDeactivate (optional) Function to deactivate the old lib +local function activate(self, oldLib, oldDeactivate) + if not self.libs then + if oldLib then + self.libs = oldLib.libs + end + if not self.libs then + self.libs = {} + end + end + if not self.positions then + if oldLib then + self.positions = oldLib.positions + end + if not self.positions then + self.positions = setmetatable({}, { __mode = "k" }) + end + end + + -- Expose the library in the global environment + _G[ACELIBRARY_MAJOR] = self + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +if not previous then + previous = AceLibrary +end +if not previous.libs then + previous.libs = {} +end +AceLibrary.libs = previous.libs +if not previous.positions then + previous.positions = setmetatable({}, { __mode = "k" }) +end +AceLibrary.positions = previous.positions +AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate) diff --git a/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua b/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua new file mode 100644 index 0000000..c18076a --- /dev/null +++ b/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua @@ -0,0 +1,537 @@ +--[[ +Name: AceLocale-2.2 +Revision: $Rev: 15291 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceLocale-2.2 +SVN: http://svn.wowace.com/root/trunk/Ace2/AceLocale-2.2 +Description: Localization library for addons to use to handle proper + localization and internationalization. +Dependencies: AceLibrary +]] + +local MAJOR_VERSION = "AceLocale-2.2" +local MINOR_VERSION = "$Revision: 15291 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local AceLocale = {} + +local DEFAULT_LOCALE = "enUS" +local _G = getfenv(0) + +local BASE_TRANSLATIONS, DEBUGGING, TRANSLATIONS, BASE_LOCALE, TRANSLATION_TABLES, REVERSE_TRANSLATIONS, STRICTNESS, DYNAMIC_LOCALES, CURRENT_LOCALE, NAME + +local rawget = rawget +local rawset = rawset +local type = type + +local newRegistries = {} +local scheduleClear + +local lastSelf +local __index = function(self, key) + lastSelf = self + local value = (rawget(self, TRANSLATIONS) or AceLocale.prototype)[key] + rawset(self, key, value) + return value +end + +local __newindex = function(self, k, v) + if type(v) ~= "function" and type(k) ~= "table" then + AceLocale.error(self, "Cannot change the values of an AceLocale instance.") + end + rawset(self, k, v) +end + +local __tostring = function(self) + if type(rawget(self, 'GetLibraryVersion')) == "function" then + return self:GetLibraryVersion() + else + return "AceLocale(" .. self[NAME] .. ")" + end +end + +local function clearCache(self) + if not rawget(self, BASE_TRANSLATIONS) then + return + end + + local cache = self[BASE_TRANSLATIONS] + rawset(self, REVERSE_TRANSLATIONS, nil) + + for k in pairs(self) do + if rawget(cache, k) ~= nil then + self[k] = nil + end + end + rawset(self, 'tmp', true) + self.tmp = nil +end + +local function refixInstance(instance) + if getmetatable(instance) then + setmetatable(instance, nil) + end + local translations = instance[TRANSLATIONS] + if translations then + if getmetatable(translations) then + setmetatable(translations, nil) + end + local baseTranslations = instance[BASE_TRANSLATIONS] + if getmetatable(baseTranslations) then + setmetatable(baseTranslations, nil) + end + if translations == baseTranslations or instance[STRICTNESS] then + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring + }) + + setmetatable(translations, { + __index = AceLocale.prototype + }) + else + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring + }) + + setmetatable(translations, { + __index = baseTranslations, + }) + + setmetatable(baseTranslations, { + __index = AceLocale.prototype, + }) + end + else + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring, + }) + end + clearCache(instance) + newRegistries[instance] = true + scheduleClear() + return instance +end + +function AceLocale:new(name) + self:argCheck(name, 2, "string") + + if self.registry[name] and type(rawget(self.registry[name], 'GetLibraryVersion')) ~= "function" then + return self.registry[name] + end + + AceLocale.registry[name] = refixInstance({ + [STRICTNESS] = false, + [NAME] = name, + }) + newRegistries[AceLocale.registry[name]] = true + return AceLocale.registry[name] +end + +AceLocale.prototype = { class = AceLocale } + +function AceLocale.prototype:EnableDebugging() + if rawget(self, BASE_TRANSLATIONS) then + AceLocale.error(self, "Cannot enable debugging after a translation has been registered.") + end + rawset(self, DEBUGGING, true) +end + +function AceLocale.prototype:EnableDynamicLocales(override) + AceLocale.argCheck(self, override, 2, "boolean", "nil") + if not override and rawget(self, BASE_TRANSLATIONS) then + AceLocale.error(self, "Cannot enable dynamic locales after a translation has been registered.") + end + if not rawget(self, DYNAMIC_LOCALES) then + rawset(self, DYNAMIC_LOCALES, true) + if rawget(self, BASE_LOCALE) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + self[TRANSLATION_TABLES][self[BASE_LOCALE]] = self[BASE_TRANSLATIONS] + self[TRANSLATION_TABLES][self[CURRENT_LOCALE]] = self[TRANSLATIONS] + end + end +end + +function AceLocale.prototype:RegisterTranslations(locale, func) + AceLocale.argCheck(self, locale, 2, "string") + AceLocale.argCheck(self, func, 3, "function") + + if locale == rawget(self, BASE_LOCALE) then + AceLocale.error(self, "Cannot provide the same locale more than once. %q provided twice.", locale) + end + + if rawget(self, BASE_TRANSLATIONS) and GetLocale() ~= locale then + if rawget(self, DEBUGGING) or rawget(self, DYNAMIC_LOCALES) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + if self[TRANSLATION_TABLES][locale] then + AceLocale.error(self, "Cannot provide the same locale more than once. %q provided twice.", locale) + end + local t = func() + func = nil + if type(t) ~= "table" then + AceLocale.error(self, "Bad argument #3 to `RegisterTranslations'. function did not return a table. (expected table, got %s)", type(t)) + end + self[TRANSLATION_TABLES][locale] = t + t = nil + end + func = nil + return + end + local t = func() + func = nil + if type(t) ~= "table" then + AceLocale.error(self, "Bad argument #3 to `RegisterTranslations'. function did not return a table. (expected table, got %s)", type(t)) + end + + rawset(self, TRANSLATIONS, t) + if not rawget(self, BASE_TRANSLATIONS) then + rawset(self, BASE_TRANSLATIONS, t) + rawset(self, BASE_LOCALE, locale) + for key,value in pairs(t) do + if value == true then + t[key] = key + end + end + else + for key, value in pairs(self[TRANSLATIONS]) do + if not rawget(self[BASE_TRANSLATIONS], key) then + AceLocale.error(self, "Improper translation exists. %q is likely misspelled for locale %s.", key, locale) + end + if value == true then + AceLocale.error(self, "Can only accept true as a value on the base locale. %q is the base locale, %q is not.", rawget(self, BASE_LOCALE), locale) + end + end + end + rawset(self, CURRENT_LOCALE, locale) + refixInstance(self) + if rawget(self, DEBUGGING) or rawget(self, DYNAMIC_LOCALES) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + self[TRANSLATION_TABLES][locale] = t + end + t = nil +end + +function AceLocale.prototype:SetLocale(locale) + AceLocale.argCheck(self, locale, 2, "string", "boolean") + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `SetLocale' without first calling `EnableDynamicLocales'.") + end + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `SetLocale' without first calling `RegisterTranslations'.") + end + if locale == true then + locale = GetLocale() + if not self[TRANSLATION_TABLES][locale] then + locale = self[BASE_LOCALE] + end + end + + if self[CURRENT_LOCALE] == locale then + return + end + + if not self[TRANSLATION_TABLES][locale] then + AceLocale.error(self, "Locale %q not registered.", locale) + end + + self[TRANSLATIONS] = self[TRANSLATION_TABLES][locale] + self[CURRENT_LOCALE] = locale + refixInstance(self) +end + +function AceLocale.prototype:GetLocale() + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `GetLocale' without first calling `RegisterTranslations'.") + end + return self[CURRENT_LOCALE] +end + +local function iter(t, position) + return (next(t, position)) +end + +function AceLocale.prototype:IterateAvailableLocales() + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `IterateAvailableLocales' without first calling `EnableDynamicLocales'.") + end + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `IterateAvailableLocales' without first calling `RegisterTranslations'.") + end + return iter, self[TRANSLATION_TABLES], nil +end + +function AceLocale.prototype:HasLocale(locale) + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `HasLocale' without first calling `EnableDynamicLocales'.") + end + AceLocale.argCheck(self, locale, 2, "string") + return rawget(self, TRANSLATION_TABLES) and self[TRANSLATION_TABLES][locale] ~= nil +end + +function AceLocale.prototype:SetStrictness(strict) + AceLocale.argCheck(self, strict, 2, "boolean") + local mt = getmetatable(self) + if not mt then + AceLocale.error(self, "Cannot call `SetStrictness' without a metatable.") + end + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered.") + end + rawset(self, STRICTNESS, strict) + refixInstance(self) +end + +local function initReverse(self) + rawset(self, REVERSE_TRANSLATIONS, {}) + local alpha = self[TRANSLATIONS] + local bravo = self[REVERSE_TRANSLATIONS] + for base, localized in pairs(alpha) do + bravo[localized] = base + end +end + +function AceLocale.prototype:GetTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + return self[text] +end + +function AceLocale.prototype:GetStrictTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + local value = rawget(x, text) + if value == nil then + AceLocale.error(self, "Translation %q does not exist for locale %s", text, self[CURRENT_LOCALE]) + end + return value +end + +function AceLocale.prototype:GetReverseTranslation(text) + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + local translation = x[text] + if not translation then + AceLocale.error(self, "Reverse translation for %q does not exist", text) + end + return translation +end + +function AceLocale.prototype:GetIterator() + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + return next, x, nil +end + +function AceLocale.prototype:GetReverseIterator() + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + return next, x, nil +end + +function AceLocale.prototype:HasTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + return rawget(x, text) and true +end + +function AceLocale.prototype:HasReverseTranslation(text) + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + return x[text] and true +end + +function AceLocale.prototype:Debug() + if not rawget(self, DEBUGGING) then + return + end + local words = {} + local locales = {"enUS", "deDE", "frFR", "koKR", "zhCN", "zhTW", "esES"} + local localizations = {} + DEFAULT_CHAT_FRAME:AddMessage("--- AceLocale Debug ---") + for _,locale in ipairs(locales) do + if not self[TRANSLATION_TABLES][locale] then + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q not found", locale)) + else + localizations[locale] = self[TRANSLATION_TABLES][locale] + end + end + local localeDebug = {} + for locale, localization in pairs(localizations) do + localeDebug[locale] = {} + for word in pairs(localization) do + if type(localization[word]) == "table" then + if type(words[word]) ~= "table" then + words[word] = {} + end + for bit in pairs(localization[word]) do + if type(localization[word][bit]) == "string" then + words[word][bit] = true + end + end + elseif type(localization[word]) == "string" then + words[word] = true + end + end + end + for word in pairs(words) do + if type(words[word]) == "table" then + for bit in pairs(words[word]) do + for locale, localization in pairs(localizations) do + if not rawget(localization, word) or not localization[word][bit] then + localeDebug[locale][word .. "::" .. bit] = true + end + end + end + else + for locale, localization in pairs(localizations) do + if not rawget(localization, word) then + localeDebug[locale][word] = true + end + end + end + end + for locale, t in pairs(localeDebug) do + if not next(t) then + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q complete", locale)) + else + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q missing:", locale)) + for word in pairs(t) do + DEFAULT_CHAT_FRAME:AddMessage(string.format(" %q", word)) + end + end + end + DEFAULT_CHAT_FRAME:AddMessage("--- End AceLocale Debug ---") +end + +setmetatable(AceLocale.prototype, { + __index = function(self, k) + if type(k) ~= "table" and k ~= 0 and k ~= "GetLibraryVersion" and k ~= "error" and k ~= "assert" and k ~= "argCheck" and k ~= "pcall" then -- HACK: remove "GetLibraryVersion" and such later. + AceLocale.error(lastSelf or self, "Translation %q does not exist.", k) + end + return nil + end +}) + +local function activate(self, oldLib, oldDeactivate) + AceLocale = self + + self.frame = oldLib and oldLib.frame or CreateFrame("Frame") + self.registry = oldLib and oldLib.registry or {} + self.BASE_TRANSLATIONS = oldLib and oldLib.BASE_TRANSLATIONS or {} + self.DEBUGGING = oldLib and oldLib.DEBUGGING or {} + self.TRANSLATIONS = oldLib and oldLib.TRANSLATIONS or {} + self.BASE_LOCALE = oldLib and oldLib.BASE_LOCALE or {} + self.TRANSLATION_TABLES = oldLib and oldLib.TRANSLATION_TABLES or {} + self.REVERSE_TRANSLATIONS = oldLib and oldLib.REVERSE_TRANSLATIONS or {} + self.STRICTNESS = oldLib and oldLib.STRICTNESS or {} + self.NAME = oldLib and oldLib.NAME or {} + self.DYNAMIC_LOCALES = oldLib and oldLib.DYNAMIC_LOCALES or {} + self.CURRENT_LOCALE = oldLib and oldLib.CURRENT_LOCALE or {} + + BASE_TRANSLATIONS = self.BASE_TRANSLATIONS + DEBUGGING = self.DEBUGGING + TRANSLATIONS = self.TRANSLATIONS + BASE_LOCALE = self.BASE_LOCALE + TRANSLATION_TABLES = self.TRANSLATION_TABLES + REVERSE_TRANSLATIONS = self.REVERSE_TRANSLATIONS + STRICTNESS = self.STRICTNESS + NAME = self.NAME + DYNAMIC_LOCALES = self.DYNAMIC_LOCALES + CURRENT_LOCALE = self.CURRENT_LOCALE + + + local GetTime = GetTime + local timeUntilClear = GetTime() + 5 + scheduleClear = function() + if next(newRegistries) then + self.frame:Show() + timeUntilClear = GetTime() + 5 + end + end + + if not self.registry then + self.registry = {} + else + for name, instance in pairs(self.registry) do + local name = name + local mt = getmetatable(instance) + setmetatable(instance, nil) + instance[NAME] = name + local strict + if instance[STRICTNESS] ~= nil then + strict = instance[STRICTNESS] + elseif instance[TRANSLATIONS] ~= instance[BASE_TRANSLATIONS] then + if getmetatable(instance[TRANSLATIONS]).__index == oldLib.prototype then + strict = true + end + end + instance[STRICTNESS] = strict and true or false + refixInstance(instance) + end + end + + self.frame:SetScript("OnEvent", scheduleClear) + self.frame:SetScript("OnUpdate", function() -- (this, elapsed) + if timeUntilClear - GetTime() <= 0 then + self.frame:Hide() + for k in pairs(newRegistries) do + clearCache(k) + newRegistries[k] = nil + k = nil + end + end + end) + self.frame:UnregisterAllEvents() + self.frame:RegisterEvent("ADDON_LOADED") + self.frame:RegisterEvent("PLAYER_ENTERING_WORLD") + self.frame:Show() + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(AceLocale, MAJOR_VERSION, MINOR_VERSION, activate) diff --git a/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua b/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua new file mode 100644 index 0000000..7d9d2ca --- /dev/null +++ b/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua @@ -0,0 +1,4134 @@ +--[[ +Name: Babble-Spell-2.2 +Revision: $Rev: 15059 $ +Author(s): ckknight (ckknight@gmail.com) +Website: http://ckknight.wowinterface.com/ +Documentation: http://wiki.wowace.com/index.php/Babble-Spell-2.2 +SVN: http://svn.wowace.com/root/trunk/Babble-2.2/Babble-Spell-2.2 +Description: A library to provide localizations for spells. +Dependencies: AceLibrary, AceLocale-2.2 +]] + +local MAJOR_VERSION = "Babble-Spell-2.2" +local MINOR_VERSION = tonumber(string.sub("$Revision: 15059 $", 12, -3)) + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:HasInstance("AceLocale-2.2") then error(MAJOR_VERSION .. " requires AceLocale-2.2") end + +local _, x = AceLibrary("AceLocale-2.2"):GetLibraryVersion() +MINOR_VERSION = MINOR_VERSION * 100000 + x + +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local BabbleSpell = AceLibrary("AceLocale-2.2"):new(MAJOR_VERSION) + +-- uncomment below for debug information +-- BabbleSpell:EnableDebugging() + +BabbleSpell:RegisterTranslations("enUS", function() + return { + ["Abolish Disease"] = true, + ["Abolish Poison Effect"] = true, + ["Abolish Poison"] = true, + ["Activate MG Turret"] = true, + ["Adrenaline Rush"] = true, + ["Aftermath"] = true, + ["Aggression"] = true, + ["Aimed Shot"] = true, + ["Alchemy"] = true, + ["Ambush"] = true, + ["Amplify Curse"] = true, + ["Amplify Magic"] = true, + ["Ancestral Fortitude"] = true, + ["Ancestral Healing"] = true, + ["Ancestral Knowledge"] = true, + ["Ancestral Spirit"] = true, + ["Anger Management"] = true, + ["Anticipation"] = true, + ["Aquatic Form"] = true, + ["Arcane Brilliance"] = true, + ["Arcane Concentration"] = true, + ["Arcane Explosion"] = true, + ["Arcane Focus"] = true, + ["Arcane Instability"] = true, + ["Arcane Intellect"] = true, + ["Arcane Meditation"] = true, + ["Arcane Mind"] = true, + ["Arcane Missiles"] = true, + ["Arcane Power"] = true, + ["Arcane Resistance"] = true, + ["Arcane Shot"] = true, + ["Arcane Subtlety"] = true, + ["Arctic Reach"] = true, + ["Armorsmith"] = true, + ["Aspect of the Beast"] = true, + ["Aspect of the Cheetah"] = true, + ["Aspect of the Hawk"] = true, + ["Aspect of the Monkey"] = true, + ["Aspect of the Pack"] = true, + ["Aspect of the Wild"] = true, + ["Astral Recall"] = true, + ["Attack"] = true, + ["Attacking"] = true, + ["Auto Shot"] = true, + ["Axe Specialization"] = true, + ["Backstab"] = true, + ["Bane"] = true, + ["Banish"] = true, + ["Barkskin Effect"] = true, + ["Barkskin"] = true, + ["Barrage"] = true, + ["Bash"] = true, + ["Basic Campfire"] = true, + ["Battle Shout"] = true, + ["Battle Stance Passive"] = true, + ["Battle Stance"] = true, + ["Bear Form"] = true, + ["Beast Lore"] = true, + ["Beast Slaying"] = true, + ["Beast Training"] = true, + ["Benediction"] = true, + ["Berserker Rage"] = true, + ["Berserker Stance Passive"] = true, + ["Berserker Stance"] = true, + ["Berserking"] = true, + ["Bestial Discipline"] = true, + ["Bestial Swiftness"] = true, + ["Bestial Wrath"] = true, + ["Bite"] = true, + ["Black Arrow"] = true, + ["Blackout"] = true, + ["Blacksmithing"] = true, + ["Blade Flurry"] = true, + ["Blast Wave"] = true, + ["Blessed Recovery"] = true, + ["Blessing of Freedom"] = true, + ["Blessing of Kings"] = true, + ["Blessing of Light"] = true, + ["Blessing of Might"] = true, + ["Blessing of Protection"] = true, + ["Blessing of Sacrifice"] = true, + ["Blessing of Salvation"] = true, + ["Blessing of Sanctuary"] = true, + ["Blessing of Wisdom"] = true, + ["Blind"] = true, + ["Blinding Powder"] = true, + ["Blink"] = true, + ["Blizzard"] = true, + ["Block"] = true, + ["Blood Craze"] = true, + ["Blood Frenzy"] = true, + ["Blood Fury"] = true, + ["Blood Pact"] = true, + ["Bloodrage"] = true, + ["Bloodthirst"] = true, + ["Booming Voice"] = true, + ["Bow Specialization"] = true, + ["Bows"] = true, + ["Bright Campfire"] = true, + ["Brutal Impact"] = true, + ["Burning Soul"] = true, + ["Call Pet"] = true, + ["Call of Flame"] = true, + ["Call of Thunder"] = true, + ["Camouflage"] = true, + ["Cannibalize"] = true, + ["Cat Form"] = true, + ["Cataclysm"] = true, + ["Chain Heal"] = true, + ["Chain Lightning"] = true, + ["Challenging Roar"] = true, + ["Challenging Shout"] = true, + ["Charge Rage Bonus Effect"] = true, + ["Charge"] = true, + ["Charge Stun"] = true, + ["Cheap Shot"] = true, + ["Chilled"] = true, + ["Claw"] = true, + ["Cleanse"] = true, + ["Clearcasting"] = true, + ["Cleave"] = true, + ["Clever Traps"] = true, + ["Closing"] = true, + ["Cloth"] = true, + ["Coarse Sharpening Stone"] = true, + ["Cobra Reflexes"] = true, + ["Cold Blood"] = true, + ["Cold Snap"] = true, + ["Combat Endurance"] = true, + ["Combustion"] = true, + ["Command"] = true, + ["Concentration Aura"] = true, + ["Concussion Blow"] = true, + ["Concussion"] = true, + ["Concussive Shot"] = true, + ["Cone of Cold"] = true, + ["Conflagrate"] = true, + ["Conjure Food"] = true, + ["Conjure Mana Agate"] = true, + ["Conjure Mana Citrine"] = true, + ["Conjure Mana Jade"] = true, + ["Conjure Mana Ruby"] = true, + ["Conjure Water"] = true, + ["Consecrated Sharpening Stone"] = true, + ["Consecration"] = true, + ["Consume Shadows"] = true, + ["Convection"] = true, + ["Conviction"] = true, + ["Cooking"] = true, + ["Corruption"] = true, + ["Counterattack"] = true, + ["Counterspell"] = true, + ["Counterspell - Silenced"] = true, + ["Cower"] = true, + ["Create Firestone"] = true, + ["Create Firestone (Major)"] = true, + ["Create Firestone (Greater)"] = true, + ["Create Firestone (Lesser)"] = true, + ["Create Healthstone"] = true, + ["Create Healthstone (Major)"] = true, + ["Create Healthstone (Greater)"] = true, + ["Create Healthstone (Lesser)"] = true, + ["Create Healthstone (Minor)"] = true, + ["Create Soulstone"] = true, + ["Create Soulstone (Major)"] = true, + ["Create Soulstone (Greater)"] = true, + ["Create Soulstone (Lesser)"] = true, + ["Create Soulstone (Minor)"] = true, + ["Create Spellstone"] = true, + ["Create Spellstone (Major)"] = true, + ["Create Spellstone (Greater)"] = true, + ["Crippling Poison II"] = true, + ["Crippling Poison"] = true, + ["Critical Mass"] = true, + ["Crossbows"] = true, + ["Cruelty"] = true, + ["Cultivation"] = true, + ["Cure Disease"] = true, + ["Cure Poison"] = true, + ["Curse of Agony"] = true, + ["Curse of Doom Effect"] = true, + ["Curse of Doom"] = true, + ["Curse of Exhaustion"] = true, + ["Curse of Idiocy"] = true, + ["Curse of Recklessness"] = true, + ["Curse of Shadow"] = true, + ["Curse of Tongues"] = true, + ["Curse of Weakness"] = true, + ["Curse of the Elements"] = true, + ["Dagger Specialization"] = true, + ["Daggers"] = true, + ["Dampen Magic"] = true, + ["Dark Pact"] = true, + ["Darkness"] = true, + ["Dash"] = true, + ["Deadly Poison II"] = true, + ["Deadly Poison III"] = true, + ["Deadly Poison IV"] = true, + ["Deadly Poison V"] = true, + ["Deadly Poison"] = true, + ["Death Coil"] = true, + ["Death Wish"] = true, + ["Deep Wounds"] = true, + ["Defense"] = true, + ["Defensive Stance Passive"] = true, + ["Defensive Stance"] = true, + ["Defensive State 2"] = true, + ["Defensive State"] = true, + ["Defiance"] = true, + ["Deflection"] = true, + ["Demon Armor"] = true, + ["Demon Skin"] = true, + ["Demonic Embrace"] = true, + ["Demonic Sacrifice"] = true, + ["Demoralizing Roar"] = true, + ["Demoralizing Shout"] = true, + ["Dense Sharpening Stone"] = true, + ["Desperate Prayer"] = true, + ["Destructive Reach"] = true, + ["Detect Greater Invisibility"] = true, + ["Detect Invisibility"] = true, + ["Detect Lesser Invisibility"] = true, + ["Detect Magic"] = true, + ["Detect Traps"] = true, + ["Detect"] = true, + ["Deterrence"] = true, + ["Devastation"] = true, + ["Devotion Aura"] = true, + ["Devour Magic Effect"] = true, + ["Devour Magic"] = true, + ["Devouring Plague"] = true, + ["Diplomacy"] = true, + ["Dire Bear Form"] = true, + ["Disarm Trap"] = true, + ["Disarm"] = true, + ["Disease Cleansing Totem"] = true, + ["Disenchant"] = true, + ["Disengage"] = true, + ["Dismiss Pet"] = true, + ["Dispel Magic"] = true, + ["Distract"] = true, + ["Distracting Shot"] = true, + ["Dive"] = true, + ["Divine Favor"] = true, + ["Divine Fury"] = true, + ["Divine Intellect"] = true, + ["Divine Intervention"] = true, + ["Divine Protection"] = true, + ["Divine Shield"] = true, + ["Divine Spirit"] = true, + ["Divine Strength"] = true, + ["Dodge"] = true, + ["Dragonscale Leatherworking"] = true, + ["Drain Life"] = true, + ["Drain Mana"] = true, + ["Drain Soul"] = true, + ["Drink"] = true, + ["Dual Wield Specialization"] = true, + ["Dual Wield"] = true, + ["Duel"] = true, + ["Eagle Eye"] = true, + ["Earth Shock"] = true, + ["Earthbind Totem"] = true, + ["Efficiency"] = true, + ["Elemental Focus"] = true, + ["Elemental Fury"] = true, + ["Elemental Leatherworking"] = true, + ["Elemental Mastery"] = true, + ["Elemental Sharpening Stone"] = true, + ["Elune's Grace"] = true, + ["Elusiveness"] = true, + ["Emberstorm"] = true, + ["Enamored Water Spirit"] = true, + ["Enchanting"] = true, + ["Endurance Training"] = true, + ["Endurance"] = true, + ["Engineering Specialization"] = true, + ["Engineering"] = true, + ["Enrage"] = true, + ["Enriched Manna Biscuit"] = true, + ["Enslave Demon"] = true, + ["Entangling Roots"] = true, + ["Entrapment"] = true, + ["Escape Artist"] = true, + ["Evasion"] = true, + ["Eventide"] = true, + ["Eviscerate"] = true, + ["Evocation"] = true, + ["Execute"] = true, + ["Exorcism"] = true, + ["Expansive Mind"] = true, + ["Explosive Trap Effect"] = true, + ["Explosive Trap"] = true, + ["Expose Armor"] = true, + ["Eye for an Eye"] = true, + ["Eye of Kilrogg"] = true, + ["Eyes of the Beast"] = true, + ["Fade"] = true, + ["Faerie Fire"] = true, + ["Faerie Fire (Feral)"] = true, + ["Far Sight"] = true, + ["Fear Ward"] = true, + ["Fear"] = true, + ["Feed Pet"] = true, + ["Feedback"] = true, + ["Feign Death"] = true, + ["Feint"] = true, + ["Fel Concentration"] = true, + ["Fel Domination"] = true, + ["Fel Intellect"] = true, + ["Fel Stamina"] = true, + ["Felfire"] = true, + ["Feline Grace"] = true, + ["Feline Swiftness"] = true, + ["Feral Aggression"] = true, + ["Feral Charge"] = true, + ["Feral Instinct"] = true, + ["Ferocious Bite"] = true, + ["Ferocity"] = true, + ["Fetish"] = true, + ["Find Herbs"] = true, + ["Find Minerals"] = true, + ["Find Treasure"] = true, + ["Fire Blast"] = true, + ["Fire Nova Totem"] = true, + ["Fire Power"] = true, + ["Fire Resistance Aura"] = true, + ["Fire Resistance Totem"] = true, + ["Fire Resistance"] = true, + ["Fire Shield"] = true, + ["Fire Vulnerability"] = true, + ["Fire Ward"] = true, + ["Fireball"] = true, + ["Firebolt"] = true, + ["First Aid"] = true, + ["Fishing Poles"] = true, + ["Fishing"] = true, + ["Fist Weapon Specialization"] = true, + ["Fist Weapons"] = true, + ["Flame Shock"] = true, + ["Flame Throwing"] = true, + ["Flamestrike"] = true, + ["Flamethrower"] = true, + ["Flametongue Totem"] = true, + ["Flametongue Weapon"] = true, + ["Flare"] = true, + ["Flash Heal"] = true, + ["Flash of Light"] = true, + ["Flurry"] = true, + ["Focused Casting"] = true, + ["Food"] = true, + ["Forbearance"] = true, + ["Force of Will"] = true, + ["Freezing Trap Effect"] = true, + ["Freezing Trap"] = true, + ["Frenzied Regeneration"] = true, + ["Frenzy"] = true, + ["Frost Armor"] = true, + ["Frost Channeling"] = true, + ["Frost Nova"] = true, + ["Frost Resistance Aura"] = true, + ["Frost Resistance Totem"] = true, + ["Frost Resistance"] = true, + ["Frost Shock"] = true, + ["Frost Trap"] = true, + ["Frost Trap Aura"] = true, + ["Frost Ward"] = true, + ["Frostbite"] = true, + ["Frostbolt"] = true, + ["Frostbrand Weapon"] = true, + ["Furious Howl"] = true, + ["Furor"] = true, + ["Garrote"] = true, + ["Generic"] = true, + ["Ghost Wolf"] = true, + ["Ghostly Strike"] = true, + ["Gift of Nature"] = true, + ["Gift of the Wild"] = true, + ["Gouge"] = true, + ["Grace of Air Totem"] = true, + ["Great Stamina"] = true, + ["Greater Blessing of Kings"] = true, + ["Greater Blessing of Light"] = true, + ["Greater Blessing of Might"] = true, + ["Greater Blessing of Salvation"] = true, + ["Greater Blessing of Sanctuary"] = true, + ["Greater Blessing of Wisdom"] = true, + ["Greater Heal"] = true, + ["Grim Reach"] = true, + ["Grounding Totem"] = true, + ["Grovel"] = true, + ["Growl"] = true, + ["Guardian's Favor"] = true, + ["Gun Specialization"] = true, + ["Guns"] = true, + ["Hammer of Justice"] = true, + ["Hand of Justice"] = true, + ["Hammer of Wrath"] = true, + ["Hamstring"] = true, + ["Harass"] = true, + ["Hardiness"] = true, + ["Hawk Eye"] = true, + ["Heal"] = true, + ["Healing Focus"] = true, + ["Healing Light"] = true, + ["Healing Stream Totem"] = true, + ["Healing Touch"] = true, + ["Healing Wave"] = true, + ["Healing Way"] = true, + ["Health Funnel"] = true, + ["Heart of the Wild"] = true, + ["Heavy Sharpening Stone"] = true, + ["Hellfire Effect"] = true, + ["Hellfire"] = true, + ["Hemorrhage"] = true, + ["Herb Gathering"] = true, + ["Herbalism"] = true, + ["Heroic Strike"] = true, + ["Hex of Weakness"] = true, + ["Hibernate"] = true, + ["Holy Fire"] = true, + ["Holy Light"] = true, + ["Holy Nova"] = true, + ["Holy Power"] = true, + ["Holy Reach"] = true, + ["Holy Shield"] = true, + ["Holy Shock"] = true, + ["Holy Specialization"] = true, + ["Holy Wrath"] = true, + ["Honorless Target"] = true, + ["Horse Riding"] = true, + ["Howl of Terror"] = true, + ["Humanoid Slaying"] = true, + ["Hunter's Mark"] = true, + ["Hurricane"] = true, + ["Ice Armor"] = true, + ["Ice Barrier"] = true, + ["Ice Block"] = true, + ["Ice Shards"] = true, + ["Ignite"] = true, + ["Illumination"] = true, + ["Immolate"] = true, + ["Immolation Trap Effect"] = true, + ["Immolation Trap"] = true, + ["Impact"] = true, + ["Impale"] = true, + ["Improved Ambush"] = true, + ["Improved Arcane Explosion"] = true, + ["Improved Arcane Missiles"] = true, + ["Improved Arcane Shot"] = true, + ["Improved Aspect of the Hawk"] = true, + ["Improved Aspect of the Monkey"] = true, + ["Improved Backstab"] = true, + ["Improved Battle Shout"] = true, + ["Improved Berserker Rage"] = true, + ["Improved Blessing of Might"] = true, + ["Improved Blessing of Wisdom"] = true, + ["Improved Blizzard"] = true, + ["Improved Bloodrage"] = true, + ["Improved Chain Heal"] = true, + ["Improved Chain Lightning"] = true, + ["Improved Challenging Shout"] = true, + ["Improved Charge"] = true, + ["Improved Cheap Shot"] = true, + ["Improved Cleave"] = true, + ["Improved Concentration Aura"] = true, + ["Improved Concussive Shot"] = true, + ["Improved Cone of Cold"] = true, + ["Improved Corruption"] = true, + ["Improved Counterspell"] = true, + ["Improved Curse of Agony"] = true, + ["Improved Curse of Exhaustion"] = true, + ["Improved Curse of Weakness"] = true, + ["Improved Dampen Magic"] = true, + ["Improved Deadly Poison"] = true, + ["Improved Demoralizing Shout"] = true, + ["Improved Devotion Aura"] = true, + ["Improved Disarm"] = true, + ["Improved Distract"] = true, + ["Improved Drain Life"] = true, + ["Improved Drain Mana"] = true, + ["Improved Drain Soul"] = true, + ["Improved Enrage"] = true, + ["Improved Enslave Demon"] = true, + ["Improved Entangling Roots"] = true, + ["Improved Evasion"] = true, + ["Improved Eviscerate"] = true, + ["Improved Execute"] = true, + ["Improved Expose Armor"] = true, + ["Improved Eyes of the Beast"] = true, + ["Improved Fade"] = true, + ["Improved Feign Death"] = true, + ["Improved Fire Blast"] = true, + ["Improved Fire Nova Totem"] = true, + ["Improved Fire Ward"] = true, + ["Improved Fireball"] = true, + ["Improved Firebolt"] = true, + ["Improved Firestone"] = true, + ["Improved Flamestrike"] = true, + ["Improved Flametongue Weapon"] = true, + ["Improved Flash of Light"] = true, + ["Improved Frost Nova"] = true, + ["Improved Frost Ward"] = true, + ["Improved Frostbolt"] = true, + ["Improved Frostbrand Weapon"] = true, + ["Improved Garrote"] = true, + ["Improved Ghost Wolf"] = true, + ["Improved Gouge"] = true, + ["Improved Grace of Air Totem"] = true, + ["Improved Grounding Totem"] = true, + ["Improved Hammer of Justice"] = true, + ["Improved Hamstring"] = true, + ["Improved Healing Stream Totem"] = true, + ["Improved Healing Touch"] = true, + ["Improved Healing Wave"] = true, + ["Improved Healing"] = true, + ["Improved Health Funnel"] = true, + ["Improved Healthstone"] = true, + ["Improved Heroic Strike"] = true, + ["Improved Hunter's Mark"] = true, + ["Improved Immolate"] = true, + ["Improved Imp"] = true, + ["Improved Inner Fire"] = true, + ["Improved Instant Poison"] = true, + ["Improved Intercept"] = true, + ["Improved Intimidating Shout"] = true, + ["Improved Judgement"] = true, + ["Improved Kick"] = true, + ["Improved Kidney Shot"] = true, + ["Improved Lash of Pain"] = true, + ["Improved Lay on Hands"] = true, + ["Improved Lesser Healing Wave"] = true, + ["Improved Life Tap"] = true, + ["Improved Lightning Bolt"] = true, + ["Improved Lightning Shield"] = true, + ["Improved Magma Totem"] = true, + ["Improved Mana Burn"] = true, + ["Improved Mana Shield"] = true, + ["Improved Mana Spring Totem"] = true, + ["Improved Mark of the Wild"] = true, + ["Improved Mend Pet"] = true, + ["Improved Mind Blast"] = true, + ["Improved Moonfire"] = true, + ["Improved Nature's Grasp"] = true, + ["Improved Overpower"] = true, + ["Improved Power Word: Fortitude"] = true, + ["Improved Power Word: Shield"] = true, + ["Improved Prayer of Healing"] = true, + ["Improved Psychic Scream"] = true, + ["Improved Pummel"] = true, + ["Improved Regrowth"] = true, + ["Improved Reincarnation"] = true, + ["Improved Rejuvenation"] = true, + ["Improved Rend"] = true, + ["Improved Renew"] = true, + ["Improved Retribution Aura"] = true, + ["Improved Revenge"] = true, + ["Improved Revive Pet"] = true, + ["Improved Righteous Fury"] = true, + ["Improved Rockbiter Weapon"] = true, + ["Improved Rupture"] = true, + ["Improved Sap"] = true, + ["Improved Scorch"] = true, + ["Improved Scorpid Sting"] = true, + ["Improved Seal of Righteousness"] = true, + ["Improved Seal of the Crusader"] = true, + ["Improved Searing Pain"] = true, + ["Improved Searing Totem"] = true, + ["Improved Serpent Sting"] = true, + ["Improved Shadow Bolt"] = true, + ["Improved Shadow Word: Pain"] = true, + ["Improved Shield Bash"] = true, + ["Improved Shield Block"] = true, + ["Improved Shield Wall"] = true, + ["Improved Shred"] = true, + ["Improved Sinister Strike"] = true, + ["Improved Slam"] = true, + ["Improved Slice and Dice"] = true, + ["Improved Spellstone"] = true, + ["Improved Sprint"] = true, + ["Improved Starfire"] = true, + ["Improved Stoneclaw Totem"] = true, + ["Improved Stoneskin Totem"] = true, + ["Improved Strength of Earth Totem"] = true, + ["Improved Succubus"] = true, + ["Improved Sunder Armor"] = true, + ["Improved Taunt"] = true, + ["Improved Thorns"] = true, + ["Improved Thunder Clap"] = true, + ["Improved Tranquility"] = true, + ["Improved Vampiric Embrace"] = true, + ["Improved Vanish"] = true, + ["Improved Voidwalker"] = true, + ["Improved Windfury Weapon"] = true, + ["Improved Wing Clip"] = true, + ["Improved Wrath"] = true, + ["Incinerate"] = true, + ["Inferno"] = true, + ["Initiative"] = true, + ["Inner Fire"] = true, + ["Inner Focus"] = true, + ["Innervate"] = true, + ["Insect Swarm"] = true, + ["Inspiration"] = true, + ["Instant Poison II"] = true, + ["Instant Poison III"] = true, + ["Instant Poison IV"] = true, + ["Instant Poison V"] = true, + ["Instant Poison VI"] = true, + ["Instant Poison"] = true, + ["Intensity"] = true, + ["Intercept"] = true, + ["Intercept Stun"] = true, + ["Intimidating Shout"] = true, + ["Intimidation"] = true, + ["Iron Will"] = true, + ["Judgement of Command"] = true, + ["Judgement of Justice"] = true, + ["Judgement of Light"] = true, + ["Judgement of Righteousness"] = true, + ["Judgement of Wisdom"] = true, + ["Judgement of the Crusader"] = true, + ["Judgement"] = true, + ["Kick"] = true, + ["Kick - Silenced"] = true, + ["Kidney Shot"] = true, + ["Killer Instinct"] = true, + ["Kodo Riding"] = true, + ["Lash of Pain"] = true, + ["Last Stand"] = true, + ["Lasting Judgement"] = true, + ["Lay on Hands"] = true, + ["Leader of the Pack"] = true, + ["Leather"] = true, + ["Leatherworking"] = true, + ["Lesser Heal"] = true, + ["Lesser Healing Wave"] = true, + ["Lesser Invisibility"] = true, + ["Lethal Shots"] = true, + ["Lethality"] = true, + ["Levitate"] = true, + ["Libram"] = true, + ["Life Tap"] = true, + ["Lightning Bolt"] = true, + ["Lightning Breath"] = true, + ["Lightning Mastery"] = true, + ["Lightning Reflexes"] = true, + ["Lightning Shield"] = true, + ["Lightwell Renew"] = true, + ["Lightwell"] = true, + ["Lockpicking"] = true, + ["Long Daze"] = true, + ["Mace Specialization"] = true, + ["Mace Stun Effect"] = true, + ["Mage Armor"] = true, + ["Magma Totem"] = true, + ["Mail"] = true, + ["Malice"] = true, + ["Mana Burn"] = true, + ["Mana Shield"] = true, + ["Mana Spring Totem"] = true, + ["Mana Tide Totem"] = true, + ["Mangle"] = true, + ["Mark of the Wild"] = true, + ["Martyrdom"] = true, + ["Master Demonologist"] = true, + ["Master Summoner"] = true, + ["Master of Deception"] = true, + ["Maul"] = true, + ["Mechanostrider Piloting"] = true, + ["Meditation"] = true, + ["Melee Specialization"] = true, + ["Mend Pet"] = true, + ["Mental Agility"] = true, + ["Mental Strength"] = true, + ["Mind Blast"] = true, + ["Mind Control"] = true, + ["Mind Flay"] = true, + ["Mind Soothe"] = true, + ["Mind Vision"] = true, + ["Mind-numbing Poison II"] = true, + ["Mind-numbing Poison III"] = true, + ["Mind-numbing Poison"] = true, + ["Mining"] = true, + ["Mocking Blow"] = true, + ["Mongoose Bite"] = true, + ["Monster Slaying"] = true, + ["Moonfire"] = true, + ["Moonfury"] = true, + ["Moonglow"] = true, + ["Moonkin Aura"] = true, + ["Moonkin Form"] = true, + ["Mortal Shots"] = true, + ["Mortal Strike"] = true, + ["Multi-Shot"] = true, + ["Murder"] = true, + ["Natural Armor"] = true, + ["Natural Shapeshifter"] = true, + ["Natural Weapons"] = true, + ["Nature Resistance Totem"] = true, + ["Nature Resistance"] = true, + ["Nature's Focus"] = true, + ["Nature's Grace"] = true, + ["Nature's Grasp"] = true, + ["Nature's Reach"] = true, + ["Nature's Swiftness"] = true, + ["Nightfall"] = true, + ["Omen of Clarity"] = true, + ["One-Handed Axes"] = true, + ["One-Handed Maces"] = true, + ["One-Handed Swords"] = true, + ["One-Handed Weapon Specialization"] = true, + ["Opening - No Text"] = true, + ["Opening"] = true, + ["Opportunity"] = true, + ["Overpower"] = true, + ["Paranoia"] = true, + ["Parry"] = true, + ["Pathfinding"] = true, + ["Perception"] = true, + ["Permafrost"] = true, + ["Pet Aggression"] = true, + ["Pet Hardiness"] = true, + ["Pet Recovery"] = true, + ["Pet Resistance"] = true, + ["Phase Shift"] = true, + ["Pick Lock"] = true, + ["Pick Pocket"] = true, + ["Piercing Howl"] = true, + ["Piercing Ice"] = true, + ["Plate Mail"] = true, + ["Poison Cleansing Totem"] = true, + ["Poisons"] = true, + ["Polearm Specialization"] = true, + ["Polearms"] = true, + ["Polymorph"] = true, + ["Polymorph: Pig"] = true, + ["Polymorph: Turtle"] = true, + ["Portal: Darnassus"] = true, + ["Portal: Ironforge"] = true, + ["Portal: Orgrimmar"] = true, + ["Portal: Stormwind"] = true, + ["Portal: Thunder Bluff"] = true, + ["Portal: Undercity"] = true, + ["Pounce Bleed"] = true, + ["Pounce"] = true, + ["Power Infusion"] = true, + ["Power Word: Fortitude"] = true, + ["Power Word: Shield"] = true, + ["Prayer of Fortitude"] = true, + ["Prayer of Healing"] = true, + ["Prayer of Shadow Protection"] = true, + ["Prayer of Spirit"] = true, + ["Precision"] = true, + ["Predatory Strikes"] = true, + ["Premeditation"] = true, + ["Preparation"] = true, + ["Presence of Mind"] = true, + ["Primal Fury"] = true, + ["Prowl"] = true, + ["Psychic Scream"] = true, + ["Pummel"] = true, + ["Purge"] = true, + ["Purification"] = true, + ["Purify"] = true, + ["Pursuit of Justice"] = true, + ["Pyroblast"] = true, + ["Pyroclasm"] = true, + ["Quick Shots"] = true, + ["Quickness"] = true, + ["Rain of Fire"] = true, + ["Rake"] = true, + ["Ram Riding"] = true, + ["Ranged Weapon Specialization"] = true, + ["Rapid Concealment"] = true, + ["Rapid Fire"] = true, + ["Raptor Riding"] = true, + ["Raptor Strike"] = true, + ["Ravage"] = true, + ["Readiness"] = true, + ["Rebirth"] = true, + ["Reckless Charge"] = true, + ["Recklessness"] = true, + ["Reckoning"] = true, + ["Redemption"] = true, + ["Redoubt"] = true, + ["Reflection"] = true, + ["Regeneration"] = true, + ["Regrowth"] = true, + ["Reincarnation"] = true, + ["Rejuvenation"] = true, + ["Relentless Strikes"] = true, + ["Remorseless"] = true, + ["Remorseless Attacks"] = true, + ["Remove Curse"] = true, + ["Remove Insignia"] = true, + ["Remove Lesser Curse"] = true, + ["Rend"] = true, + ["Renew"] = true, + ["Repentance"] = true, + ["Resurrection"] = true, + ["Retaliation"] = true, + ["Retribution Aura"] = true, + ["Revenge Stun"] = true, + ["Revenge"] = true, + ["Reverberation"] = true, + ["Revive Pet"] = true, + ["Righteous Fury"] = true, + ["Rip"] = true, + ["Riposte"] = true, + ["Ritual of Doom Effect"] = true, + ["Ritual of Doom"] = true, + ["Ritual of Summoning"] = true, + ["Rockbiter Weapon"] = true, + ["Rogue Passive"] = true, + ["Rough Sharpening Stone"] = true, + ["Ruin"] = true, + ["Rupture"] = true, + ["Ruthlessness"] = true, + ["Sacrifice"] = true, + ["Safe Fall"] = true, + ["Sanctity Aura"] = true, + ["Sap"] = true, + ["Savage Fury"] = true, + ["Savage Strikes"] = true, + ["Scare Beast"] = true, + ["Scatter Shot"] = true, + ["Scorch"] = true, + ["Scorpid Poison"] = true, + ["Scorpid Sting"] = true, + ["Screech"] = true, + ["Seal Fate"] = true, + ["Seal of Command"] = true, + ["Seal of Justice"] = true, + ["Seal of Light"] = true, + ["Seal of Righteousness"] = true, + ["Seal of Wisdom"] = true, + ["Seal of the Crusader"] = true, + ["Searing Light"] = true, + ["Searing Pain"] = true, + ["Searing Totem"] = true, + ["Seduction"] = true, + ["Sense Demons"] = true, + ["Sense Undead"] = true, + ["Sentry Totem"] = true, + ["Serpent Sting"] = true, + ["Setup"] = true, + ["Shackle Undead"] = true, + ["Shadow Affinity"] = true, + ["Shadow Bolt"] = true, + ["Shadow Focus"] = true, + ["Shadow Mastery"] = true, + ["Shadow Protection"] = true, + ["Shadow Reach"] = true, + ["Shadow Resistance Aura"] = true, + ["Shadow Resistance"] = true, + ["Shadow Trance"] = true, + ["Shadow Vulnerability"] = true, + ["Shadow Ward"] = true, + ["Shadow Weaving"] = true, + ["Shadow Word: Pain"] = true, + ["Shadowburn"] = true, + ["Shadowform"] = true, + ["Shadowguard"] = true, + ["Shadowmeld Passive"] = true, + ["Shadowmeld"] = true, + ["Sharpened Claws"] = true, + ["Shatter"] = true, + ["Sheep"] = true, + ["Shell Shield"] = true, + ["Shield Bash"] = true, + ["Shield Bash - Silenced"] = true, + ["Shield Block"] = true, + ["Shield Slam"] = true, + ["Shield Specialization"] = true, + ["Shield Wall"] = true, + ["Shield"] = true, + ["Shoot Bow"] = true, + ["Shoot Crossbow"] = true, + ["Shoot Gun"] = true, + ["Shoot"] = true, + ["Shred"] = true, + ["Silence"] = true, + ["Silent Resolve"] = true, + ["Sinister Strike"] = true, + ["Siphon Life"] = true, + ["Skinning"] = true, + ["Slam"] = true, + ["Sleep"] = true, + ["Slice and Dice"] = true, + ["Slow Fall"] = true, + ["Smelting"] = true, + ["Smite"] = true, + ["Solid Sharpening Stone"] = true, + ["Soothe Animal"] = true, + ["Soothing Kiss"] = true, + ["Soul Fire"] = true, + ["Soul Link"] = true, + ["Soul Siphon"] = true, + ["Soulstone Resurrection"] = true, + ["Spell Lock"] = true, + ["Spell Warding"] = true, + ["Spirit Bond"] = true, + ["Spirit Tap"] = true, + ["Spirit of Redemption"] = true, + ["Spiritual Focus"] = true, + ["Spiritual Guidance"] = true, + ["Spiritual Healing"] = true, + ["Sprint"] = true, + ["Starfire"] = true, + ["Starfire Stun"] = true, + ["Starshards"] = true, + ["Staves"] = true, + ["Stealth"] = true, + ["Stoneclaw Totem"] = true, + ["Stoneform"] = true, + ["Stoneskin Totem"] = true, + ["Stormstrike"] = true, + ["Strength of Earth Totem"] = true, + ["Stuck"] = true, + ["Subtlety"] = true, + ["Suffering"] = true, + ["Summon Charger"] = true, + ["Summon Dreadsteed"] = true, + ["Summon Felhunter"] = true, + ["Summon Felsteed"] = true, + ["Summon Imp"] = true, + ["Summon Succubus"] = true, + ["Summon Voidwalker"] = true, + ["Summon Warhorse"] = true, + ["Sunder Armor"] = true, + ["Suppression"] = true, + ["Surefooted"] = true, + ["Survivalist"] = true, + ["Sweeping Strikes"] = true, + ["Swiftmend"] = true, + ["Swipe"] = true, + ["Sword Specialization"] = true, + ["Tactical Mastery"] = true, + ["Tainted Blood"] = true, + ["Tailoring"] = true, + ["Tame Beast"] = true, + ["Tamed Pet Passive"] = true, + ["Taunt"] = true, + ["Teleport: Darnassus"] = true, + ["Teleport: Ironforge"] = true, + ["Teleport: Moonglade"] = true, + ["Teleport: Orgrimmar"] = true, + ["Teleport: Stormwind"] = true, + ["Teleport: Thunder Bluff"] = true, + ["Teleport: Undercity"] = true, + ["The Human Spirit"] = true, + ["Thick Hide"] = true, + ["Thorns"] = true, + ["Throw"] = true, + ["Throwing Specialization"] = true, + ["Throwing Weapon Specialization"] = true, + ["Thrown"] = true, + ["Thunder Clap"] = true, + ["Thundering Strikes"] = true, + ["Thunderstomp"] = true, + ["Tidal Focus"] = true, + ["Tidal Mastery"] = true, + ["Tiger Riding"] = true, + ["Tiger's Fury"] = true, + ["Torment"] = true, + ["Totem"] = true, + ["Totemic Focus"] = true, + ["Touch of Weakness"] = true, + ["Toughness"] = true, + ["Track Beasts"] = true, + ["Track Demons"] = true, + ["Track Dragonkin"] = true, + ["Track Elementals"] = true, + ["Track Giants"] = true, + ["Track Hidden"] = true, + ["Track Humanoids"] = true, + ["Track Undead"] = true, + ["Tranquil Air Totem"] = true, + ["Tranquil Spirit"] = true, + ["Tranquility"] = true, + ["Tranquilizing Shot"] = true, + ["Trap Mastery"] = true, + ["Travel Form"] = true, + ["Tremor Totem"] = true, + ["Tribal Leatherworking"] = true, + ["Trueshot Aura"] = true, + ["Turn Undead"] = true, + ["Two-Handed Axes and Maces"] = true, + ["Two-Handed Axes"] = true, + ["Two-Handed Maces"] = true, + ["Two-Handed Swords"] = true, + ["Two-Handed Weapon Specialization"] = true, + ["Unarmed"] = true, + ["Unbreakable Will"] = true, + ["Unbridled Wrath Effect"] = true, + ["Unbridled Wrath"] = true, + ["Undead Horsemanship"] = true, + ["Underwater Breathing"] = true, + ["Unending Breath"] = true, + ["Unholy Power"] = true, + ["Unleashed Fury"] = true, + ["Unyielding Faith"] = true, + ["Vampiric Embrace"] = true, + ["Vanish"] = true, + ["Vanished"] = true, + ["Vengeance"] = true, + ["Vigor"] = true, + ["Vile Poisons"] = true, + ["Vindication"] = true, + ["Viper Sting"] = true, + ["Volley"] = true, + ["Wand Specialization"] = true, + ["Wands"] = true, + ["War Stomp"] = true, + ["Water Breathing"] = true, + ["Water Walking"] = true, + ["Weakened Soul"] = true, + ["Weaponsmith"] = true, + ["Whirlwind"] = true, + ["Will of the Forsaken"] = true, + ["Windfury Totem"] = true, + ["Windfury Weapon"] = true, + ["Windwall Totem"] = true, + ["Wing Clip"] = true, + ["Winter's Chill"] = true, + ["Wisp Spirit"] = true, + ["Wolf Riding"] = true, + ["Wound Poison II"] = true, + ["Wound Poison III"] = true, + ["Wound Poison IV"] = true, + ["Wound Poison"] = true, + ["Wrath"] = true, + ["Wyvern Sting"] = true, + } +end) + +BabbleSpell:RegisterTranslations("deDE", function() + return { + ["Abolish Disease"] = "Krankheit aufheben", + ["Abolish Poison Effect"] = "Vergiftung aufheben - Effekt", + ["Abolish Poison"] = "Vergiftung aufheben", + ["Activate MG Turret"] = "MG-Turm aktivieren", + ["Adrenaline Rush"] = "Adrenalinrausch", + ["Aftermath"] = "Nachwirkung", + ["Aggression"] = "Aggression", + ["Aimed Shot"] = "Gezielter Schuss", + ["Alchemy"] = "Alchimie", + ["Ambush"] = "Hinterhalt", + ["Amplify Curse"] = "Fluch verst\195\164rken", + ["Amplify Magic"] = "Magie verst\195\164rken", + ["Ancestral Fortitude"] = "Seelenstrke der Ahnen", + ["Ancestral Healing"] = "Heilung der Ahnen", + ["Ancestral Knowledge"] = "Wissen der Ahnen", + ["Ancestral Spirit"] = "Geist der Ahnen", + ["Anger Management"] = "Aggressionskontrolle", + ["Anticipation"] = "Vorahnung", + ["Aquatic Form"] = "Wassergestalt", + ["Arcane Brilliance"] = "Arkane Brillanz", + ["Arcane Concentration"] = "Arkane Konzentration", + ["Arcane Explosion"] = "Arkane Explosion", + ["Arcane Focus"] = "Arkaner Fokus", + ["Arcane Instability"] = "Arkane Instabilit\195\164t", + ["Arcane Intellect"] = "Arkane Intelligenz", + ["Arcane Meditation"] = "Arkane Meditation", + ["Arcane Mind"] = "Arkaner Geist", + ["Arcane Missiles"] = "Arkane Geschosse", + ["Arcane Power"] = "Arkane Macht", + ["Arcane Resistance"] = "Arkanwiderstand", + ["Arcane Shot"] = "Arkaner Schuss", + ["Arcane Subtlety"] = "Arkanes Feingef\195\188hl", + ["Arctic Reach"] = "Arktische Reichweite", + ["Armorsmith"] = "R\195\188stungsschmied", + ["Aspect of the Beast"] = "Aspekt des Wildtiers", + ["Aspect of the Cheetah"] = "Aspekt des Geparden", + ["Aspect of the Hawk"] = "Aspekt des Falken", + ["Aspect of the Monkey"] = "Aspekt des Affen", + ["Aspect of the Pack"] = "Aspekt des Rudels", + ["Aspect of the Wild"] = "Aspekt der Wildnis", + ["Astral Recall"] = "Astraler R\195\188ckruf", + ["Attack"] = "Angreifen", + ["Attacking"] = "Angreifen", + ["Auto Shot"] = "Autom. Schuss", + ["Axe Specialization"] = "Axt-Spezialisierung", + ["Backstab"] = "Meucheln", + ["Bane"] = "Dunkle Macht", + ["Banish"] = "Verbannen", + ["Barkskin Effect"] = "Baumrindeneffekt", + ["Barkskin"] = "Baumrinde", + ["Barrage"] = "Sperrfeuer", + ["Bash"] = "Hieb", + ["Basic Campfire"] = "Einfaches Lagerfeuer", + ["Battle Shout"] = "Schlachtruf", + ["Battle Stance Passive"] = "Kampfhaltung Passiv", + ["Battle Stance"] = "Kampfhaltung", + ["Bear Form"] = "B\195\164rengestalt", + ["Beast Lore"] = "Wildtierkunde", + ["Beast Slaying"] = "Wildtierschl\195\164chter", + ["Beast Training"] = "Wildtierausbildung", + ["Benediction"] = "Segnung", + ["Berserker Rage"] = "Berserkerwut", + ["Berserker Stance Passive"] = "Berserkerhaltung - Passiv", + ["Berserker Stance"] = "Berserkerhaltung", + ["Berserking"] = "Berserker", + ["Bestial Discipline"] = "Wildtierdisziplin", + ["Bestial Swiftness"] = "Erh\195\182hte Tiergeschwindigkeit", + ["Bestial Wrath"] = "Zorn des Wildtiers", + ["Bite"] = "Bei\195\159en", + ["Black Arrow"] = "Schwarzer Pfeil", + ["Blackout"] = "Verdunkelung", + ["Blacksmithing"] = "Schmiedekunst", + ["Blade Flurry"] = "Klingenwirbel", + ["Blast Wave"] = "Druckwelle", + ["Blessed Recovery"] = "Gesegnete Erholung", + ["Blessing of Freedom"] = "Segen der Freiheit", + ["Blessing of Kings"] = "Segen der K\195\182nige", + ["Blessing of Light"] = "Segen des Lichts", + ["Blessing of Might"] = "Segen der Macht", + ["Blessing of Protection"] = "Segen des Schutzes", + ["Blessing of Sacrifice"] = "Segen der Opferung", + ["Blessing of Salvation"] = "Segen der Rettung", + ["Blessing of Sanctuary"] = "Segen des Refugiums", + ["Blessing of Wisdom"] = "Segen der Weisheit", + ["Blind"] = "Blenden", + ["Blinding Powder"] = "Blendungspulver", + ["Blink"] = "Blinzeln", + ["Blizzard"] = "Blizzard", + ["Block"] = "Blocken", + ["Blood Craze"] = "Blutwahnsinn", + ["Blood Frenzy"] = "Blutraserei", + ["Blood Fury"] = "Kochendes Blut", + ["Blood Pact"] = "Blutpakt", + ["Bloodrage"] = "Blutrausch", + ["Bloodthirst"] = "Blutdurst", + ["Booming Voice"] = "Donnernde Stimme", + ["Bow Specialization"] = "Bogenspezialisierung", + ["Bows"] = "Bogen", + ["Bright Campfire"] = "Helles Lagerfeuer", + ["Brutal Impact"] = "Brutaler Hieb", + ["Burning Soul"] = "Brennende Seele", + ["Call Pet"] = "Tier rufen", + ["Call of Flame"] = "Ruf der Flamme", + ["Call of Thunder"] = "Ruf des Donners", + ["Camouflage"] = "Tarnung", + ["Cannibalize"] = "Kannibalismus", + ["Cat Form"] = "Katzengestalt", + ["Cataclysm"] = "Katastrophe", + ["Chain Heal"] = "Kettenheilung", + ["Chain Lightning"] = "Kettenblitzschlag", + ["Challenging Roar"] = "Herausforderndes Gebr\195\188ll", + ["Challenging Shout"] = "Herausforderungsruf", + ["Charge Rage Bonus Effect"] = "Wut-Aufladung-Bonus-Effekt", + ["Charge"] = "Sturmangriff", + ["Charge Stun"] = "Sturmangriffsbetubung", + ["Cheap Shot"] = "Fieser Trick", + ["Chilled"] = "K\195\164lte", + ["Claw"] = "Klaue", + ["Cleanse"] = "Reinigung des Glaubens", + ["Clearcasting"] = "Freizaubern", + ["Cleave"] = "Spalten", + ["Clever Traps"] = "Falleneffizienz", + ["Closing"] = "Schlie\195\159en", + ["Cloth"] = "Stoff", + ["Cobra Reflexes"] = "Kobrareflexe", + ["Cold Blood"] = "Kaltbl\195\188tigkeit", + ["Cold Snap"] = "K\195\164lteeinbruch", + ["Combat Endurance"] = "Durchhalteverm\195\182gen des K\195\164mpfers", + ["Combustion"] = "Verbrennung", + ["Command"] = "Befehlsgewalt", + ["Concentration Aura"] = "Aura der Konzentration", + ["Concussion Blow"] = "Ersch\195\188tternder Schlag", + ["Concussion"] = "Ersch\195\188tterung", + ["Concussive Shot"] = "Ersch\195\188tternder Schuss", + ["Cone of Cold"] = "K\195\164ltekegel", + ["Conflagrate"] = "Feuersbrunst", + ["Conjure Food"] = "Essen herbeizaubern", + ["Conjure Mana Agate"] = "Mana-Achat herbeizaubern", + ["Conjure Mana Citrine"] = "Mana-Citrin herbeizaubern", + ["Conjure Mana Jade"] = "Mana-Jadestein herbeizaubern", + ["Conjure Mana Ruby"] = "Mana-Rubin herbeizaubern", + ["Conjure Water"] = "Wasser herbeizaubern", + ["Consecration"] = "Weihe", + ["Consume Shadows"] = "Schatten verzehren", + ["Convection"] = "Konvektion", + ["Conviction"] = "\195\156berzeugung", + ["Cooking"] = "Kochkunst", + ["Corruption"] = "Verderbnis", + ["Counterattack"] = "Gegenangriff", + ["Counterspell"] = "Gegenzauber", + ["Counterspell - Silenced"] = "Gegenzauber - zum Schweigen gebracht", + ["Cower"] = "Ducken", + ["Create Firestone"] = "Feuerstein herstellen", + ["Create Firestone (Major)"] = "Feuerstein herstellen (Gro\195\159er)", + ["Create Firestone (Greater)"] = "Feuerstein herstellen (Gr\195\182\sser)", + ["Create Firestone (Lesser)"] = "Feuerstein herstellen (Kleiner)", + ["Create Healthstone"] = "Gesundheitsstein herstellen", + ["Create Healthstone (Major)"] = "Gesundheitsstein herstellen (Gro\195\159er)", + ["Create Healthstone (Greater)"] = "Gesundheitsstein herstellen (Gr\195\182\sser)", + ["Create Healthstone (Lesser)"] = "Gesundheitsstein herstellen (Kleiner)", + ["Create Healthstone (Minor)"] = "Gesundheitsstein herstellen (Klein)", + ["Create Soulstone"] = "Seelenstein herstellen", + ["Create Soulstone (Major)"] = "Seelenstein herstellen (Gro\195\159er)", + ["Create Soulstone (Greater)"] = "Seelenstein herstellen (Gr\195\182\sser)", + ["Create Soulstone (Lesser)"] = "Seelenstein herstellen (Kleiner)", + ["Create Soulstone (Minor)"] = "Seelenstein herstellen (Klein)", + ["Create Spellstone"] = "Zauberstein herstellen", + ["Create Spellstone (Major)"] = "Zauberstein herstellen (Gro\195\159er)", + ["Create Spellstone (Greater)"] = "Zauberstein herstellen (Gr\195\182\sser)", + ["Crippling Poison II"] = "Verkr\195\188ppelndes Gift II", + ["Crippling Poison"] = "Verkr\195\188ppelndes Gift", + ["Critical Mass"] = "Kritische Masse", + ["Crossbows"] = "Armbr\195\188ste", + ["Cruelty"] = "Grausamkeit", + ["Cultivation"] = "Gr\195\188ner Daumen", + ["Cure Disease"] = "Krankheit heilen", + ["Cure Poison"] = "Vergiftung heilen", + ["Curse of Agony"] = "Fluch der Pein", + ["Curse of Doom Effect"] = "Fluch der Verdammnis'-Effekt", + ["Curse of Doom"] = "Fluch der Verdammnis", + ["Curse of Exhaustion"] = "Fluch der Ersch\195\182pfung", + ["Curse of Idiocy"] = "Fluch der Torheit", + ["Curse of Recklessness"] = "Fluch der Tollk\195\188hnheit", + ["Curse of Shadow"] = "Fluch der Schatten", + ["Curse of Tongues"] = "Fluch der Sprachen", + ["Curse of Weakness"] = "Fluch der Schw\195\164che", + ["Curse of the Elements"] = "Fluch der Elemente", + ["Dagger Specialization"] = "Dolch-Spezialisierung", + ["Daggers"] = "Dolche", + ["Dampen Magic"] = "Magie d\195\164mpfen", + ["Dark Pact"] = "Dunkler Pakt", + ["Darkness"] = "Dunkelheit", + ["Dash"] = "Spurt", + ["Deadly Poison II"] = "T\195\182dliches Gift II", + ["Deadly Poison III"] = "T\195\182dliches Gift III", + ["Deadly Poison IV"] = "T\195\182dliches Gift IV", + ["Deadly Poison V"] = "T\195\182dliches Gift V", + ["Deadly Poison"] = "T\195\182dliches Gift", + ["Death Coil"] = "Todesmantel", + ["Death Wish"] = "Todeswunsch", + ["Deep Wounds"] = "Tiefe Wunden", + ["Defense"] = "Verteidigung", + ["Defensive Stance Passive"] = "Verteidigungshaltung - Passiv", + ["Defensive Stance"] = "Verteidigungshaltung", + ["Defensive State 2"] = "Verteidigungsstatus 2", + ["Defensive State"] = "Verteidigungsstatus", + ["Defiance"] = "Trotz", + ["Deflection"] = "Abwehr", + ["Demon Armor"] = "D\195\164monenr\195\188stung", + ["Demon Skin"] = "D\195\164monenhaut", + ["Demonic Embrace"] = "D\195\164monische Umarmung", + ["Demonic Sacrifice"] = "D\195\164monische Opferung", + ["Demoralizing Roar"] = "Demoralisierendes Gebr\195\188ll", + ["Demoralizing Shout"] = "Demoralisierungsruf", + ["Desperate Prayer"] = "Verzweifeltes Gebet", + ["Destructive Reach"] = "Zerst\195\182rerische Reichweite", + ["Detect Greater Invisibility"] = "Gro\195\159e Unsichtbarkeit entdecken", + ["Detect Invisibility"] = "Unsichtbarkeit entdecken", + ["Detect Lesser Invisibility"] = "Geringe Unsichtbarkeit entdecken", + ["Detect Magic"] = "Magie entdecken", + ["Detect Traps"] = "Fallen entdecken", + ["Detect"] = "Entdecken", + ["Deterrence"] = "Abschreckung", + ["Devastation"] = "Verw\195\188stung", + ["Devotion Aura"] = "Aura der Hingabe", + ["Devour Magic Effect"] = "Magie verschlingen' - Effekt", + ["Devour Magic"] = "Magie verschlingen", + ["Devouring Plague"] = "Verschlingende Seuche", + ["Diplomacy"] = "Diplomatie", + ["Dire Bear Form"] = "Terrorb\195\164rengestalt", + ["Disarm Trap"] = "Falle entsch\195\164rfen", + ["Disarm"] = "Entwaffnen", + ["Disease Cleansing Totem"] = "Totem der Krankheitsreinigung", + ["Disenchant"] = "Entzaubern", + ["Disengage"] = "R\195\188ckzug", + ["Dismiss Pet"] = "Tier freigeben", + ["Dispel Magic"] = "Magiebannung", + ["Distract"] = "Ablenken", + ["Distracting Shot"] = "Ablenkender Schuss", + ["Dive"] = "Sturzflug", + ["Divine Favor"] = "G\195\182ttliche Gunst", + ["Divine Fury"] = "G\195\182ttlicher Furor", + ["Divine Intellect"] = "G\195\182ttliche Weisheit", + ["Divine Intervention"] = "G\195\182ttliches Eingreifen", + ["Divine Protection"] = "G\195\182ttlicher Schutz", + ["Divine Shield"] = "Gottesschild", + ["Divine Spirit"] = "G\195\182ttlicher Willen", + ["Divine Strength"] = "G\195\182ttliche St\195\164rke", + ["Dodge"] = "Ausweichen", + ["Dragonscale Leatherworking"] = "Drachenschuppenlederverarbeitung", + ["Drain Life"] = "Blutsauger", + ["Drain Mana"] = "Mana entziehen", + ["Drain Soul"] = "Seelendieb", + ["Drink"] = "Trinken", + ["Dual Wield Specialization"] = "Beidh\195\164ndigkeits-Spezialisierung", + ["Dual Wield"] = "Beidh\195\164ndigkeit", + ["Duel"] = "Duell", + ["Eagle Eye"] = "Adlerauge", + ["Earth Shock"] = "Erdschock", + ["Earthbind Totem"] = "Totem der Erdbindung", + ["Efficiency"] = "Effizienz", + ["Elemental Focus"] = "Elementarfokus", + ["Elemental Fury"] = "Elementarfuror", + ["Elemental Leatherworking"] = "Elementarlederverarbeitung", + ["Elemental Mastery"] = "Elementarbeherrschung", + ["Elune's Grace"] = "Elunes Anmut", + ["Elusiveness"] = "Fl\195\188chtigkeit", + ["Emberstorm"] = "Glutsturm", + ["Enamored Water Spirit"] = "Entzckter Wassergeist", + ["Enchanting"] = "Verzauberkunst", + ["Endurance Training"] = "Belastbarkeit-Ausbildung", + ["Endurance"] = "Durchhalteverm\195\182gen", + ["Engineering Specialization"] = "Technologist", + ["Engineering"] = "Ingenieurskunst", + ["Enrage"] = "Wutanfall", + ["Enriched Manna Biscuit"] = "Angereicherter Manakeks", + ["Enslave Demon"] = "D\195\164monensklave", + ["Entangling Roots"] = "Wucherwurzeln", + ["Entrapment"] = "Einfangen", + ["Escape Artist"] = "Entfesselungsk\195\188nstler", + ["Evasion"] = "Entrinnen", + ["Eventide"] = "Abendzeit", + ["Eviscerate"] = "Ausweiden", + ["Evocation"] = "Hervorrufung", + ["Execute"] = "Hinrichten", + ["Exorcism"] = "Exorzismus", + ["Expansive Mind"] = "Wacher Geist", + ["Explosive Trap Effect"] = "Sprengfalle'-Effekt", + ["Explosive Trap"] = "Sprengfalle", + ["Expose Armor"] = "R\195\188stung schw\195\164chen", + ["Eye for an Eye"] = "Auge um Auge", + ["Eye of Kilrogg"] = "Auge von Kilrogg", + ["Eyes of the Beast"] = "Augen des Wildtiers", + ["Fade"] = "Verblassen", + ["Faerie Fire"] = "Feenfeuer", + ["Faerie Fire (Feral)"] = "Feenfeuer (Tiergestalt)", + ["Far Sight"] = "Fernsicht", + ["Fear Ward"] = "Furchtzauberschutz", + ["Fear"] = "Furcht", + ["Feed Pet"] = "Tier f\195\188ttern", + ["Feedback"] = "R\195\188ckkopplung", + ["Feign Death"] = "Totstellen", + ["Feint"] = "Finte", + ["Fel Concentration"] = "Teufelskonzentration", + ["Fel Domination"] = "Teufelsbeherrschung", + ["Fel Intellect"] = "Teufelsintelligenz", + ["Fel Stamina"] = "Teufelsausdauer", + ["Felfire"] = "Teufelsfeuer", + ["Feline Grace"] = "Katzenhafte Anmut", + ["Feline Swiftness"] = "Katzenhafte Schnelligkeit", + ["Feral Aggression"] = "Wilde Aggression", + ["Feral Charge"] = "Wilde Attacke", + ["Feral Instinct"] = "Instinkt der Wildnis", + ["Ferocious Bite"] = "Wilder Biss", + ["Ferocity"] = "Wildheit", + ["Fetish"] = "Fetisch", + ["Find Herbs"] = "Kr\195\164utersuche", + ["Find Minerals"] = "Mineraliensuche", + ["Find Treasure"] = "Schatzsucher", + ["Fire Blast"] = "Feuerschlag", + ["Fire Nova Totem"] = "Totem der Feuernova", + ["Fire Power"] = "Feuermacht", + ["Fire Resistance Aura"] = "Aura des Feuerwiderstands", + ["Fire Resistance Totem"] = "Totem des Feuerwiderstands", + ["Fire Resistance"] = "Feuerwiderstand", + ["Fire Shield"] = "Feuerschild", + ["Fire Vulnerability"] = "Feuerverwundbarkeit", + ["Fire Ward"] = "Feuerzauberschutz", + ["Fireball"] = "Feuerball", + ["Firebolt"] = "Feuerblitz", + ["First Aid"] = "Erste Hilfe", + ["Fishing Poles"] = "Angeln", + ["Fishing"] = "Angeln", + ["Fist Weapon Specialization"] = "Faustwaffen-Spezialisierung", + ["Fist Weapons"] = "Faustwaffen", + ["Flame Shock"] = "Flammenschock", + ["Flame Throwing"] = "Flammenwerfen", + ["Flamestrike"] = "Flammensto\195\159", + ["Flamethrower"] = "Flammenwerfer", + ["Flametongue Totem"] = "Totem der Flammenzunge", + ["Flametongue Weapon"] = "Waffe der Flammenzunge", + ["Flare"] = "Leuchtfeuer", + ["Flash Heal"] = "Blitzheilung", + ["Flash of Light"] = "Lichtblitz", + ["Flurry"] = "Schlaghagel", + ["Focused Casting"] = "Fokussiertes Zauberwirken", + ["Food"] = "Essen", + ["Forbearance"] = "Vorahnung", + ["Force of Will"] = "Macht des Willens", + ["Freezing Trap Effect"] = "Eisk?tefalle", + ["Freezing Trap"] = "Eisk\195\164ltefalle", + ["Frenzied Regeneration"] = "Rasende Regeneration", + ["Frenzy"] = "Raserei", + ["Frost Armor"] = "Frostr\195\188stung", + ["Frost Channeling"] = "Frost-Kanalisierung", + ["Frost Nova"] = "Frostnova", + ["Frost Resistance Aura"] = "Aura des Frostwiderstands", + ["Frost Resistance Totem"] = "Totem des Frostwiderstands", + ["Frost Resistance"] = "Frostwiderstand", + ["Frost Shock"] = "Frostschock", + ["Frost Trap"] = "Frostfalle", + ["Frost Trap Aura"] = "Frostfalle-Aura", + ["Frost Ward"] = "Frostzauberschutz", + ["Frostbite"] = "Erfrierung", + ["Frostbolt"] = "Frostblitz", + ["Frostbrand Weapon"] = "Waffe des Frostbrands", + ["Furious Howl"] = "Wutgeheul", + ["Furor"] = "Furor", + ["Garrote"] = "Erdrosseln", + ["Generic"] = "Allgemein", + ["Ghost Wolf"] = "Geisterwolf", + ["Ghostly Strike"] = "Geisterhafter Sto\195\159", + ["Gift of Nature"] = "Geschenk der Natur", + ["Gift of the Wild"] = "Gabe der Wildnis", + ["Gouge"] = "Solarplexus", + ["Grace of Air Totem"] = "Totem der luftgleichen Anmut", + ["Great Stamina"] = "Gro\195\159e Ausdauer", + ["Greater Blessing of Kings"] = "Gro\195\159er Segen der K\195\182nige", + ["Greater Blessing of Light"] = "Gro\195\159er Segen des Lichts", + ["Greater Blessing of Might"] = "Gro\195\159er Segen der Macht", + ["Greater Blessing of Salvation"] = "Gro\195\159er Segen der Rettung", + ["Greater Blessing of Sanctuary"] = "Gro\195\159er Segen des Refugiums", + ["Greater Blessing of Wisdom"] = "Gro\195\159er Segen der Weisheit", + ["Greater Heal"] = "Gro\195\159e Heilung", + ["Grim Reach"] = "Grimmige Reichweite", + ["Grounding Totem"] = "Totem der Erdung", + ["Grovel"] = "Kriechen", + ["Growl"] = "Knurren", + ["Guardian's Favor"] = "Gunst des H\195\188ters", + ["Gun Specialization"] = "Schusswaffenspezialisierung", + ["Guns"] = "Schusswaffen", + ["Hammer of Justice"] = "Hammer der Gerechtigkeit", + ["Hammer of Wrath"] = "Hammer des Zorns", + ["Hamstring"] = "Kniesehne", + ["Harass"] = "Bel\195\164stigen", + ["Hardiness"] = "Z\195\164higkeit", + ["Hawk Eye"] = "Falkenauge", + ["Heal"] = "Heilen", + ["Healing Focus"] = "Heilfokus", + ["Healing Light"] = "Heilendes Licht", + ["Healing Stream Totem"] = "Totem des heilenden Flusses", + ["Healing Touch"] = "Heilende Ber\195\188hrung", + ["Healing Wave"] = "Welle der Heilung", +-- ["Healing Way"] = true, + ["Health Funnel"] = "Lebenslinie", + ["Heart of the Wild"] = "Herz der Wildnis", + ["Hellfire Effect"] = "H\195\182llenfeuer - Effekt", + ["Hellfire"] = "H\195\182llenfeuer", + ["Hemorrhage"] = "Blutsturz", + ["Herbalism"] = "Kr\195\164utersammeln", + ["Heroic Strike"] = "Heldenhafter Sto\195\159", + ["Hex of Weakness"] = "Verhexung der Schw\195\164che", + ["Hibernate"] = "Winterschlaf", + ["Holy Fire"] = "Heiliges Feuer", + ["Holy Light"] = "Heiliges Licht", + ["Holy Nova"] = "Heilige Nova", + ["Holy Power"] = "Heilige Macht", + ["Holy Reach"] = "Heilige Reichweite", + ["Holy Shield"] = "Heiliger Schild", + ["Holy Shock"] = "Heiliger Schock", + ["Holy Specialization"] = "Macht des Glaubens", + ["Holy Wrath"] = "Heiliger Zorn", + ["Honorless Target"] = "Ehrenloses Ziel", + ["Horse Riding"] = "Pferdreiten", + ["Howl of Terror"] = "Schreckgeheul", + ["Humanoid Slaying"] = "Humanoident\195\182ten", + ["Hunter's Mark"] = "Mal des J\195\164gers", + ["Hurricane"] = "Hurrikan", + ["Ice Armor"] = "Eisr\195\188stung", + ["Ice Barrier"] = "Eis-Barriere", + ["Ice Block"] = "Eisblock", + ["Ice Shards"] = "Eissplitter", + ["Ignite"] = "Entz\195\188nden", + ["Illumination"] = "Illumination", + ["Immolate"] = "Feuerbrand", + ["Immolation Trap Effect"] = "Feuerbrandfalle", + ["Immolation Trap"] = "Feuerbrandfalle", + ["Impact"] = "Einschlag", + ["Impale"] = "Durchbohren", + ["Improved Ambush"] = "Verbesserter Hinterhalt", + ["Improved Arcane Explosion"] = "Verbesserte Arkane Explosion", + ["Improved Arcane Missiles"] = "Verbesserte arkane Geschosse", + ["Improved Arcane Shot"] = "Verbesserter Arkaner Schuss", + ["Improved Aspect of the Hawk"] = "Verbesserter Aspekt des Falken", + ["Improved Aspect of the Monkey"] = "Verbesserter Aspekt des Affen", + ["Improved Backstab"] = "Verbessertes Meucheln", + ["Improved Battle Shout"] = "Verbesserter Schlachtruf", + ["Improved Berserker Rage"] = "Verbesserte Berserkerwut", + ["Improved Blessing of Might"] = "Verbesserter Segen der Macht", + ["Improved Blessing of Wisdom"] = "Verbesserter Segen der Weisheit", + ["Improved Blizzard"] = "Verbesserter Blizzard", + ["Improved Bloodrage"] = "Verbesserter Blutrausch", + ["Improved Chain Heal"] = "Verbesserte Kettenheilung", + ["Improved Chain Lightning"] = "Verbesserter Kettenblitzschlag", + ["Improved Challenging Shout"] = "Verbesserter Herausforderungsruf", + ["Improved Charge"] = "Verbesserter Sturmangriff", + ["Improved Cheap Shot"] = "Verbesserter Fieser Trick", + ["Improved Cleave"] = "Verbessertes Spalten", + ["Improved Concentration Aura"] = "Verbesserte Aura der Konzentration", + ["Improved Concussive Shot"] = "Verbesserter Ersch\195\188tternder Schuss", + ["Improved Cone of Cold"] = "Verbesserter K\195\164ltekegel", + ["Improved Corruption"] = "Verbesserte Verderbnis", + ["Improved Counterspell"] = "Verbesserter Gegenzauber", + ["Improved Curse of Agony"] = "Verbesserter Fluch der Pein", + ["Improved Curse of Exhaustion"] = "Verbesserter Fluch der Ersch\195\182pfung", + ["Improved Curse of Weakness"] = "Verbesserter Fluch der Schw\195\164che", + ["Improved Dampen Magic"] = "Verbesserter Magied\195\164mpfer", + ["Improved Deadly Poison"] = "Verbessertes t\195\182dliches Gift", + ["Improved Demoralizing Shout"] = "Verbesserter Demoralisierender Ruf", + ["Improved Devotion Aura"] = "Verbesserte Aura der Hingabe", + ["Improved Disarm"] = "Verbessertes Entwaffnen", + ["Improved Distract"] = "Verbessertes Ablenken", + ["Improved Drain Life"] = "Verbesserter Blutsauger", + ["Improved Drain Mana"] = "Verbessertes Mana entziehen", + ["Improved Drain Soul"] = "Verbesserter Seelendieb", + ["Improved Enrage"] = "Verbesserter Wutanfall", + ["Improved Enslave Demon"] = "Verbesserter D\195\164monensklave", + ["Improved Entangling Roots"] = "Verbesserte Wucherwurzeln", + ["Improved Evasion"] = "Verbessertes Entrinnen", + ["Improved Eviscerate"] = "Verbessertes Ausweiden", + ["Improved Execute"] = "Verbessertes Hinrichten", + ["Improved Expose Armor"] = "Verbessertes R\195\188stung schw\195\164chen", + ["Improved Eyes of the Beast"] = "Verbesserte Augen des Wildtiers", + ["Improved Fade"] = "Verbessertes Verblassen", + ["Improved Feign Death"] = "Verbessertes Totstellen", + ["Improved Fire Blast"] = "Verbesserter Feuerschlag", + ["Improved Fire Nova Totem"] = "Verbessertes Totem der Feuernova", + ["Improved Fire Ward"] = "Verbesserter Feuerzauberschutz", + ["Improved Fireball"] = "Verbesserter Feuerball", + ["Improved Firebolt"] = "Verbesserter Feuerblitz", + ["Improved Firestone"] = "Verbesserter Feuerstein", + ["Improved Flamestrike"] = "Verbesserter Flammensto\195\159", + ["Improved Flametongue Weapon"] = "Verbesserte Waffe der Flammenzunge", + ["Improved Flash of Light"] = "Verbesserter Lichtblitz", + ["Improved Frost Nova"] = "Verbesserte Frostnova", + ["Improved Frost Ward"] = "Verbesserter Frostzauberschutz", + ["Improved Frostbolt"] = "Verbesserter Frostblitz", + ["Improved Frostbrand Weapon"] = "Verbesserte Waffe des Frostbrands", + ["Improved Garrote"] = "Verbessertes Erdrosseln", + ["Improved Ghost Wolf"] = "Verbesserter Geisterwolf", + ["Improved Gouge"] = "Verbesserter Solarplexus", + ["Improved Grace of Air Totem"] = "Verbessertes Totem der luftgleichen Anmut", + ["Improved Grounding Totem"] = "Verbessertes Totem der Erdung", + ["Improved Hammer of Justice"] = "Verbesserter Hammer der Gerechtigkeit", + ["Improved Hamstring"] = "Verbesserte Kniesehne", + ["Improved Healing Stream Totem"] = "Verbessertes Totem des heilenden Flusses", + ["Improved Healing Touch"] = "Verbesserte Heilende Ber\195\188hrung", + ["Improved Healing Wave"] = "Verbesserte Welle der Heilung", + ["Improved Healing"] = "Verbesserte Heilung", + ["Improved Health Funnel"] = "Verbesserte Lebenslinie", + ["Improved Healthstone"] = "Verbesserter Gesundheitsstein", + ["Improved Heroic Strike"] = "Verbesserter Heldenhafter Sto\195\159", + ["Improved Hunter's Mark"] = "Verbessertes Mal des J\195\164gers", + ["Improved Immolate"] = "Verbesserter Feuerbrand", + ["Improved Imp"] = "Verbesserter Wichtel", + ["Improved Inner Fire"] = "Verbessertes Inneres Feuer", + ["Improved Instant Poison"] = "Verbessertes sofort wirkendes Gift", + ["Improved Intercept"] = "Verbessertes Abfangen", + ["Improved Intimidating Shout"] = "Verbesserter Drohruf", + ["Improved Judgement"] = "Verbessertes Richturteil", + ["Improved Kick"] = "Verbesserter Tritt", + ["Improved Kidney Shot"] = "Verbesserter Nierenhieb", + ["Improved Lash of Pain"] = "Verbesserte Schmerzenspeitsche", + ["Improved Lay on Hands"] = "Verbesserte Handauflegung", + ["Improved Lesser Healing Wave"] = "Verbesserte Geringe Welle der Heilung", + ["Improved Life Tap"] = "Verbesserter Aderlass", + ["Improved Lightning Bolt"] = "Verbesserter Blitzschlag", + ["Improved Lightning Shield"] = "Verbesserter Blitzschlag-Schild", + ["Improved Magma Totem"] = "Verbessertes Totem der gl\195\188henden Magma", + ["Improved Mana Burn"] = "Verbesserter Manabrand", + ["Improved Mana Shield"] = "Verbesserter Manaschild", + ["Improved Mana Spring Totem"] = "Verbessertes Totem der Manaquelle", + ["Improved Mark of the Wild"] = "Verbessertes Mal der Wildnis", + ["Improved Mend Pet"] = "Verbessertes Tier heilen", + ["Improved Mind Blast"] = "Verbesserter Gedankenschlag", + ["Improved Moonfire"] = "Verbessertes Mondfeuer", + ["Improved Nature's Grasp"] = "Verbesserter Griff der Natur", + ["Improved Overpower"] = "Verbessertes \195\156berw\195\164ltigen", + ["Improved Power Word: Fortitude"] = "Verbessertes Machtwort: Seelenst\195\164rke", + ["Improved Power Word: Shield"] = "Verbessertes Machtwort: Schild", + ["Improved Prayer of Healing"] = "Verbessertes Gebet der Heilung", + ["Improved Psychic Scream"] = "Verbesserter Psychischer Schrei", + ["Improved Pummel"] = "Verbessertes Zuschlagen", + ["Improved Regrowth"] = "Verbessertes Nachwachsen", + ["Improved Reincarnation"] = "Verbesserte Reinkarnation", + ["Improved Rejuvenation"] = "Verbesserte Verj\195\188ngung", + ["Improved Rend"] = "Verbessertes Verwunden", + ["Improved Renew"] = "Verbesserte Erneuerung", + ["Improved Retribution Aura"] = "Verbesserte Aura der Vergeltung", + ["Improved Revenge"] = "Verbesserte Rache", + ["Improved Revive Pet"] = "Verbessertes Tier wiederbeleben", + ["Improved Righteous Fury"] = "Verbesserter Zorn der Gerechtigkeit", + ["Improved Rockbiter Weapon"] = "Verbesserte Felsbei\195\159erwaffe", + ["Improved Rupture"] = "Verbesserte Blutung", + ["Improved Sap"] = "Verbesserte Kopfnuss", + ["Improved Scorch"] = "Verbessertes Versengen", + ["Improved Scorpid Sting"] = "Verbesserter Skorpidstich", + ["Improved Seal of Righteousness"] = "Verbessertes Siegel der Rechtschaffenheit", + ["Improved Seal of the Crusader"] = "Verbessertes Siegel des Kreuzfahrers", + ["Improved Searing Pain"] = "Verbesserter Sengender Schmerz", + ["Improved Searing Totem"] = "Verbessertes Totem der Verbrennung", + ["Improved Serpent Sting"] = "Verbesserter Schlangenbiss", + ["Improved Shadow Bolt"] = "Verbesserter Schattenblitz", + ["Improved Shadow Word: Pain"] = "Verbessertes Schattenwort: Schmerz", + ["Improved Shield Bash"] = "Verbesserter Schildhieb", + ["Improved Shield Block"] = "Verbesserter Schildblock", + ["Improved Shield Wall"] = "Verbesserter Schildwall", + ["Improved Shred"] = "Verbessertes Schreddern", + ["Improved Sinister Strike"] = "Verbesserter Finsterer Sto\195\159", + ["Improved Slam"] = "Verbessertes Zerschmettern", + ["Improved Slice and Dice"] = "Verbessertes Zerh\195\164ckseln", + ["Improved Spellstone"] = "Verbesserter Zauberstein", + ["Improved Sprint"] = "Verbessertes Sprinten", + ["Improved Starfire"] = "Verbessertes Sternenfeuer", + ["Improved Stoneclaw Totem"] = "Verbessertes Totem der Steinklaue", + ["Improved Stoneskin Totem"] = "Verbessertes Totem der Steinhaut", + ["Improved Strength of Earth Totem"] = "Verbessertes Totem der Erdst\195\164rke", + ["Improved Succubus"] = "Verbesserter Sukkubus", + ["Improved Sunder Armor"] = "Verbessertes R\195\188stung zerrei\195\159en", + ["Improved Taunt"] = "Verbesserter Spott", + ["Improved Thorns"] = "Verbesserte Dornen", + ["Improved Thunder Clap"] = "Verbesserter Donnerknall", + ["Improved Tranquility"] = "Verbesserte Gelassenheit", + ["Improved Vampiric Embrace"] = "Verbesserte Vampirumarmung", + ["Improved Vanish"] = "Verbessertes Verschwinden", + ["Improved Voidwalker"] = "Verbesserter Leerwandler", + ["Improved Windfury Weapon"] = "Verbesserte Waffe des Windfurors", + ["Improved Wing Clip"] = "Verbessertes Zurechtstutzen", + ["Improved Wrath"] = "Verbesserter Zorn", + ["Incinerate"] = "Verbrennen", + ["Inferno"] = "Inferno", + ["Initiative"] = "Initiative", + ["Inner Fire"] = "Inneres Feuer", + ["Inner Focus"] = "Innerer Fokus", + ["Innervate"] = "Anregen", + ["Insect Swarm"] = "Insektenschwarm", + ["Inspiration"] = "Inspiration", + ["Instant Poison II"] = "Sofort wirkendes Gift II", + ["Instant Poison III"] = "Sofort wirkendes Gift III", + ["Instant Poison IV"] = "Sofort wirkendes Gift IV", + ["Instant Poison V"] = "Sofort wirkendes Gift V", + ["Instant Poison VI"] = "Sofort wirkendes Gift VI", + ["Instant Poison"] = "Sofort wirkendes Gift", + ["Intensity"] = "Intensit\195\164t", + ["Intercept"] = "Abfangen", + ["Intercept Stun"] = "Betubung abfangen", + ["Intimidating Shout"] = "Drohruf", + ["Intimidation"] = "Einsch\195\188chterung", + ["Iron Will"] = "Eiserner Wille", + ["Judgement of Command"] = "Richturteil des Befehls", + ["Judgement of Justice"] = "Richturteil der Gerechtigkeit", + ["Judgement of Light"] = "Richturteil des Lichts", + ["Judgement of Righteousness"] = "Richturteil der Rechtschaffenheit", + ["Judgement of Wisdom"] = "Richturteil der Weisheit", + ["Judgement of the Crusader"] = "Richturteil des Kreuzfahrers", + ["Judgement"] = "Richturteil", + ["Kick"] = "Tritt", + ["Kick - Silenced"] = "Tritt - zum Schweigen gebracht", + ["Kidney Shot"] = "Nierenhieb", + ["Killer Instinct"] = "T\195\182tungstrieb", + ["Kodo Riding"] = "Kodoreiten", + ["Lash of Pain"] = "Schmerzenspeitsche", + ["Last Stand"] = "Letztes Gefecht", + ["Lasting Judgement"] = "Dauerhaftes Richturteil", + ["Lay on Hands"] = "Handauflegung", + ["Leader of the Pack"] = "Rudelf\195\188hrer", + ["Leather"] = "Leder", + ["Leatherworking"] = "Lederverarbeitung", + ["Lesser Heal"] = "Geringes Heilen", + ["Lesser Healing Wave"] = "Geringe Welle der Heilung", + ["Lesser Invisibility"] = "Geringe Unsichtbarkeit", + ["Lethal Shots"] = "T\195\182dliche Sch\195\188sse", + ["Lethality"] = "T\195\182dlichkeit", + ["Levitate"] = "Levitieren", + ["Libram"] = "Buchband", + ["Life Tap"] = "Aderlass", + ["Lightning Bolt"] = "Blitzschlag", + ["Lightning Breath"] = "Blitzschlagatem", + ["Lightning Mastery"] = "Blitzschlagbeherrschung", + ["Lightning Reflexes"] = "Blitzartige Reflexe", + ["Lightning Shield"] = "Blitzschlagschild", + ["Lightwell Renew"] = "Erneuerung des Lichtbrunnens", + ["Lightwell"] = "Brunnen des Lichts", + ["Lockpicking"] = "Schlossknacken", + ["Long Daze"] = "Lange Benommenheit", + ["Mace Specialization"] = "Streitkolben-Spezialisierung", + ["Mace Stun Effect"] = "Streitkolbenbet\195\164ubung-Effekt", + ["Mage Armor"] = "Magische R\195\188stung", + ["Magma Totem"] = "Totem der gl\195\188henden Magma", + ["Mail"] = "Panzer", + ["Malice"] = "T\195\188cke", + ["Mana Burn"] = "Manabrand", + ["Mana Shield"] = "Manaschild", + ["Mana Spring Totem"] = "Totem der Manaquelle", + ["Mana Tide Totem"] = "Totem der Manaflut", + ["Mangle"] = "Fleddern", + ["Mark of the Wild"] = "Mal der Wildnis", + ["Martyrdom"] = "M\195\164rtyrertum", + ["Master Demonologist"] = "Meister der D\195\164monologie", + ["Master Summoner"] = "Meister der Beschw\195\182rung", + ["Master of Deception"] = "Meister der T\195\164uschung", + ["Maul"] = "Zermalmen", + ["Mechanostrider Piloting"] = "Roboschreiter-Lenken", + ["Meditation"] = "Meditation", + ["Melee Specialization"] = "Nahkampf-Spezialisierung", + ["Mend Pet"] = "Tier heilen", + ["Mental Agility"] = "Mentale Beweglichkeit", + ["Mental Strength"] = "Mentale St\195\164rke", + ["Mind Blast"] = "Gedankenschlag", + ["Mind Control"] = "Gedankenkontrolle", + ["Mind Flay"] = "Gedankenschinden", + ["Mind Soothe"] = "Gedankenbes\195\164nftigung", + ["Mind Vision"] = "Gedankensicht", + ["Mind-numbing Poison II"] = "Gedankenbenebelndes Gift II", + ["Mind-numbing Poison III"] = "Gedankenbenebelndes Gift III", + ["Mind-numbing Poison"] = "Gedankenbenebelndes Gift", + ["Mining"] = "Bergbau", + ["Mocking Blow"] = "Sp\195\182ttischer Schlag", + ["Mongoose Bite"] = "Mungobiss", + ["Monster Slaying"] = "Monstert\195\182ten", + ["Moonfire"] = "Mondfeuer", + ["Moonfury"] = "Mondfuror", + ["Moonglow"] = "Mondschein", + ["Moonkin Aura"] = "Aura des Moonkin", + ["Moonkin Form"] = "Moonkingestalt", + ["Mortal Shots"] = "Todbringende Sch\195\188sse", + ["Mortal Strike"] = "T\195\182dlicher Sto\195\159", + ["Multi-Shot"] = "Mehrfachschuss", + ["Murder"] = "Mord", + ["Natural Armor"] = "Nat\195\188rliche R\195\188stung", + ["Natural Shapeshifter"] = "Schnellwandlung", + ["Natural Weapons"] = "Waffenbalance", + ["Nature Resistance Totem"] = "Totem des Naturwiderstands", + ["Nature Resistance"] = "Naturwiderstand", + ["Nature's Focus"] = "Naturfokus", + ["Nature's Grace"] = "Anmut der Natur", + ["Nature's Grasp"] = "Griff der Natur", + ["Nature's Reach"] = "Reichweite der Natur", + ["Nature's Swiftness"] = "Schnelligkeit der Natur", + ["Nightfall"] = "Einbruch der Nacht", + ["Omen of Clarity"] = "Omen der Klarsicht", + ["One-Handed Axes"] = "Einhand\195\164xte", + ["One-Handed Maces"] = "Einhandstreitkolben", + ["One-Handed Swords"] = "Einhandschwerter", + ["One-Handed Weapon Specialization"] = "Einhandwaffen-Spezialisierung", + ["Opening - No Text"] = "\195\150ffnen - Kein Text", + ["Opening"] = "\195\150ffnen", + ["Opportunity"] = "G\195\188nstige Gelegenheit", + ["Overpower"] = "\195\156berw\195\164ltigen", + ["Paranoia"] = "Paranoia", + ["Parry"] = "Parieren", + ["Pathfinding"] = "Orientierung", + ["Perception"] = "Wachsamkeit", + ["Permafrost"] = "Dauerfrost", + ["Pet Aggression"] = "Tieraggression", + ["Pet Hardiness"] = "Tier-Widerstandskraft", + ["Pet Recovery"] = "Tiererholung", + ["Pet Resistance"] = "Tier-Widerstand", + ["Phase Shift"] = "Phasenverschiebung", + ["Pick Lock"] = "Schloss knacken", + ["Pick Pocket"] = "Taschendiebstahl", + ["Piercing Howl"] = "Durchdringendes Heulen", + ["Piercing Ice"] = "Stechendes Eis", + ["Plate Mail"] = "Plattenpanzer", + ["Poison Cleansing Totem"] = "Totem der Giftreinigung", + ["Poisons"] = "Gifte", + ["Polearm Specialization"] = "Stangenwaffen-Spezialisierung", + ["Polearms"] = "Stangenwaffen", + ["Polymorph"] = "Verwandlung", + ["Polymorph: Pig"] = "Verwandlung: Schwein", + ["Polymorph: Turtle"] = "Verwandlung: Schildkr\195\182te", + ["Portal: Darnassus"] = "Portal: Darnassus", + ["Portal: Ironforge"] = "Portal: Ironforge", + ["Portal: Orgrimmar"] = "Portal: Orgrimmar", + ["Portal: Stormwind"] = "Portal: Stormwind", + ["Portal: Thunder Bluff"] = "Portal: Thunder Bluff", + ["Portal: Undercity"] = "Portal: Undercity", + ["Pounce Bleed"] = "Anspringblutung", + ["Pounce"] = "Anspringen", + ["Power Infusion"] = "Seele der Macht", + ["Power Word: Fortitude"] = "Machtwort: Seelenst\195\164rke", + ["Power Word: Shield"] = "Machtwort: Schild", + ["Prayer of Fortitude"] = "Gebet der Seelenst\195\164rke", + ["Prayer of Healing"] = "Gebet der Heilung", + ["Prayer of Shadow Protection"] = "Gebet des Schattenschutzes", + ["Prayer of Spirit"] = "Gebet der Willenskraft", + ["Precision"] = "Pr\195\164zision", + ["Predatory Strikes"] = "Raubtierschl\195\164ge", + ["Premeditation"] = "Konzentration", + ["Preparation"] = "Vorbereitung", + ["Presence of Mind"] = "Geistesgegenwart", + ["Primal Fury"] = "Urfuror", + ["Prowl"] = "Schleichen", + ["Psychic Scream"] = "Psychischer Schrei", + ["Pummel"] = "Zuschlagen", + ["Purge"] = "Reinigen", + ["Purification"] = "L\195\164uterung", + ["Purify"] = "L\195\164utern", + ["Pursuit of Justice"] = "Streben nach Gerechtigkeit", + ["Pyroblast"] = "Pyroschlag", + ["Pyroclasm"] = "Feuerschwall", + ["Quick Shots"] = "Schnelle Schüsse", + ["Quickness"] = "Schnelligkeit", + ["Rain of Fire"] = "Feuerregen", + ["Rake"] = "Krallenhieb", + ["Ram Riding"] = "Widderreiten", + ["Ranged Weapon Specialization"] = "Distanzwaffen-Spezialisierung", + ["Rapid Concealment"] = "Schnelles Verstecken", + ["Rapid Fire"] = "Schnellfeuer", + ["Raptor Riding"] = "Raptorreiten", + ["Raptor Strike"] = "Raptorsto\195\159", + ["Ravage"] = "Verheeren", + ["Readiness"] = "Bereitschaft", + ["Rebirth"] = "Wiedergeburt", + ["Reckless Charge"] = "Tollk?nes St?men", + ["Recklessness"] = "Tollk\195\188hnheit", + ["Reckoning"] = "Abrechnung", + ["Redemption"] = "Erl\195\182sung", + ["Redoubt"] = "Verschanzen", + ["Reflection"] = "Reflexion", + ["Regeneration"] = "Regeneration", + ["Regrowth"] = "Nachwachsen", + ["Reincarnation"] = "Reinkarnation", + ["Rejuvenation"] = "Verj\195\188ngung", + ["Relentless Strikes"] = "Unerbittliche St\195\182\195\159e", + ["Remorseless"] = "Gnadenlos", + ["Remorseless Attacks"] = "Gnadenlose Angriffe", + ["Remove Curse"] = "Fluch aufheben", + ["Remove Insignia"] = "Abzeichen entfernen", + ["Remove Lesser Curse"] = "Geringen Fluch aufheben", + ["Rend"] = "Verwunden", + ["Renew"] = "Erneuerung", + ["Repentance"] = "Bu\195\159e", + ["Resurrection"] = "Auferstehung", + ["Retaliation"] = "Gegenschlag", + ["Retribution Aura"] = "Aura der Vergeltung", + ["Revenge Stun"] = "Rachebet\195\164ubung", + ["Revenge"] = "Rache", + ["Reverberation"] = "Nachklingen", + ["Revive Pet"] = "Tier wiederbeleben", + ["Righteous Fury"] = "Zorn der Gerechtigkeit", + ["Rip"] = "Zerfetzen", + ["Riposte"] = "Riposte", + ["Ritual of Doom Effect"] = "Ritual der Verdammnis'-Effekt", + ["Ritual of Doom"] = "Ritual der Verdammnis", + ["Ritual of Summoning"] = "Ritual der Beschw\195\182rung", + ["Rockbiter Weapon"] = "Felsbei\195\159erwaffe", + ["Rogue Passive"] = "Schurke Passiv", + ["Ruin"] = "Verderben", + ["Rupture"] = "Blutung", + ["Ruthlessness"] = "Skrupellosigkeit", + ["Sacrifice"] = "Opferung", + ["Safe Fall"] = "Sicheres Fallen", + ["Sanctity Aura"] = "Aura der Heiligkeit", + ["Sap"] = "Kopfnuss", + ["Savage Fury"] = "Ungez\195\164hmte Wut", + ["Savage Strikes"] = "Wilde Schl\195\164ge", + ["Scare Beast"] = "Wildtier \195\164ngstigen", + ["Scatter Shot"] = "Streuschuss", + ["Scorch"] = "Versengen", + ["Scorpid Poison"] = "Skorpidgift", + ["Scorpid Sting"] = "Skorpidstich", + ["Screech"] = "Schrei", + ["Seal Fate"] = "Schicksal besiegeln", + ["Seal of Command"] = "Siegel des Befehls", + ["Seal of Justice"] = "Siegel der Gerechtigkeit", + ["Seal of Light"] = "Siegel des Lichts", + ["Seal of Righteousness"] = "Siegel der Rechtschaffenheit", + ["Seal of Wisdom"] = "Siegel der Weisheit", + ["Seal of the Crusader"] = "Siegel des Kreuzfahrers", + ["Searing Light"] = "Sengendes Licht", + ["Searing Pain"] = "Sengender Schmerz", + ["Searing Totem"] = "Totem der Verbrennung", + ["Seduction"] = "Verf\195\188hrung", + ["Sense Demons"] = "D\195\164monen sp\195\188ren", + ["Sense Undead"] = "Untote sp\195\188ren", + ["Sentry Totem"] = "Totem des Wachens", + ["Serpent Sting"] = "Schlangenbiss", + ["Setup"] = "Reinlegen", + ["Shackle Undead"] = "Untote fesseln", + ["Shadow Affinity"] = "Schattenaffinit\195\164t", + ["Shadow Bolt"] = "Schattenblitz", + ["Shadow Focus"] = "Schattenfokus", + ["Shadow Mastery"] = "Schattenbeherrschung", + ["Shadow Protection"] = "Schattenschutz", + ["Shadow Reach"] = "Schattenreichweite", + ["Shadow Resistance Aura"] = "Aura des Schattenwiderstands", + ["Shadow Resistance"] = "Schattenwiderstand", + ["Shadow Trance"] = "Schattentrance", + ["Shadow Vulnerability"] = "Schattenverwundbarkeit", + ["Shadow Ward"] = "Schattenzauberschutz", + ["Shadow Weaving"] = "Schattenwirken", + ["Shadow Word: Pain"] = "Schattenwort: Schmerz", + ["Shadowburn"] = "Schattenbrand", + ["Shadowform"] = "Schattengestalt", + ["Shadowguard"] = "Schattenschild", + ["Shadowmeld Passive"] = "Schattenmimik Passiv", + ["Shadowmeld"] = "Schattenhaftigkeit", + ["Sharpened Claws"] = "Gesch\195\164rfte Klauen", + ["Shatter"] = "Zertr\195\188mmern", + ["Shell Shield"] = "Panzerschild", + ["Shield Bash"] = "Schildhieb", + ["Shield Bash - Silenced"] = "Schildhieb - zum Schweigen gebracht", + ["Shield Block"] = "Schildblock", + ["Shield Slam"] = "Schildschlag", + ["Shield Specialization"] = "Schild-Spezialisierung", + ["Shield Wall"] = "Schildwall", + ["Shield"] = "Schild", + ["Shoot Bow"] = "Bogenschuss", + ["Shoot Crossbow"] = "Armbrust abschie\195\159en", + ["Shoot Gun"] = "Schusswaffe abfeuern", + ["Shoot"] = "Schie\195\159en", + ["Shred"] = "Schreddern", + ["Silence"] = "Stille", + ["Silent Resolve"] = "Schweigsame Entschlossenheit", + ["Sinister Strike"] = "Finsterer Sto\195\159", + ["Siphon Life"] = "Lebensentzug", + ["Skinning"] = "K\195\188rschnerei", + ["Slam"] = "Zerschmettern", + ["Sleep"] = "Schlaf", + ["Slice and Dice"] = "Zerh\195\164ckseln", + ["Slow Fall"] = "Langsamer Fall", + ["Smelting"] = "Verh\195\188ttung", + ["Smite"] = "G\195\182ttliche Pein", + ["Soothe Animal"] = "Tier bes\195\164nftigen", + ["Soothing Kiss"] = "Bes\195\164nftigender Kuss", + ["Soul Fire"] = "Seelenfeuer", + ["Soul Link"] = "Seelenverbindung", + ["Soul Siphon"] = "Seelen-Siphon", + ["Soulstone Resurrection"] = "Seelenstein-Auferstehung", + ["Spell Lock"] = "Zaubersperre", + ["Spell Warding"] = "Zauberschutz", + ["Spirit Bond"] = "Geistbande", + ["Spirit Tap"] = "Willensentzug", + ["Spirit of Redemption"] = "Geist der Erl\195\182sung", + ["Spiritual Focus"] = "Spiritueller Fokus", + ["Spiritual Guidance"] = "Geistige F\195\188hrung", + ["Spiritual Healing"] = "Spirituelle Heilung", + ["Sprint"] = "Sprinten", + ["Starfire"] = "Sternenfeuer", + ["Starfire Stun"] = "Sternenfeuer-Betubung", + ["Starshards"] = "Sternensplitter", + ["Staves"] = "St\195\164be", + ["Stealth"] = "Verstohlenheit", + ["Stoneclaw Totem"] = "Totem der Steinklaue", + ["Stoneform"] = "Steingestalt", + ["Stoneskin Totem"] = "Totem der Steinhaut", + ["Stormstrike"] = "Sturmschlag", + ["Strength of Earth Totem"] = "Totem der Erdst\195\164rke", + ["Stuck"] = "Feststecken", + ["Subtlety"] = "Feingef\195\188hl", + ["Suffering"] = "Leiden", + ["Summon Charger"] = "Streitross beschw\195\182ren", + ["Summon Dreadsteed"] = "Schreckensross herbeirufen", + ["Summon Felhunter"] = "Teufelsj\195\164ger beschw\195\182ren", + ["Summon Felsteed"] = "Teufelsross beschw\195\182ren", + ["Summon Imp"] = "Wichtel beschw\195\182ren", + ["Summon Succubus"] = "Sukkubus beschw\195\182ren", + ["Summon Voidwalker"] = "Leerwandler beschw\195\182ren", + ["Summon Warhorse"] = "Schlachtross beschw\195\182ren", + ["Sunder Armor"] = "R\195\188stung zerrei\195\159en", + ["Suppression"] = "Unterdr\195\188ckung", + ["Surefooted"] = "Sicherer Stand", + ["Survivalist"] = "\195\156berlebensk\195\188nstler", + ["Sweeping Strikes"] = "Weitreichende St\195\182\195\159e", +-- ["Swiftmend"] = true, + ["Swipe"] = "Prankenhieb", + ["Sword Specialization"] = "Schwert-Spezialisierung", + ["Tactical Mastery"] = "Taktiker", + ["Tainted Blood"] = "Besudeltes Blut", + ["Tailoring"] = "Schneiderei", + ["Tame Beast"] = "Wildtier z\195\164hmen", + ["Tamed Pet Passive"] = "Gez\195\164hmtes Tier - Passiv", + ["Taunt"] = "Spott", + ["Teleport: Darnassus"] = "Teleportieren: Darnassus", + ["Teleport: Ironforge"] = "Teleportieren: Ironforge", + ["Teleport: Moonglade"] = "Teleportieren: Moonglade", + ["Teleport: Orgrimmar"] = "Teleportieren: Orgrimmar", + ["Teleport: Stormwind"] = "Teleportieren: Stormwind", + ["Teleport: Thunder Bluff"] = "Teleportieren: Thunder Bluff", + ["Teleport: Undercity"] = "Teleportieren: Undercity", + ["The Human Spirit"] = "Unbeugsamkeit", + ["Thick Hide"] = "Dickes Fell", + ["Thorns"] = "Dornen", + ["Throw"] = "Werfen", + ["Throwing Specialization"] = "Wurfwaffen-Spezialisierung", + ["Throwing Weapon Specialization"] = "Wurfwaffen-Spezialisierung", + ["Thrown"] = "Wurfwaffe", + ["Thunder Clap"] = "Donnerknall", + ["Thundering Strikes"] = "Donnernde St\195\182\195\159e", + ["Thunderstomp"] = "Donnerstampfer", + ["Tidal Focus"] = "Gezeitenfokus", + ["Tidal Mastery"] = "Gezeitenbeherrschung", + ["Tiger Riding"] = "Tigerreiten", + ["Tiger's Fury"] = "Tigerfuror", + ["Torment"] = "Qual", + ["Totem"] = "Totem", + ["Totemic Focus"] = "Totemfokus", + ["Touch of Weakness"] = "Ber\195\188hrung der Schw\195\164che", + ["Toughness"] = "Z\195\164higkeit", + ["Track Beasts"] = "Wildtiere aufsp\195\188ren", + ["Track Demons"] = "D\195\164monen aufsp\195\188ren", + ["Track Dragonkin"] = "Drachkin aufsp\195\188ren", + ["Track Elementals"] = "Elementare aufsp\195\188ren", + ["Track Giants"] = "Riesen aufsp\195\188ren", + ["Track Hidden"] = "Verborgenes aufsp\195\188ren", + ["Track Humanoids"] = "Humanoide aufsp\195\188ren", + ["Track Undead"] = "Untote aufsp\195\188ren", + ["Tranquil Air Totem"] = "Totem der beruhigenden Winde", + ["Tranquil Spirit"] = "Gelassener Geist", + ["Tranquility"] = "Gelassenheit", + ["Tranquilizing Shot"] = "Einlullender Schuss", + ["Trap Mastery"] = "Fallenbeherrschung", + ["Travel Form"] = "Reisegestalt", + ["Tremor Totem"] = "Totem des Erdsto\195\159es", + ["Tribal Leatherworking"] = "Stammeslederverarbeitung", + ["Trueshot Aura"] = "Aura des Volltreffers", + ["Turn Undead"] = "Untote vertreiben", + ["Two-Handed Axes and Maces"] = "Zweihand\195\164xte und -Streitkolben", + ["Two-Handed Axes"] = "Zweihand\195\164xte", + ["Two-Handed Maces"] = "Zweihandstreitkolben", + ["Two-Handed Swords"] = "Zweihandschwerter", + ["Two-Handed Weapon Specialization"] = "Zweihandwaffen-Spezialisierung", + ["Unarmed"] = "Unbewaffnet", + ["Unbreakable Will"] = "Unbezwingbarer Wille", + ["Unbridled Wrath Effect"] = "Entfesselter Zorn'-Effekt", + ["Unbridled Wrath"] = "Entfesselter Zorn", + ["Undead Horsemanship"] = "Untotenreitkunst", + ["Underwater Breathing"] = "Unterwasseratmung", + ["Unending Breath"] = "Unendlicher Atem", + ["Unholy Power"] = "Unheilige Macht", + ["Unleashed Fury"] = "Entfesselter Zorn", + ["Unyielding Faith"] = "Unumst\195\182\195\159licher Glaube", + ["Vampiric Embrace"] = "Vampirumarmung", + ["Vanish"] = "Verschwinden", + ["Vanished"] = "Verschwunden", + ["Vengeance"] = "Rache", + ["Vigor"] = "Lebenskraft", + ["Vile Poisons"] = "\195\156ble Gifte", + ["Vindication"] = "Rechtschaffene Schw\195\164chung", + ["Viper Sting"] = "Vipernbiss", + ["Volley"] = "Salve", + ["Wand Specialization"] = "Zauberstab-Spezialisierung", + ["Wands"] = "Zauberst\195\164be", + ["War Stomp"] = "Kriegsdonner", + ["Water Breathing"] = "Wasseratmung", + ["Water Walking"] = "Wasserwandeln", + ["Weakened Soul"] = "Geschwächte Seele", + ["Weaponsmith"] = "Waffenschmied", + ["Whirlwind"] = "Wirbelwind", + ["Will of the Forsaken"] = "Wille der Verlassenen", + ["Windfury Totem"] = "Totem des Windzorns", + ["Windfury Weapon"] = "Waffe des Windfurors", + ["Windwall Totem"] = "Totem der Windmauer", + ["Wing Clip"] = "Zurechtstutzen", + ["Winter's Chill"] = "Winterk\195\164lte", + ["Wisp Spirit"] = "Irrwisch-Geist", + ["Wolf Riding"] = "Wolfreiten", + ["Wound Poison II"] = "Wundgift II", + ["Wound Poison III"] = "Wundgift III", + ["Wound Poison IV"] = "Wundgift IV", + ["Wound Poison"] = "Wundgift", + ["Wrath"] = "Zorn", + ["Wyvern Sting"] = "Stich des Fl\195\188geldrachen" + } +end) + +BabbleSpell:RegisterTranslations("frFR", function() + return { + ["Abolish Disease"] = "Abolir maladie", + ["Abolish Poison Effect"] = "Effet Abolir le poison", + ["Abolish Poison"] = "Abolir le poison", + ["Activate MG Turret"] = "Activation de la tourelle de mitrailleuse", + ["Adrenaline Rush"] = "Pouss\195\169e d'adr\195\169naline", + ["Aftermath"] = "Cons\195\169quences", + ["Aggression"] = "Agressivit\195\169", + ["Aimed Shot"] = "Vis\195\169e", + ["Alchemy"] = "Alchimie", + ["Ambush"] = "Embuscade", + ["Amplify Curse"] = "Mal\195\169diction amplifi\195\169e", + ["Amplify Magic"] = "Amplification de la magie", + ["Ancestral Fortitude"] = "Robustesse des anciens", + ["Ancestral Healing"] = "Gu\195\169rison des anciens", + ["Ancestral Knowledge"] = "Connaissance ancestrale", + ["Ancestral Spirit"] = "Esprit ancestral", + ["Anger Management"] = "Ma\195\174trise de la Rage", + ["Anticipation"] = "Anticipation", + ["Aquatic Form"] = "Forme aquatique", + ["Arcane Brilliance"] = "Illumination des arcanes", + ["Arcane Concentration"] = "Concentration des arcanes", + ["Arcane Explosion"] = "Explosion des arcanes", + ["Arcane Focus"] = "Focalisation des arcanes", + ["Arcane Instability"] = "Instabilit\195\169 des arcanes", + ["Arcane Intellect"] = "Intelligence des arcanes", + ["Arcane Meditation"] = "M\195\169ditation des arcanes", + ["Arcane Mind"] = "Esprit des arcanes", + ["Arcane Missiles"] = "Projectiles des arcanes", + ["Arcane Power"] = "Pouvoir des arcanes", + ["Arcane Resistance"] = "R\195\169sistance aux Arcanes", + ["Arcane Shot"] = "Tir des arcanes", + ["Arcane Subtlety"] = "Subtilit\195\169 des arcanes", + ["Arctic Reach"] = "Allonge arctique", + ["Armorsmith"] = "Fabricant d'armures", + ["Aspect of the Beast"] = "Aspect de la b\195\170te", + ["Aspect of the Cheetah"] = "Aspect du gu\195\169pard", + ["Aspect of the Hawk"] = "Aspect du faucon", + ["Aspect of the Monkey"] = "Aspect du singe", + ["Aspect of the Pack"] = "Aspect de la meute", + ["Aspect of the Wild"] = "Aspect de la nature", + ["Astral Recall"] = "Rappel astral", + ["Attack"] = "Attaque", + ["Attacking"] = "Attaque", + ["Auto Shot"] = "Tir automatique", + ["Axe Specialization"] = "Sp\195\169cialisation Hache", + ["Backstab"] = "Attaque sournoise", + ["Bane"] = "Fl\195\169au", + ["Banish"] = "Bannir", + ["Barkskin Effect"] = "Effet Ecorce", + ["Barkskin"] = "Ecorce", + ["Barrage"] = "Barrage", + ["Bash"] = "Sonner", + ["Basic Campfire"] = "Feu de camp basique", + ["Battle Shout"] = "Cri de guerre", + ["Battle Stance Passive"] = "Posture de combat", + ["Battle Stance"] = "Posture de combat", + ["Bear Form"] = "Forme d'ours", + ["Beast Lore"] = "Connaissance des b\195\170tes", + ["Beast Slaying"] = "Tueur de b\195\170tes", + ["Beast Training"] = "Apprivoisement", + ["Benediction"] = "B\195\169n\195\169diction", + ["Berserker Rage"] = "Rage berserker", + ["Berserker Stance Passive"] = "Posture berserker", + ["Berserker Stance"] = "Posture berserker", + ["Berserking"] = "Berserker", + ["Bestial Discipline"] = "Discipline bestiale", + ["Bestial Swiftness"] = "Rapidit\195\169 bestiale", + ["Bestial Wrath"] = "Courroux bestial", + ["Bite"] = "Morsure", + ["Black Arrow"] = "Fl\195\168che noire", + ["Blackout"] = "Aveuglement", + ["Blacksmithing"] = "Forge", + ["Blade Flurry"] = "D\195\169luge de lames", + ["Blast Wave"] = "Vague explosive", + ["Blessed Recovery"] = "R\195\169tablissement b\195\169ni", + ["Blessing of Freedom"] = "B\195\169n\195\169diction de libert\195\169", + ["Blessing of Kings"] = "B\195\169n\195\169diction des rois", + ["Blessing of Light"] = "B\195\169n\195\169diction de lumi\195\168re", + ["Blessing of Might"] = "B\195\169n\195\169diction de puissance", + ["Blessing of Protection"] = "B\195\169n\195\169diction de protection", + ["Blessing of Sacrifice"] = "B\195\169n\195\169diction de sacrifice", + ["Blessing of Salvation"] = "B\195\169n\195\169diction de salut", + ["Blessing of Sanctuary"] = "B\195\169n\195\169diction du sanctuaire", + ["Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse", + ["Blind"] = "C\195\169cit\195\169", + ["Blinding Powder"] = "Poudre aveuglante", + ["Blink"] = "Transfert", + ["Blizzard"] = "Blizzard", + ["Block"] = "Bloquer", + ["Blood Craze"] = "Folie sanguinaire", + ["Blood Frenzy"] = "Fr\195\169n\195\169sie sanglante", + ["Blood Fury"] = "Fureur sanguinaire", + ["Blood Pact"] = "Pacte de sang", + ["Bloodrage"] = "Rage sanguinaire", + ["Bloodthirst"] = "Sanguinaire", + ["Booming Voice"] = "Voix tonitruante", + ["Bow Specialization"] = "Sp\195\169cialisation Arc", + ["Bows"] = "Arcs", + ["Bright Campfire"] = "Feu de camp \195\169clatant", + ["Brutal Impact"] = "Impact brutal", + ["Burning Soul"] = "Ame ardente", + ["Call Pet"] = "Appel du familier", + ["Call of Flame"] = "Appel des flammes", + ["Call of Thunder"] = "Appel de la foudre", + ["Camouflage"] = "Dissimulation", + ["Cannibalize"] = "Cannibalisme", + ["Cat Form"] = "Forme de f\195\169lin", + ["Cataclysm"] = "Cataclysme", + ["Chain Heal"] = "Salve de gu\195\169rison", + ["Chain Lightning"] = "Cha\195\174ne d'\195\169clairs", + ["Challenging Roar"] = "Rugissement provocateur", + ["Challenging Shout"] = "Cri de d\195\169fi", + ["Charge Rage Bonus Effect"] = "Effet Bonus de Rage de la Charge", + ["Charge"] = "Charge", + ["Charge Stun"] = "Charge \195\169tourdissante", + ["Cheap Shot"] = "Coup bas", + ["Chilled"] = "Transi", + ["Claw"] = "Griffe", + ["Cleanse"] = "Epuration", + ["Clearcasting"] = "Id\195\169es claires", + ["Cleave"] = "Encha\195\174nement", + ["Clever Traps"] = "Pi\195\168ges astucieux", + ["Closing"] = "Fermeture", + ["Cloth"] = "Tissu", + ["Cobra Reflexes"] = "R\195\169flexes du cobra", + ["Cold Blood"] = "Sang froid", + ["Cold Snap"] = "Morsure de glace", + ["Combat Endurance"] = "Endurance de combat", + ["Combustion"] = "Combustion", + ["Command"] = "Commande", + ["Concentration Aura"] = "Aura de concentration", + ["Concussion Blow"] = "Bourrasque", + ["Concussion"] = "Commotion", + ["Concussive Shot"] = "Trait de choc", + ["Cone of Cold"] = "C\195\180ne de froid", + ["Conflagrate"] = "Conflagration", + ["Conjure Food"] = "Invocation de nourriture", + ["Conjure Mana Agate"] = "Invocation d'une agate de mana", + ["Conjure Mana Citrine"] = "Invocation d'une citrine de mana", + ["Conjure Mana Jade"] = "Invocation d'une jade de mana", + ["Conjure Mana Ruby"] = "Invocation d'un rubis de mana", + ["Conjure Water"] = "Invocation d'eau", + ["Consecration"] = "Cons\195\169cration", + ["Consume Shadows"] = "Consumer les ombres", + ["Convection"] = "Convection", + ["Conviction"] = "Conviction", + ["Cooking"] = "Cuisine", + ["Corruption"] = "Corruption", + ["Counterattack"] = "Contre-attaque", + ["Counterspell"] = "Contresort", + ["Counterspell - Silenced"] = "Contresort - Silencieux", + ["Cower"] = "D\195\169robade", + ["Create Firestone"] = "Cr\195\169ation de Pierre de feu", + ["Create Healthstone"] = "Cr\195\169ation de Pierre de soins", + ["Create Soulstone"] = "Cr\195\169ation de Pierre d'\195\162me", + ["Create Spellstone"] = "Cr\195\169ation de Pierre de sort", + ["Crippling Poison II"] = "Poison affaiblissant II", + ["Crippling Poison"] = "Poison affaiblissant", + ["Critical Mass"] = "Masse critique", + ["Crossbows"] = "Arbal\195\168tes", + ["Cruelty"] = "Cruaut\195\169", + ["Cultivation"] = "Culture", + ["Cure Disease"] = "Gu\195\169rison des maladies", + ["Cure Poison"] = "Gu\195\169rison du poison", + ["Curse of Agony"] = "Mal\195\169diction d'agonie", + ["Curse of Doom Effect"] = "Effet Mal\195\169diction funeste", + ["Curse of Doom"] = "Mal\195\169diction funeste", + ["Curse of Exhaustion"] = "Mal\195\169diction de fatigue", + ["Curse of Idiocy"] = "Mal\195\169diction d'idiotie", + ["Curse of Recklessness"] = "Mal\195\169diction de t\195\169m\195\169rit\195\169", + ["Curse of Shadow"] = "Mal\195\169diction de l'ombre", + ["Curse of Tongues"] = "Mal\195\169diction des langages", + ["Curse of Weakness"] = "Mal\195\169diction de faiblesse", + ["Curse of the Elements"] = "Mal\195\169diction des \195\169l\195\169ments", + ["Dagger Specialization"] = "Sp\195\169cialisation Dague", + ["Daggers"] = "Dagues", + ["Dampen Magic"] = "Att\195\169nuation de la magie", + ["Dark Pact"] = "Pacte noir", + ["Darkness"] = "T\195\169n\195\168bres", + ["Dash"] = "C\195\169l\195\169rit\195\169", + ["Deadly Poison II"] = "Poison mortel II", + ["Deadly Poison III"] = "Poison mortel III", + ["Deadly Poison IV"] = "Poison mortel IV", + ["Deadly Poison V"] = "Poison mortel V", + ["Deadly Poison"] = "Poison mortel", + ["Death Coil"] = "Voile mortel", + ["Death Wish"] = "Souhait mortel", + ["Deep Wounds"] = "Blessure profonde", + ["Defense"] = "D\195\169fense", + ["Defensive Stance Passive"] = "Posture d\195\169fensive", + ["Defensive Stance"] = "Posture d\195\169fensive", + ["Defensive State 2"] = "Posture d\195\169fensive 2", + ["Defensive State"] = "Posture d\195\169fensive", + ["Defiance"] = "D\195\169fi", + ["Deflection"] = "D\195\169viation", + ["Demon Armor"] = "Armure d\195\169moniaque", + ["Demon Skin"] = "Peau de d\195\169mon", + ["Demonic Embrace"] = "Baiser d\195\169moniaque", + ["Demonic Sacrifice"] = "Sacrifice d\195\169moniaque", + ["Demoralizing Roar"] = "Rugissement d\195\169moralisant", + ["Demoralizing Shout"] = "Cri d\195\169moralisant", + ["Desperate Prayer"] = "Pri\195\168re du d\195\169sespoir", + ["Destructive Reach"] = "Allonge de destruction", + ["Detect Greater Invisibility"] = "D\195\169tection de l'invisibilit\195\169 sup\195\169rieure", + ["Detect Invisibility"] = "D\195\169tection de l'invisibilit\195\169", + ["Detect Lesser Invisibility"] = "D\195\169tection de l'invisibilit\195\169 inf\195\169rieure", + ["Detect Magic"] = "D\195\169tection de la magie", + ["Detect Traps"] = "D\195\169tection des pi\195\168ges", + ["Detect"] = "D\195\169tection", + ["Deterrence"] = "Dissuasion", + ["Devastation"] = "D\195\169vastation", + ["Devotion Aura"] = "Aura de d\195\169votion", + ["Devour Magic Effect"] = "Effet festin magique", + ["Devour Magic"] = "Festin magique", + ["Devouring Plague"] = "Peste d\195\169vorante", + ["Diplomacy"] = "Diplomatie", + ["Dire Bear Form"] = "Forme d'ours redoutable", + ["Disarm Trap"] = "D\195\169sarmement de pi\195\168ge", + ["Disarm"] = "D\195\169sarmement", + ["Disease Cleansing Totem"] = "Totem de Purification des maladies", + ["Disenchant"] = "D\195\169senchanter", + ["Disengage"] = "D\195\169sengagement", + ["Dismiss Pet"] = "Renvoyer le familier", + ["Dispel Magic"] = "Dissipation de la magie", + ["Distract"] = "Distraction", + ["Distracting Shot"] = "Trait provocateur", + ["Dive"] = "Plongeon", + ["Divine Favor"] = "Faveur divine", + ["Divine Fury"] = "Fureur divine", + ["Divine Intellect"] = "Intelligence divine", + ["Divine Intervention"] = "Intervention divine", + ["Divine Protection"] = "Protection divine", + ["Divine Shield"] = "Bouclier divin", + ["Divine Spirit"] = "Esprit divin", + ["Divine Strength"] = "Force divine", + ["Dodge"] = "Esquiver", + ["Dragonscale Leatherworking"] = "Travail du cuir d'\195\169cailles de dragon", + ["Drain Life"] = "Drain de vie", + ["Drain Mana"] = "Drain de mana", + ["Drain Soul"] = "Siphon d'\195\162me", + ["Drink"] = "Boisson", + ["Dual Wield Specialization"] = "Sp\195\169cialisation Ambidextrie", + ["Dual Wield"] = "Ambidextrie", + ["Duel"] = "Duel", + ["Eagle Eye"] = "Oeil d'aigle", + ["Earth Shock"] = "Horion de terre", + ["Earthbind Totem"] = "Totem de lien terrestre", + ["Efficiency"] = "Efficacit\195\169", + ["Elemental Focus"] = "Focalisation \195\169l\195\169mentaire", + ["Elemental Fury"] = "Fureur \195\169l\195\169mentaire", + ["Elemental Leatherworking"] = "Travail du cuir \195\169l\195\169mentaire", + ["Elemental Mastery"] = "Ma\195\174trise \195\169l\195\169mentaire", + ["Elune's Grace"] = "Gr\195\162ce d'Elune", + ["Elusiveness"] = "Insaisissable", + ["Emberstorm"] = "Temp\195\170te ardente", + ["Enamored Water Spirit"] = "Esprit de l'eau amoureux", + ["Enchanting"] = "Enchantement", + ["Endurance Training"] = "Entra\195\174nement \195\160 l'Endurance", + ["Endurance"] = "Endurance", + ["Engineering Specialization"] = "Sp\195\169cialisation", + ["Engineering"] = "Ing\195\169nieur", + ["Enrage"] = "Enrager", + ["Enriched Manna Biscuit"] = "Biscuit enrichi en manne", + ["Enslave Demon"] = "Asservir d\195\169mon", + ["Entangling Roots"] = "Sarments", + ["Entrapment"] = "Pi\195\168ge", + ["Escape Artist"] = "Ma\195\174tre de l'\195\169vasion", + ["Evasion"] = "Evasion", + ["Eventide"] = "Tomb\195\169e du jour", + ["Eviscerate"] = "Evisc\195\169ration", + ["Evocation"] = "Evocation", + ["Execute"] = "Ex\195\169cution", + ["Exorcism"] = "Exorcisme", + ["Expansive Mind"] = "Pens\195\169e expansive", + ["Explosive Trap Effect"] = "Effet Pi\195\168ge explosif", + ["Explosive Trap"] = "Pi\195\168ge explosif", + ["Expose Armor"] = "Exposer l'armure", + ["Eye for an Eye"] = "Oeil pour oeil", + ["Eye of Kilrogg"] = "Oeil de Kilrogg", + ["Eyes of the Beast"] = "Oeil de la b\195\170te", + ["Fade"] = "Oubli", + ["Faerie Fire"] = "Lucioles", + ["Faerie Fire (Feral)"] = "Lucioles (farouche)", + ["Far Sight"] = "Double vue", + ["Fear Ward"] = "Gardien de peur", + ["Fear"] = "Peur", + ["Feed Pet"] = "Nourrir le familier", + ["Feedback"] = "R\195\169action", + ["Feign Death"] = "Feindre la mort", + ["Feint"] = "Feinte", + ["Fel Concentration"] = "Concentration corrompue", + ["Fel Domination"] = "Domination corrompue", + ["Fel Intellect"] = "Intelligence corrompue", + ["Fel Stamina"] = "Endurance corrompue", + ["Felfire"] = "Gangrefeu", + ["Feline Grace"] = "Gr\195\162ce f\195\169line", + ["Feline Swiftness"] = "C\195\169l\195\169rit\195\169 f\195\169line", + ["Feral Aggression"] = "Agressivit\195\169 farouche", + ["Feral Charge"] = "Charge farouche", + ["Feral Instinct"] = "Instinct farouche", + ["Ferocious Bite"] = "Morsure f\195\169roce", + ["Ferocity"] = "Ferocit\195\169", + ["Fetish"] = "F\195\169tiche", + ["Find Herbs"] = "D\195\169couverte d'herbes", + ["Find Minerals"] = "D\195\169couverte de gisements", + ["Find Treasure"] = "D\195\169couverte de tr\195\169sors", + ["Fire Blast"] = "Trait de feu", + ["Fire Nova Totem"] = "Totem Nova de feu", + ["Fire Power"] = "Puissance du feu", + ["Fire Resistance Aura"] = "Aura de r\195\169sistance au Feu", + ["Fire Resistance Totem"] = "Totem de r\195\169sistance au feu", + ["Fire Resistance"] = "R\195\169sistance au Feu", + ["Fire Shield"] = "Bouclier de feu", + ["Fire Vulnerability"] = "Vuln\195\169rabilit\195\169 au Feu", + ["Fire Ward"] = "Gardien de feu", + ["Fireball"] = "Boule de feu", + ["Firebolt"] = "Eclair de feu", + ["First Aid"] = "Secourisme", + ["Fishing Poles"] = "Cannes \195\160 p\195\170che", + ["Fishing"] = "P\195\170che", + ["Fist Weapon Specialization"] = "Sp\195\169cialisation Arme de pugilat", + ["Fist Weapons"] = "Armes de pugilat", + ["Flame Shock"] = "Horion de flammes", + ["Flame Throwing"] = "Jet de flammes", + ["Flamestrike"] = "Choc de flammes", + ["Flamethrower"] = "Lance-flammes", + ["Flametongue Totem"] = "Totem Langue de feu", + ["Flametongue Weapon"] = "Arme Langue de feu", + ["Flare"] = "Fus\195\169e \195\169clairante", + ["Flash Heal"] = "Soins rapides", + ["Flash of Light"] = "Eclair lumineux", + ["Flurry"] = "Rafale", + ["Focused Casting"] = "Incantation focalis\195\169e", + ["Food"] = "Nourriture", + ["Forbearance"] = "Longanimit\195\169", + ["Force of Will"] = "Force de volont\195\169", + ["Freezing Trap Effect"] = "Effet Pi?e givrant", + ["Freezing Trap"] = "Pi\195\168ge givrant", + ["Frenzied Regeneration"] = "R\195\169g\195\169n\195\169ration fr\195\169n\195\169tique", + ["Frenzy"] = "Fr\195\169n\195\169sie", + ["Frost Armor"] = "Armure de givre", + ["Frost Channeling"] = "Canalisation du givre", + ["Frost Nova"] = "Nova de givre", + ["Frost Resistance Aura"] = "Aura de r\195\169sistance au Givre", + ["Frost Resistance Totem"] = "Totem de r\195\169sistance au Givre", + ["Frost Resistance"] = "R\195\169sistance au Givre", + ["Frost Shock"] = "Horion de givre", + ["Frost Trap"] = "Pi\195\168ge de givre", + ["Frost Trap Aura"] = "Effet Pi\195\168ge de givre", + ["Frost Ward"] = "Gardien de givre", + ["Frostbite"] = "Morsure du givre", + ["Frostbolt"] = "Eclair de givre", + ["Frostbrand Weapon"] = "Arme de givre", + ["Furious Howl"] = "Hurlement furieux", + ["Furor"] = "Fureur", + ["Garrote"] = "Garrot", + ["Generic"] = "G\195\169n\195\169rique", + ["Ghost Wolf"] = "Loup fant\195\180me", + ["Ghostly Strike"] = "Frappe fantomatique", + ["Gift of Nature"] = "Don de la Nature", + ["Gift of the Wild"] = "Don du fauve", + ["Gouge"] = "Suriner", + ["Grace of Air Totem"] = "Totem de Gr\195\162ce a\195\169rienne", + ["Great Stamina"] = "Endurance sup\195\169rieure", + ["Greater Blessing of Kings"] = "B\195\169n\195\169diction des rois sup\195\169rieure", + ["Greater Blessing of Light"] = "B\195\169n\195\169diction de lumi\195\168re sup\195\169rieure", + ["Greater Blessing of Might"] = "B\195\169n\195\169diction de puissance sup\195\169rieure", + ["Greater Blessing of Salvation"] = "B\195\169n\195\169diction de salut sup\195\169rieure", + ["Greater Blessing of Sanctuary"] = "B\195\169n\195\169diction du sanctuaire sup\195\169rieure", + ["Greater Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse sup\195\169rieure", + ["Greater Heal"] = "Soins sup\195\169rieurs", + ["Grim Reach"] = "Allonge sinistre", + ["Grounding Totem"] = "Totem de Gl\195\168be", + ["Grovel"] = "Ramper", + ["Growl"] = "Grondement", + ["Guardian's Favor"] = "Faveur du Gardien", + ["Gun Specialization"] = "Sp\195\169cialisation Armes \195\160 feu", + ["Guns"] = "Armes \195\160 feu", + ["Hammer of Justice"] = "Marteau de la justice", + ["Hand of Justice"] = "Main de justice", + ["Hammer of Wrath"] = "Marteau de courroux", + ["Hamstring"] = "Brise-genou", + ["Harass"] = "Harc\195\168lement", + ["Hardiness"] = "Solidit\195\169", + ["Hawk Eye"] = "Oeil de faucon", + ["Heal"] = "Soins", + ["Healing Focus"] = "Focalisation des soins", + ["Healing Light"] = "Lumi\195\168re gu\195\169risseuse", + ["Healing Stream Totem"] = "Totem gu\195\169risseur", + ["Healing Touch"] = "Toucher gu\195\169risseur", + ["Healing Wave"] = "Vague de soins", + ["Healing Way"] = "Flots de soins", + ["Health Funnel"] = "Captation de vie", + ["Heart of the Wild"] = "C\197\147ur de fauve", + ["Hellfire Effect"] = "Effet Flammes infernales", + ["Hellfire"] = "Flammes infernales", + ["Hemorrhage"] = "H\195\169morragie", + ["Herb Gathering"] = "Cueillette", + ["Herbalism"] = "Herboristerie", + ["Heroic Strike"] = "Frappe h\195\169ro\195\175que", + ["Hex of Weakness"] = "Mal\195\169fice de faiblesse", + ["Hibernate"] = "Hibernation", + ["Holy Fire"] = "Flammes sacr\195\169es", + ["Holy Light"] = "Lumi\195\168re sacr\195\169e", + ["Holy Nova"] = "Nova sacr\195\169e", + ["Holy Power"] = "Puissance sacr\195\169e", + ["Holy Reach"] = "Allonge du Sacr\195\169", + ["Holy Shield"] = "Bouclier sacr\195\169", + ["Holy Shock"] = "Horion sacr\195\169", + ["Holy Specialization"] = "Sp\195\169cialisation", + ["Holy Wrath"] = "Col\195\168re divine", + ["Honorless Target"] = "Cible sans honneur", + ["Horse Riding"] = "Equitation", + ["Howl of Terror"] = "Hurlement de terreur", + ["Humanoid Slaying"] = "Tueur d'humano\195\175des", + ["Hunter's Mark"] = "Marque du chasseur", + ["Hurricane"] = "Ouragan", + ["Ice Armor"] = "Armure de glace", + ["Ice Barrier"] = "Barri\195\168re de glace", + ["Ice Block"] = "Parade de glace", + ["Ice Shards"] = "Eclats de glace", + ["Ignite"] = "Enflammer", + ["Illumination"] = "Illumination", + ["Immolate"] = "Immolation", + ["Immolation Trap Effect"] = "Effet Pi\195\168ge immolation", + ["Immolation Trap"] = "Pi\195\168ge d'Immolation", + ["Impact"] = "Impact", + ["Impale"] = "Empaler", + ["Improved Ambush"] = "Embuscade am\195\169lior\195\169e", + ["Improved Arcane Explosion"] = "Explosion des arcanes am\195\169lior\195\169e", + ["Improved Arcane Missiles"] = "Projectiles des arcanes am\195\169lior\195\169s", + ["Improved Arcane Shot"] = "Tir des arcanes am\195\169lior\195\169", + ["Improved Aspect of the Hawk"] = "Aspect du faucon am\195\169lior\195\169", + ["Improved Aspect of the Monkey"] = "Aspect du singe am\195\169lior\195\169", + ["Improved Backstab"] = "Attaque sournoise am\195\169lior\195\169e", + ["Improved Battle Shout"] = "Cri de guerre am\195\169lior\195\169", + ["Improved Berserker Rage"] = "Rage berserker am\195\169lior\195\169e", + ["Improved Blessing of Might"] = "B\195\169n\195\169diction de puissance am\195\169lior\195\169e", + ["Improved Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse am\195\169lior\195\169e", + ["Improved Blizzard"] = "Blizzard am\195\169lior\195\169", + ["Improved Bloodrage"] = "Rage sanguinaire am\195\169lior\195\169e", + ["Improved Chain Heal"] = "Salve de gu\195\169rison am\195\169lior\195\169e", + ["Improved Chain Lightning"] = "Cha\195\174ne d'\195\169clairs am\195\169lior\195\169e", + ["Improved Challenging Shout"] = "Cri de d\195\169fi am\195\169lior\195\169", + ["Improved Charge"] = "Charge am\195\169lior\195\169e", + ["Improved Cheap Shot"] = "Coup bas am\195\169lior\195\169", + ["Improved Cleave"] = "Encha\195\174nement am\195\169lior\195\169", + ["Improved Concentration Aura"] = "Aura de concentration am\195\169lior\195\169e", + ["Improved Concussive Shot"] = "Trait de choc am\195\169lior\195\169", + ["Improved Cone of Cold"] = "C\195\180ne de froid am\195\169lior\195\169", + ["Improved Corruption"] = "Corruption am\195\169lior\195\169e", + ["Improved Counterspell"] = "Contresort am\195\169lior\195\169", + ["Improved Curse of Agony"] = "Mal\195\169diction d'agonie am\195\169lior\195\169e", + ["Improved Curse of Exhaustion"] = "Mal\195\169diction de fatigue am\195\169lior\195\169e", + ["Improved Curse of Weakness"] = "Mal\195\169diction de faiblesse am\195\169lior\195\169e", + ["Improved Dampen Magic"] = "Att\195\169nuation de la magie am\195\169lior\195\169e", + ["Improved Deadly Poison"] = "Poison mortel am\195\169lior\195\169", + ["Improved Demoralizing Shout"] = "Cri d\195\169moralisant am\195\169lior\195\169", + ["Improved Devotion Aura"] = "Aura de d\195\169votion am\195\169lior\195\169e", + ["Improved Disarm"] = "D\195\169sarmement am\195\169lior\195\169", + ["Improved Distract"] = "Distraction am\195\169lior\195\169e", + ["Improved Drain Life"] = "Drain de vie am\195\169lior\195\169", + ["Improved Drain Mana"] = "Drain de mana am\195\169lior\195\169", + ["Improved Drain Soul"] = "Siphon d'\195\162me am\195\169lior\195\169", + ["Improved Enrage"] = "Enrager am\195\169lior\195\169", + ["Improved Enslave Demon"] = "Asservir d\195\169mon am\195\169lior\195\169", + ["Improved Entangling Roots"] = "Sarments am\195\169lior\195\169s", + ["Improved Evasion"] = "Evasion am\195\169lior\195\169e", + ["Improved Eviscerate"] = "Evisc\195\169ration am\195\169lior\195\169e", + ["Improved Execute"] = "Ex\195\169cution am\195\169lior\195\169e", + ["Improved Expose Armor"] = "Exposer l'armure am\195\169lior\195\169", + ["Improved Eyes of the Beast"] = "Oeil de la b\195\170te am\195\169lior\195\169", + ["Improved Fade"] = "Oubli am\195\169lior\195\169", + ["Improved Feign Death"] = "Feindre la mort am\195\169lior\195\169", + ["Improved Fire Blast"] = "Trait de feu am\195\169lior\195\169", + ["Improved Fire Nova Totem"] = "Totem Nova de feu am\195\169lior\195\169", + ["Improved Fire Ward"] = "Gardien de feu am\195\169lior\195\169", + ["Improved Fireball"] = "Boule de feu am\195\169lior\195\169e", + ["Improved Firebolt"] = "Eclair de feu am\195\169lior\195\169", + ["Improved Firestone"] = "Pierre de feu am\195\169lior\195\169e", + ["Improved Flamestrike"] = "Choc de flammes am\195\169lior\195\169", + ["Improved Flametongue Weapon"] = "Arme Langue de feu am\195\169lior\195\169e", + ["Improved Flash of Light"] = "Eclair lumineux am\195\169lior\195\169", + ["Improved Frost Nova"] = "Nova de givre am\195\169lior\195\169e", + ["Improved Frost Ward"] = "Gardien de givre am\195\169lior\195\169", + ["Improved Frostbolt"] = "Eclair de givre am\195\169lior\195\169", + ["Improved Frostbrand Weapon"] = "Arme de givre am\195\169lior\195\169e", + ["Improved Garrote"] = "Garrot am\195\169lior\195\169", + ["Improved Ghost Wolf"] = "Loup fant\195\180me am\195\169lior\195\169", + ["Improved Gouge"] = "Suriner am\195\169lior\195\169", + ["Improved Grace of Air Totem"] = "Totem de Gr\195\162ce a\195\169rienne am\195\169lior\195\169", + ["Improved Grounding Totem"] = "Totem de Gl\195\168be am\195\169lior\195\169", + ["Improved Hammer of Justice"] = "Marteau de la justice am\195\169lior\195\169", + ["Improved Hamstring"] = "Brise-genou am\195\169lior\195\169", + ["Improved Healing Stream Totem"] = "Totem gu\195\169risseur am\195\169lior\195\169", + ["Improved Healing Touch"] = "Toucher gu\195\169risseur am\195\169lior\195\169", + ["Improved Healing Wave"] = "Vague de soins am\195\169lior\195\169e", + ["Improved Healing"] = "Soin am\195\169lior\195\169", + ["Improved Health Funnel"] = "Captation de vie am\195\169lior\195\169e", + ["Improved Healthstone"] = "Pierre de soins am\195\169lior\195\169e", + ["Improved Heroic Strike"] = "Frappe h\195\169ro\195\175que am\195\169lior\195\169e", + ["Improved Hunter's Mark"] = "Marque du chasseur am\195\169lior\195\169e", + ["Improved Immolate"] = "Immolation am\195\169lior\195\169e", + ["Improved Imp"] = "Diablotin am\195\169lior\195\169", + ["Improved Inner Fire"] = "Feu int\195\169rieur am\195\169lior\195\169", + ["Improved Instant Poison"] = "Poison instantan\195\169 am\195\169lior\195\169", + ["Improved Intercept"] = "Interception am\195\169lior\195\169e", + ["Improved Intimidating Shout"] = "Cri d\226\128\153intimidation am\195\169lior\195\169", + ["Improved Judgement"] = "Jugement am\195\169lior\195\169", + ["Improved Kick"] = "Coup de pied am\195\169lior\195\169", + ["Improved Kidney Shot"] = "Aiguillon perfide am\195\169lior\195\169", + ["Improved Lash of Pain"] = "Fouet de la douleur am\195\169lior\195\169", + ["Improved Lay on Hands"] = "Imposition des mains am\195\169lior\195\169e", + ["Improved Lesser Healing Wave"] = "Vague de soins inf\195\169rieurs am\195\169lior\195\169e", + ["Improved Life Tap"] = "Connexion am\195\169lior\195\169e", + ["Improved Lightning Bolt"] = "Eclair am\195\169lior\195\169", + ["Improved Lightning Shield"] = "Bouclier de foudre am\195\169lior\195\169", + ["Improved Magma Totem"] = "Totem de Magma am\195\169lior\195\169", + ["Improved Mana Burn"] = "Br\195\187lure de mana am\195\169lior\195\169e", + ["Improved Mana Shield"] = "Bouclier de mana am\195\169lior\195\169", + ["Improved Mana Spring Totem"] = "Totem Fontaine de mana am\195\169lior\195\169", + ["Improved Mark of the Wild"] = "Marque du fauve am\195\169lior\195\169e", + ["Improved Mend Pet"] = "Gu\195\169rison du familier am\195\169lior\195\169e", + ["Improved Mind Blast"] = "Attaque mentale am\195\169lior\195\169e", + ["Improved Moonfire"] = "Eclat lunaire am\195\169lior\195\169", + ["Improved Nature's Grasp"] = "Emprise de la nature am\195\169lior\195\169e", + ["Improved Overpower"] = "Fulgurance am\195\169lior\195\169e", + ["Improved Power Word: Fortitude"] = "Mot de pouvoir : Robustesse am\195\169lior\195\169", + ["Improved Power Word: Shield"] = "Mot de pouvoir : Bouclier am\195\169lior\195\169", + ["Improved Prayer of Healing"] = "Pri\195\168re de soins am\195\169lior\195\169e", + ["Improved Psychic Scream"] = "Cri psychique am\195\169lior\195\169", + ["Improved Pummel"] = "Vol\195\169e de coups am\195\169lior\195\169e", + ["Improved Regrowth"] = "R\195\169tablissement am\195\169lior\195\169", + ["Improved Reincarnation"] = "R\195\169incarnation am\195\169lior\195\169e", + ["Improved Rejuvenation"] = "R\195\169cup\195\169ration am\195\169lior\195\169e", + ["Improved Rend"] = "Pourfendre am\195\169lior\195\169", + ["Improved Renew"] = "R\195\169novation am\195\169lior\195\169e", + ["Improved Retribution Aura"] = "Aura de vindicte am\195\169lior\195\169e", + ["Improved Revenge"] = "Vengeance am\195\169lior\195\169e", + ["Improved Revive Pet"] = "Ressusciter le familier am\195\169lior\195\169", + ["Improved Righteous Fury"] = "Fureur vertueuse am\195\169lior\195\169e", + ["Improved Rockbiter Weapon"] = "Arme Croque-roc am\195\169lior\195\169e", + ["Improved Rupture"] = "Rupture am\195\169lior\195\169e", + ["Improved Sap"] = "Assommer am\195\169lior\195\169", + ["Improved Scorch"] = "Br\195\187lure am\195\169lior\195\169e", + ["Improved Scorpid Sting"] = "Piq\195\187re de scorpide am\195\169lior\195\169e", + ["Improved Seal of Righteousness"] = "Sceau de pi\195\169t\195\169 am\195\169lior\195\169", + ["Improved Seal of the Crusader"] = "Sceau du Crois\195\169 am\195\169lior\195\169", + ["Improved Searing Pain"] = "Douleur br\195\187lante am\195\169lior\195\169e", + ["Improved Searing Totem"] = "Totem incendiaire am\195\169lior\195\169", + ["Improved Serpent Sting"] = "Morsure de serpent am\195\169lior\195\169e", + ["Improved Shadow Bolt"] = "Trait de l'ombre am\195\169lior\195\169", + ["Improved Shadow Word: Pain"] = "Mot de l'ombre : Douleur am\195\169lior\195\169", + ["Improved Shield Bash"] = "Coup de bouclier am\195\169lior\195\169", + ["Improved Shield Block"] = "Ma\195\174trise du blocage am\195\169lior\195\169e", + ["Improved Shield Wall"] = "Mur protecteur am\195\169lior\195\169", + ["Improved Shred"] = "Lambeau am\195\169lior\195\169", + ["Improved Sinister Strike"] = "Attaque pernicieuse am\195\169lior\195\169e", + ["Improved Slam"] = "Heurtoir am\195\169lior\195\169", + ["Improved Slice and Dice"] = "D\195\169biter am\195\169lior\195\169", + ["Improved Spellstone"] = "Pierre de sort am\195\169lior\195\169e", + ["Improved Sprint"] = "Sprint am\195\169lior\195\169", + ["Improved Starfire"] = "Feu stellaire am\195\169lior\195\169", + ["Improved Stoneclaw Totem"] = "Totem de Griffes de pierre am\195\169lior\195\169", + ["Improved Stoneskin Totem"] = "Totem de Peau de pierre am\195\169lior\195\169", + ["Improved Strength of Earth Totem"] = "Totem de Force de la Terre am\195\169lior\195\169", + ["Improved Succubus"] = "Succube am\195\169lior\195\169e", + ["Improved Sunder Armor"] = "Fracasser armure am\195\169lior\195\169", + ["Improved Taunt"] = "Provocation am\195\169lior\195\169e", + ["Improved Thorns"] = "Epines am\195\169lior\195\169es", + ["Improved Thunder Clap"] = "Coup de tonnerre am\195\169lior\195\169", + ["Improved Tranquility"] = "Tranquillit\195\169 am\195\169lior\195\169e", + ["Improved Vampiric Embrace"] = "Etreinte vampirique am\195\169lior\195\169e", + ["Improved Vanish"] = "Disparition am\195\169lior\195\169e", + ["Improved Voidwalker"] = "Marcheur du Vide am\195\169lior\195\169", + ["Improved Windfury Weapon"] = "Arme Furie-des-vents am\195\169lior\195\169e", + ["Improved Wing Clip"] = "Coupure d'ailes am\195\169lior\195\169e", + ["Improved Wrath"] = "Col\195\168re am\195\169lior\195\169e", + ["Incinerate"] = "Incin\195\169rer", + ["Inferno"] = "Inferno", + ["Initiative"] = "Initiative", + ["Inner Fire"] = "Feu int\195\169rieur", + ["Inner Focus"] = "Focalisation am\195\169lior\195\169e", + ["Innervate"] = "Innervation", + ["Insect Swarm"] = "Essaim d'insectes", + ["Inspiration"] = "Inspiration", + ["Instant Poison II"] = "Poison instantan\195\169 II", + ["Instant Poison III"] = "Poison instantan\195\169 III", + ["Instant Poison IV"] = "Poison instantan\195\169 IV", + ["Instant Poison V"] = "Poison instantan\195\169 V", + ["Instant Poison VI"] = "Poison instantan\195\169 VI", + ["Instant Poison"] = "Poison instantan\195\169", + ["Intensity"] = "Intensit\195\169", + ["Intercept"] = "Interception", + ["Intercept Stun"] = "Interception étourdissante", + ["Intimidating Shout"] = "Cri d\226\128\153intimidation", + ["Intimidation"] = "Intimidation", + ["Iron Will"] = "Volont\195\169 de fer", + ["Judgement of Command"] = "Jugement d'autorit\195\169", + ["Judgement of Justice"] = "Jugement de justice", + ["Judgement of Light"] = "Jugement de lumi\195\168re", + ["Judgement of Righteousness"] = "Jugement de pi\195\169t\195\169", + ["Judgement of Wisdom"] = "Jugement de sagesse", + ["Judgement of the Crusader"] = "Jugement du Crois\195\169", + ["Judgement"] = "Jugement", + ["Kick"] = "Coup de pied", + ["Kick - Silenced"] = "Coup de pied - Silencieux", + ["Kidney Shot"] = "Aiguillon perfide", + ["Killer Instinct"] = "Instinct du tueur", + ["Kodo Riding"] = "Monte de kodo", + ["Lash of Pain"] = "Fouet de la douleur", + ["Last Stand"] = "Dernier rempart", + ["Lasting Judgement"] = "Jugement durable", + ["Lay on Hands"] = "Imposition des mains", + ["Leader of the Pack"] = "Chef de la meute", + ["Leather"] = "Cuir", + ["Leatherworking"] = "Travail du cuir", + ["Lesser Heal"] = "Soins inf\195\169rieurs", + ["Lesser Healing Wave"] = "Vague de soins inf\195\169rieurs", + ["Lesser Invisibility"] = "Invisibilit\195\169 inf\195\169rieure", + ["Lethal Shots"] = "Coups fatals", + ["Lethality"] = "Mortalit\195\169", + ["Levitate"] = "L\195\169vitation", + ["Libram"] = "Libram", + ["Life Tap"] = "Connexion", + ["Lightning Bolt"] = "Eclair", + ["Lightning Breath"] = "Souffle de foudre", + ["Lightning Mastery"] = "Ma\195\174trise de la foudre", + ["Lightning Reflexes"] = "R\195\169flexes \195\169clairs", + ["Lightning Shield"] = "Bouclier de foudre", + ["Lightwell Renew"] = "R\195\169novation du Puits de lumi\195\168re", + ["Lightwell"] = "Puits de lumi\195\168re", + ["Lockpicking"] = "Crochetage", + ["Long Daze"] = "H\195\169b\195\169tement prolong\195\169", + ["Mace Specialization"] = "Sp\195\169cialisation Masse", + ["Mace Stun Effect"] = "Effet \195\169tourdissant de la masse", + ["Mage Armor"] = "Armure du mage", + ["Magma Totem"] = "Totem de Magma", + ["Mail"] = "Mailles", + ["Malice"] = "Malice", + ["Mana Burn"] = "Br\195\187lure de mana", + ["Mana Shield"] = "Bouclier de mana", + ["Mana Spring Totem"] = "Totem Fontaine de mana", + ["Mana Tide Totem"] = "Totem de Vague de mana", + ["Mangle"] = "Mutilation", + ["Mark of the Wild"] = "Marque du fauve", + ["Martyrdom"] = "Martyre", + ["Master Demonologist"] = "Ma\195\174tre d\195\169monologue", + ["Master Summoner"] = "Ma\195\174tre invocateur", + ["Master of Deception"] = "Ma\195\174tre des illusions", + ["Maul"] = "Mutiler", + ["Mechanostrider Piloting"] = "Pilotage de m\195\169canotrotteur", + ["Meditation"] = "M\195\169ditation", + ["Melee Specialization"] = "Sp\195\169cialisation M\195\170l\195\169e", + ["Mend Pet"] = "Gu\195\169rison du familier", + ["Mental Agility"] = "Sagacit\195\169", + ["Mental Strength"] = "Force mentale", + ["Mind Blast"] = "Attaque mentale", + ["Mind Control"] = "Contr\195\180le mental", + ["Mind Flay"] = "Fouet mental", + ["Mind Soothe"] = "Apaisement", + ["Mind Vision"] = "Vision t\195\169l\195\169pathique", + ["Mind-numbing Poison II"] = "Poison de distraction mentale II", + ["Mind-numbing Poison III"] = "Poison de distraction mentale III", + ["Mind-numbing Poison"] = "Poison de distraction mentale", + ["Mining"] = "Minage", + ["Mocking Blow"] = "Coup railleur", + ["Mongoose Bite"] = "Morsure de la mangouste", + ["Monster Slaying"] = "Tueur de monstres", + ["Moonfire"] = "Eclat lunaire", + ["Moonfury"] = "Fureur lunaire", + ["Moonglow"] = "Lueur de la lune", + ["Moonkin Aura"] = "Aura de s\195\169l\195\169nien", + ["Moonkin Form"] = "Forme de s\195\169l\195\169nien", + ["Mortal Shots"] = "Coups mortels", + ["Mortal Strike"] = "Frappe mortelle", + ["Multi-Shot"] = "Fl\195\168ches multiples", + ["Murder"] = "Meurtre", + ["Natural Armor"] = "Armure naturelle", + ["Natural Shapeshifter"] = "Changeforme naturel", + ["Natural Weapons"] = "Armes naturelles", + ["Nature Resistance Totem"] = "Totem de r\195\169sistance \195\160 la Nature", + ["Nature Resistance"] = "R\195\169sistance \195\160 la Nature", + ["Nature's Focus"] = "Focalisation de la nature", + ["Nature's Grace"] = "Gr\195\162ce de la nature", + ["Nature's Grasp"] = "Emprise de la nature", + ["Nature's Reach"] = "Allonge de la Nature", + ["Nature's Swiftness"] = "Rapidit\195\169 de la nature", + ["Nightfall"] = "Cr\195\169puscule", + ["Omen of Clarity"] = "Augure de clart\195\169", + ["One-Handed Axes"] = "Haches", + ["One-Handed Maces"] = "Masses", + ["One-Handed Swords"] = "Ep\195\169es", + ["One-Handed Weapon Specialization"] = "Sp\195\169cialisation Arme 1M", + ["Opening - No Text"] = "Ouverture - pas de texte", + ["Opening"] = "Ouverture", + ["Opportunity"] = "Opportunit\195\169", + ["Overpower"] = "Fulgurance", + ["Paranoia"] = "Parano\195\175a", + ["Parry"] = "Parade", + ["Pathfinding"] = "Science des chemins", + ["Perception"] = "Perception", + ["Permafrost"] = "Gel prolong\195\169", + ["Pet Aggression"] = "Agressivit\195\169 du familier", + ["Pet Hardiness"] = "Robustesse du familier", + ["Pet Recovery"] = "R\195\169tablissement du familier", + ["Pet Resistance"] = "R\195\169sistance du familier", + ["Phase Shift"] = "Changement de phase", + ["Pick Lock"] = "Crochetage", + ["Pick Pocket"] = "Vol \195\160 la tire", + ["Piercing Howl"] = "Hurlement per\195\167ant", + ["Piercing Ice"] = "Glace per\195\167ante", + ["Plate Mail"] = "Armure en plaques", + ["Poison Cleansing Totem"] = "Totem de Purification du poison", + ["Poisons"] = "Poisons", + ["Polearm Specialization"] = "Sp\195\169cialisation Arme d'hast", + ["Polearms"] = "Armes d'hast", + ["Polymorph"] = "M\195\169tamorphose", + ["Polymorph: Pig"] = "M\195\169tamorphose: cochon", + ["Polymorph: Turtle"] = "M\195\169tamorphose: Tortue", -- all other polymorph spells don't have a capital letter before the animal name, to test + ["Portal: Darnassus"] = "Portail : Darnassus", + ["Portal: Ironforge"] = "Portail : Ironforge", + ["Portal: Orgrimmar"] = "Portail : Orgrimmar", + ["Portal: Stormwind"] = "Portail : Stormwind", + ["Portal: Thunder Bluff"] = "Portail : Thunder Bluff", + ["Portal: Undercity"] = "Portail : Undercity", + ["Pounce Bleed"] = "Traquenard sanglant", + ["Pounce"] = "Traquenard", + ["Power Infusion"] = "Infusion de puissance", + ["Power Word: Fortitude"] = "Mot de pouvoir : Robustesse", + ["Power Word: Shield"] = "Mot de pouvoir : Bouclier", + ["Prayer of Fortitude"] = "Pri\195\168re de robustesse", + ["Prayer of Healing"] = "Pri\195\168re de soins", + ["Prayer of Shadow Protection"] = "Pri\195\168re de protection contre l'Ombre", + ["Prayer of Spirit"] = "Pri\195\168re d'Esprit", + ["Precision"] = "Pr\195\169cision", + ["Predatory Strikes"] = "Frappes de pr\195\169dateur", + ["Premeditation"] = "Pr\195\169m\195\169ditation", + ["Preparation"] = "Pr\195\169paration", + ["Presence of Mind"] = "Pr\195\169sence spirituelle", + ["Primal Fury"] = "Fureur primitive", + ["Prowl"] = "R\195\180der", + ["Psychic Scream"] = "Cri psychique", + ["Pummel"] = "Vol\195\169e de coups", + ["Purge"] = "Expiation", + ["Purification"] = "Purification", + ["Purify"] = "Purification", + ["Pursuit of Justice"] = "Poursuite de la justice", + ["Pyroblast"] = "Explosion pyrotechnique", + ["Pyroclasm"] = "Pyroclasme", + ["Quick Shots"] = "Tir rapide", + ["Quickness"] = "Rapidit\195\169", + ["Rain of Fire"] = "Pluie de feu", + ["Rake"] = "Griffure", + ["Ram Riding"] = "Monte de b\195\169lier", + ["Ranged Weapon Specialization"] = "Sp\195\169cialisation Armes \195\160 distance", + ["Rapid Concealment"] = "Dissimulation rapide", + ["Rapid Fire"] = "Tir rapide", + ["Raptor Riding"] = "Monte de raptor", + ["Raptor Strike"] = "Attaque du raptor", + ["Ravage"] = "Ravage", + ["Readiness"] = "Promptitude", + ["Rebirth"] = "Renaissance", + ["Reckless Charge"] = "Charge furieuse", + ["Recklessness"] = "T\195\169m\195\169rit\195\169", + ["Reckoning"] = "R\195\169tribution", + ["Redemption"] = "R\195\169demption", + ["Redoubt"] = "Redoute", + ["Reflection"] = "Renvoi", + ["Regeneration"] = "R\195\169g\195\169n\195\169ration", + ["Regrowth"] = "R\195\169tablissement", + ["Reincarnation"] = "R\195\169incarnation", + ["Rejuvenation"] = "R\195\169cup\195\169ration", + ["Relentless Strikes"] = "Frappes implacables", + ["Remorseless"] = "Impitoyable", + ["Remorseless Attacks"] = "Attaques impitoyables", + ["Remove Curse"] = "D\195\169livrance de la mal\195\169diction", + ["Remove Insignia"] = "Enlever l'insigne", + ["Remove Lesser Curse"] = "D\195\169livrance de la mal\195\169diction mineure", + ["Rend"] = "Pourfendre", + ["Renew"] = "R\195\169novation", + ["Repentance"] = "Repentir", + ["Resurrection"] = "R\195\169surrection", + ["Retaliation"] = "Repr\195\169sailles", + ["Retribution Aura"] = "Aura de vindicte", + ["Revenge Stun"] = "Etourdissement vengeur", + ["Revenge"] = "Vengeance", + ["Reverberation"] = "R\195\169verb\195\169ration", + ["Revive Pet"] = "Ressusciter le familier", + ["Righteous Fury"] = "Fureur vertueuse", + ["Rip"] = "D\195\169chirure", + ["Riposte"] = "Riposte", + ["Ritual of Doom Effect"] = "Effet Rituel de mal\195\169diction", + ["Ritual of Doom"] = "Rituel de mal\195\169diction", + ["Ritual of Summoning"] = "Rituel d'invocation", + ["Rockbiter Weapon"] = "Arme Croque-roc", + ["Rogue Passive"] = "Voleur", + ["Ruin"] = "Ruine", + ["Rupture"] = "Rupture", + ["Ruthlessness"] = "N\195\169m\195\169sis", + ["Sacrifice"] = "Sacrifice", + ["Safe Fall"] = "Chute amortie", + ["Sanctity Aura"] = "Aura de saintet\195\169", + ["Sap"] = "Assommer", + ["Savage Fury"] = "Furie sauvage", + ["Savage Strikes"] = "Frappes sauvages", + ["Scare Beast"] = "Effrayer une b\195\170te", + ["Scatter Shot"] = "Fl\195\168che de dispersion", + ["Scorch"] = "Br\195\187lure", + ["Scorpid Poison"] = "Poison de scorpide", + ["Scorpid Sting"] = "Piq\195\187re de scorpide", + ["Screech"] = "Hurlement", + ["Seal Fate"] = "Scelle le destin", + ["Seal of Command"] = "Sceau d'autorit\195\169", + ["Seal of Justice"] = "Sceau de justice", + ["Seal of Light"] = "Sceau de lumi\195\168re", + ["Seal of Righteousness"] = "Sceau de pi\195\169t\195\169", + ["Seal of Wisdom"] = "Sceau de sagesse", + ["Seal of the Crusader"] = "Sceau du Crois\195\169", + ["Searing Light"] = "Lumi\195\168re incendiaire", + ["Searing Pain"] = "Douleur br\195\187lante", + ["Searing Totem"] = "Totem incendiaire", + ["Seduction"] = "S\195\169duction", + ["Sense Demons"] = "D\195\169tection des d\195\169mons", + ["Sense Undead"] = "D\195\169tection des morts-vivants", + ["Sentry Totem"] = "Totem Sentinelle", + ["Serpent Sting"] = "Morsure de serpent", + ["Setup"] = "Pr\195\169paratifs", + ["Shackle Undead"] = "Entraves des morts-vivants", + ["Shadow Affinity"] = "Affinit\195\169 avec l'ombre", + ["Shadow Bolt"] = "Trait de l'ombre", + ["Shadow Focus"] = "Focalisation de l'ombre", + ["Shadow Mastery"] = "Ma\195\174trise de l'ombre", + ["Shadow Protection"] = "Protection contre l'Ombre", + ["Shadow Reach"] = "Allonge de l'Ombre", + ["Shadow Resistance Aura"] = "Aura de r\195\169sistance \195\160 l'Ombre", + ["Shadow Resistance"] = "R\195\169sistance \195\160 l'Ombre", + ["Shadow Trance"] = "Transe de l'ombre", + ["Shadow Vulnerability"] = "Vuln\195\169rabilit\195\169 \195\160 l'ombre", + ["Shadow Ward"] = "Gardien de l'ombre", + ["Shadow Weaving"] = "Tissage de l'ombre", + ["Shadow Word: Pain"] = "Mot de l'ombre\194\160: Douleur", + ["Shadowburn"] = "Br\195\187lure de l'ombre", + ["Shadowform"] = "Forme d'Ombre", + ["Shadowguard"] = "Garde de l'ombre", + ["Shadowmeld Passive"] = "Camouflage dans l'ombre", + ["Shadowmeld"] = "Camouflage dans l'ombre", + ["Sharpened Claws"] = "Griffes aiguis\195\169es", + ["Shatter"] = "Fracasser", + ["Shell Shield"] = "Carapace bouclier", + ["Shield Bash"] = "Coup de bouclier", + ["Shield Bash - Silenced"] = "Coup de bouclier - silencieux", -- seems to be the only "- Silenced" not having a Cap letter, will try to test! + ["Shield Block"] = "Ma\195\174trise du blocage", + ["Shield Slam"] = "Heurt de bouclier", + ["Shield Specialization"] = "Sp\195\169cialisation Bouclier", + ["Shield Wall"] = "Mur protecteur", + ["Shield"] = "Bouclier", + ["Shoot Bow"] = "Tir \195\160 l'arc", + ["Shoot Crossbow"] = "Tir \195\160 l\226\128\153arbal\195\168te", + ["Shoot Gun"] = "Tir avec une arme \195\160 feu", + ["Shoot"] = "Tir", + ["Shred"] = "Lambeau", + ["Silence"] = "Silence", + ["Silent Resolve"] = "R\195\169solution silencieuse", + ["Sinister Strike"] = "Attaque pernicieuse", + ["Siphon Life"] = "Siphon de vie", + ["Skinning"] = "D\195\169pe\195\167age", + ["Slam"] = "Heurtoir", + ["Sleep"] = "Sommeil", + ["Slice and Dice"] = "D\195\169biter", + ["Slow Fall"] = "Chute lente", + ["Smelting"] = "Fondre", + ["Smite"] = "Ch\195\162timent", + ["Soothe Animal"] = "Apaiser les animaux", + ["Soothing Kiss"] = "Baiser apaisant", + ["Soul Fire"] = "Feu de l'\195\162me", + ["Soul Link"] = "Lien spirituel", + ["Soul Siphon"] = "Siphon d'\195\162me", + ["Soulstone Resurrection"] = "R\195\169surrection de Pierre d'\195\162me", + ["Spell Lock"] = "Verrou magique", + ["Spell Warding"] = "Protection contre les sorts", + ["Spirit Bond"] = "Engagement spirituel", + ["Spirit Tap"] = "Connexion spirituelle", + ["Spirit of Redemption"] = "Esprit de r\195\169demption", + ["Spiritual Focus"] = "Focalisation spirituelle", + ["Spiritual Guidance"] = "Direction spirituelle", + ["Spiritual Healing"] = "Soins spirituels", + ["Sprint"] = "Sprint", + ["Starfire"] = "Feu stellaire", + ["Starfire Stun"] = "Feu stellaire \195\169tourdissant", + ["Starshards"] = "Eclats stellaires", + ["Staves"] = "B\195\162tons", + ["Stealth"] = "Camouflage", + ["Stoneclaw Totem"] = "Totem de Griffes de pierre", + ["Stoneform"] = "Forme de pierre", + ["Stoneskin Totem"] = "Totem de Peau de pierre", + ["Stormstrike"] = "Courroux naturel", + ["Strength of Earth Totem"] = "Totem de Force de la Terre", + ["Stuck"] = "Bloqu\195\169", + ["Subtlety"] = "Discr\195\169tion", + ["Suffering"] = "Souffrance", + ["Summon Charger"] = "Invocation de destrier", + ["Summon Dreadsteed"] = "Invocation d'un Destrier de l'Effroi", + ["Summon Felhunter"] = "Invocation d'un chasseur corrompu", + ["Summon Felsteed"] = "Invocation d'un palefroi corrompu", + ["Summon Imp"] = "Invocation d'un diablotin", + ["Summon Succubus"] = "Invocation d'une succube", + ["Summon Voidwalker"] = "Invocation d'un marcheur du Vide", + ["Summon Warhorse"] = "Invocation d'un cheval de guerre", + ["Sunder Armor"] = "Fracasser armure", + ["Suppression"] = "Suppression", + ["Surefooted"] = "Pied s\195\187r", + ["Survivalist"] = "Survivant", + ["Sweeping Strikes"] = "Attaques circulaires", + ["Swiftmend"] = "Prompte guérison", + ["Swipe"] = "Balayage", + ["Sword Specialization"] = "Sp\195\169cialisation Ep\195\169e", + ["Tactical Mastery"] = "Ma\195\174trise tactique", + ["Tailoring"] = "Couture", + ["Tainted Blood"] = "Corruption sanguine", + ["Tame Beast"] = "Dompte une b\195\170te", + ["Tamed Pet Passive"] = "Familier dompt\195\169", + ["Taunt"] = "Provocation", + ["Teleport: Darnassus"] = "T\195\169l\195\169portation : Darnassus", + ["Teleport: Ironforge"] = "T\195\169l\195\169portation : Ironforge", + ["Teleport: Moonglade"] = "T\195\169l\195\169portation : Reflet-de-Lune", + ["Teleport: Orgrimmar"] = "T\195\169l\195\169portation : Orgrimmar", + ["Teleport: Stormwind"] = "T\195\169l\195\169portation : Stormwind", + ["Teleport: Thunder Bluff"] = "T\195\169l\195\169portation : Thunder Bluff", + ["Teleport: Undercity"] = "T\195\169l\195\169portation : Undercity", + ["The Human Spirit"] = "L'esprit humain", + ["Thick Hide"] = "Peau \195\169paisse", + ["Thorns"] = "Epines", + ["Throw"] = "Lancer", + ["Throwing Specialization"] = "Sp\195\169cialisation Armes de jet", + ["Throwing Weapon Specialization"] = "Sp\195\169cialisation Armes de jet", + ["Thrown"] = "Armes de jet", + ["Thunder Clap"] = "Coup de tonnerre", + ["Thundering Strikes"] = "Frappe foudroyante", + ["Thunderstomp"] = "Grondeterre", + ["Tidal Focus"] = "Focalisation des flots", + ["Tidal Mastery"] = "Ma\195\174trise des flots", + ["Tiger Riding"] = "Monte de tigre", + ["Tiger's Fury"] = "Fureur du tigre", + ["Torment"] = "Tourment", + ["Totem"] = "Totem", + ["Totemic Focus"] = "Focalisation tot\195\169mique", + ["Touch of Weakness"] = "Toucher de faiblesse", + ["Toughness"] = "R\195\169sistance", + ["Track Beasts"] = "Pistage des b\195\170tes", + ["Track Demons"] = "Pistage des d\195\169mons", + ["Track Dragonkin"] = "Pistage des draconiens", + ["Track Elementals"] = "Pistage des \195\169l\195\169mentaires", + ["Track Giants"] = "Pistage des g\195\169ants", + ["Track Hidden"] = "Pistage des camoufl\195\169s", + ["Track Humanoids"] = "Pistage des humano\195\175des", + ["Track Undead"] = "Pistage des morts-vivants", + ["Tranquil Air Totem"] = "Totem de Tranquillit\195\169 de l'air", + ["Tranquil Spirit"] = "Tranquillit\195\169 de l'esprit", + ["Tranquility"] = "Tranquillit\195\169", + ["Tranquilizing Shot"] = "Tir tranquillisant", + ["Trap Mastery"] = "Ma\195\174trise des pi\195\168ges", + ["Travel Form"] = "Forme de voyage", + ["Tremor Totem"] = "Totem de S\195\169isme", + ["Tribal Leatherworking"] = "Travail du cuir tribal", + ["Trueshot Aura"] = "Aura de pr\195\169cision", + ["Turn Undead"] = "Renvoi des morts-vivants", + ["Two-Handed Axes and Maces"] = "Haches et masses \195\160 deux mains", + ["Two-Handed Axes"] = "Haches \195\160 deux mains", + ["Two-Handed Maces"] = "Masses \195\160 deux mains", + ["Two-Handed Swords"] = "Ep\195\169es \195\160 deux mains", + ["Two-Handed Weapon Specialization"] = "Sp\195\169cialisation Arme 2M", + ["Unarmed"] = "Mains nues", + ["Unbreakable Will"] = "Volont\195\169 inflexible", + ["Unbridled Wrath Effect"] = "Effet Col\195\168re d\195\169cha\195\174n\195\169e", + ["Unbridled Wrath"] = "Col\195\168re d\195\169cha\195\174n\195\169e", + ["Undead Horsemanship"] = "Monte de cheval squelette", + ["Underwater Breathing"] = "Respiration aquatique", + ["Unending Breath"] = "Respiration interminable", + ["Unholy Power"] = "Puissance impie", + ["Unleashed Fury"] = "Fureur lib\195\169r\195\169e", + ["Unyielding Faith"] = "Foi inflexible", + ["Vampiric Embrace"] = "Etreinte vampirique", + ["Vanish"] = "Disparition", + ["Vanished"] = "Invisible", + ["Vengeance"] = "Vengeance", + ["Vigor"] = "Vigueur", + ["Vile Poisons"] = "Poisons abominables", + ["Vindication"] = "Justification", + ["Viper Sting"] = "Morsure de vip\195\168re", + ["Volley"] = "Salve", + ["Wand Specialization"] = "Sp\195\169cialisation Baguette", + ["Wands"] = "Baguettes", + ["War Stomp"] = "Choc martial", + ["Water Breathing"] = "Respiration aquatique", + ["Water Walking"] = "Marcher sur l\226\128\153eau", + ["Weakened Soul"] = "Ame affaiblie", + ["Weaponsmith"] = "Fabricant d'armes", + ["Whirlwind"] = "Tourbillon", + ["Will of the Forsaken"] = "Volont\195\169 des R\195\169prouv\195\169s", + ["Windfury Totem"] = "Totem Furie-des-vents", + ["Windfury Weapon"] = "Arme Furie-des-vents", + ["Windwall Totem"] = "Totem de Mur des vents", + ["Wing Clip"] = "Coupure d'ailes", + ["Winter's Chill"] = "Froid hivernal", + ["Wisp Spirit"] = "Esprit feu follet", + ["Wolf Riding"] = "Monte de loup", + ["Wound Poison II"] = "Poison douloureux II", + ["Wound Poison III"] = "Poison douloureux III", + ["Wound Poison IV"] = "Poison douloureux IV", + ["Wound Poison"] = "Poison douloureux", + ["Wrath"] = "Col\195\168re", + ["Wyvern Sting"] = "Piq\195\187re de wyverne" + } +end) + +local spellIcons = { + ["Abolish Disease"] = "Spell_Nature_NullifyDisease", + ["Abolish Poison Effect"] = "Spell_Nature_NullifyPoison_02", + ["Abolish Poison"] = "Spell_Nature_NullifyPoison_02", + ["Activate MG Turret"] = "INV_Weapon_Rifle_10", + ["Adrenaline Rush"] = "Spell_Shadow_ShadowWordDominate", + ["Aftermath"] = "Spell_Fire_Fire", + ["Aggression"] = "Ability_Racial_Avatar", + ["Aimed Shot"] = "INV_Spear_07", + ["Alchemy"] = "Trade_Alchemy", + ["Ambush"] = "Ability_Rogue_Ambush", + ["Amplify Curse"] = "Spell_Shadow_Contagion", + ["Amplify Magic"] = "Spell_Holy_FlashHeal", + ["Ancestral Healing"] = "Spell_Nature_UndyingStrength", + ["Ancestral Knowledge"] = "Spell_Shadow_GrimWard", + ["Ancestral Spirit"] = "Spell_Nature_Regenerate", + ["Anger Management"] = "Spell_Holy_BlessingOfStamina", + ["Anticipation"] = "Spell_Nature_MirrorImage", + ["Aquatic Form"] = "Ability_Druid_AquaticForm", + ["Arcane Brilliance"] = "Spell_Holy_ArcaneIntellect", + ["Arcane Concentration"] = "Spell_Shadow_ManaBurn", + ["Arcane Explosion"] = "Spell_Nature_WispSplode", + ["Arcane Focus"] = "Spell_Holy_Devotion", + ["Arcane Instability"] = "Spell_Shadow_Teleport", + ["Arcane Intellect"] = "Spell_Holy_MagicalSentry", + ["Arcane Meditation"] = "Spell_Shadow_SiphonMana", + ["Arcane Mind"] = "Spell_Shadow_Charm", + ["Arcane Missiles"] = "Spell_Nature_StarFall", + ["Arcane Power"] = "Spell_Nature_Lightning", + ["Arcane Resistance"] = "Spell_Nature_StarFall", + ["Arcane Shot"] = "Ability_ImpalingBolt", + ["Arcane Subtlety"] = "Spell_Holy_DispelMagic", + ["Arctic Reach"] = "Spell_Shadow_DarkRitual", + ["Aspect of the Beast"] = "Ability_Mount_PinkTiger", + ["Aspect of the Cheetah"] = "Ability_Mount_JungleTiger", + ["Aspect of the Hawk"] = "Spell_Nature_RavenForm", + ["Aspect of the Monkey"] = "Ability_Hunter_AspectOfTheMonkey", + ["Aspect of the Pack"] = "Ability_Mount_WhiteTiger", + ["Aspect of the Wild"] = "Spell_Nature_ProtectionformNature", + ["Astral Recall"] = "Spell_Nature_AstralRecal", + ["Attack"] = "Temp", + ["Attacking"] = "Temp", + ["Auto Shot"] = "Ability_Whirlwind", + ["Axe Specialization"] = "INV_Axe_06", + ["Backstab"] = "Ability_BackStab", + ["Bane"] = "Spell_Shadow_DeathPact", + ["Banish"] = "Spell_Shadow_Cripple", + ["Barkskin Effect"] = "Spell_Nature_StoneClawTotem", + ["Barkskin"] = "Spell_Nature_StoneClawTotem", + ["Barrage"] = "Ability_UpgradeMoonGlaive", + ["Bash"] = "Ability_Druid_Bash", + ["Basic Campfire"] = "Spell_Fire_Fire", + ["Battle Shout"] = "Ability_Warrior_BattleShout", + ["Battle Stance Passive"] = "Ability_Warrior_OffensiveStance", + ["Battle Stance"] = "Ability_Warrior_OffensiveStance", + ["Bear Form"] = "Ability_Racial_BearForm", + ["Beast Lore"] = "Ability_Physical_Taunt", + ["Beast Slaying"] = "INV_Misc_Pelt_Bear_Ruin_02", + ["Beast Training"] = "Ability_Hunter_BeastCall02", + ["Benediction"] = "Spell_Frost_WindWalkOn", + ["Berserker Rage"] = "Spell_Nature_AncestralGuardian", + ["Berserker Stance Passive"] = "Ability_Racial_Avatar", + ["Berserker Stance"] = "Ability_Racial_Avatar", + ["Berserking"] = "Racial_Troll_Berserk", + ["Bestial Discipline"] = "Spell_Nature_AbolishMagic", + ["Bestial Swiftness"] = "Ability_Druid_Dash", + ["Bestial Wrath"] = "Ability_Druid_FerociousBite", + ["Bite"] = "Ability_Racial_Cannibalize", + ["Black Arrow"] = "Ability_TheBlackArrow", + ["Blackout"] = "Spell_Shadow_GatherShadows", + ["Blacksmithing"] = "Trade_BlackSmithing", + ["Blade Flurry"] = "Ability_Warrior_PunishingBlow", + ["Blast Wave"] = "Spell_Holy_Excorcism_02", + ["Blessed Recovery"] = "Spell_Holy_BlessedRecovery", + ["Blessing of Freedom"] = "Spell_Holy_SealOfValor", + ["Blessing of Kings"] = "Spell_Magic_MageArmor", + ["Blessing of Light"] = "Spell_Holy_PrayerOfHealing02", + ["Blessing of Might"] = "Spell_Holy_FistOfJustice", + ["Blessing of Protection"] = "Spell_Holy_SealOfProtection", + ["Blessing of Sacrifice"] = "Spell_Holy_SealOfSacrifice", + ["Blessing of Salvation"] = "Spell_Holy_SealOfSalvation", + ["Blessing of Sanctuary"] = "Spell_Nature_LightningShield", + ["Blessing of Wisdom"] = "Spell_Holy_SealOfWisdom", + ["Blind"] = "Spell_Shadow_MindSteal", + ["Blinding Powder"] = "INV_Misc_Ammo_Gunpowder_02", + ["Blink"] = "Spell_Arcane_Blink", + ["Blizzard"] = "Spell_Frost_IceStorm", + ["Block"] = "Ability_Defend", + ["Blood Craze"] = "Spell_Shadow_SummonImp", + ["Blood Frenzy"] = "Ability_GhoulFrenzy", + ["Blood Fury"] = "Racial_Orc_BerserkerStrength", + ["Blood Pact"] = "Spell_Shadow_BloodBoil", + ["Bloodrage"] = "Ability_Racial_BloodRage", + ["Bloodthirst"] = "Spell_Nature_BloodLust", + ["Booming Voice"] = "Spell_Nature_Purge", + ["Bow Specialization"] = "INV_Weapon_Bow_12", + ["Bows"] = "INV_Weapon_Bow_05", + ["Bright Campfire"] = "Spell_Fire_Fire", + ["Brutal Impact"] = "Ability_Druid_Bash", + ["Burning Soul"] = "Spell_Fire_Fire", + ["Call Pet"] = "Ability_Hunter_BeastCall", + ["Call of Flame"] = "Spell_Fire_Immolation", + ["Call of Thunder"] = "Spell_Nature_CallStorm", + ["Camouflage"] = "Ability_Stealth", + ["Cannibalize"] = "Ability_Racial_Cannibalize", + ["Cat Form"] = "Ability_Druid_CatForm", + ["Cataclysm"] = "Spell_Fire_WindsofWoe", + ["Chain Heal"] = "Spell_Nature_HealingWaveGreater", + ["Chain Lightning"] = "Spell_Nature_ChainLightning", + ["Challenging Roar"] = "Ability_Druid_ChallangingRoar", + ["Challenging Shout"] = "Ability_BullRush", + ["Charge Rage Bonus Effect"] = "Ability_Warrior_Charge", + ["Charge"] = "Ability_Warrior_Charge", + ["Cheap Shot"] = "Ability_CheapShot", + ["Chilled"] = "Spell_Frost_IceStorm", + ["Claw"] = "Ability_Druid_Rake", + ["Cleanse"] = "Spell_Holy_Renew", + ["Clearcasting"] = "Spell_Shadow_ManaBurn", + ["Cleave"] = "Ability_Warrior_Cleave", + ["Clever Traps"] = "Spell_Nature_TimeStop", + ["Closing"] = "Temp", + ["Cloth"] = "INV_Chest_Cloth_21", + ["Cobra Reflexes"] = "Spell_Nature_GuardianWard", + ["Cold Blood"] = "Spell_Ice_Lament", + ["Cold Snap"] = "Spell_Frost_WizardMark", + ["Combat Endurance"] = "Spell_Nature_AncestralGuardian", + ["Combustion"] = "Spell_Fire_SealOfFire", + ["Command"] = "Ability_Warrior_WarCry", + ["Concentration Aura"] = "Spell_Holy_MindSooth", + ["Concussion Blow"] = "Ability_ThunderBolt", + ["Concussion"] = "Spell_Fire_Fireball", + ["Concussive Shot"] = "Spell_Frost_Stun", + ["Cone of Cold"] = "Spell_Frost_Glacier", + ["Conflagrate"] = "Spell_Fire_Fireball", + ["Conjure Food"] = "INV_Misc_Food_10", + ["Conjure Mana Agate"] = "INV_Misc_Gem_Emerald_01", + ["Conjure Mana Citrine"] = "INV_Misc_Gem_Opal_01", + ["Conjure Mana Jade"] = "INV_Misc_Gem_Emerald_02", + ["Conjure Mana Ruby"] = "INV_Misc_Gem_Ruby_01", + ["Conjure Water"] = "INV_Drink_06", + ["Consecration"] = "Spell_Holy_InnerFire", + ["Consume Shadows"] = "Spell_Shadow_AntiShadow", + ["Convection"] = "Spell_Nature_WispSplode", + ["Conviction"] = "Spell_Holy_RetributionAura", + ["Cooking"] = "INV_Misc_Food_15", + ["Corruption"] = "Spell_Shadow_AbominationExplosion", + ["Counterattack"] = "Ability_Warrior_Challange", + ["Counterspell"] = "Spell_Frost_IceShock", + ["Cower"] = "Ability_Druid_Cower", + ["Create Firestone (Lesser)"]="INV_Ammo_FireTar", + ["Create Firestone"]="INV_Ammo_FireTar", + ["Create Firestone (Greater)"]="INV_Ammo_FireTar", + ["Create Firestone (Major)"]="INV_Ammo_FireTar", + ["Create Healthstone (Minor)"]="INV_Stone_04", + ["Create Healthstone (Lesser)"]="INV_Stone_04", + ["Create Healthstone"]="INV_Stone_04", + ["Create Healthstone (Greater)"]="INV_Stone_04", + ["Create Healthstone (Major)"]="INV_Stone_04", + ["Create Soulstone (Minor)"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Lesser)"]="Spell_Shadow_SoulGem", + ["Create Soulstone"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Greater)"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Major)"]="Spell_Shadow_SoulGem", + ["Create Spellstone"]="INV_Misc_Gem_Sapphire_01", + ["Create Spellstone (Greater)"]="INV_Misc_Gem_Sapphire_01", + ["Create Spellstone (Major)"]="INV_Misc_Gem_Sapphire_01", + ["Crippling Poison II"] = "Ability_PoisonSting", + ["Crippling Poison"] = "Ability_PoisonSting", + ["Critical Mass"] = "Spell_Nature_WispHeal", + ["Crossbows"] = "INV_Weapon_Crossbow_01", + ["Cruelty"] = "Ability_Rogue_Eviscerate", + ["Cultivation"] = "INV_Misc_Flower_01", + ["Cure Disease"] = "Spell_Holy_NullifyDisease", + ["Cure Poison"] = "Spell_Nature_NullifyPoison", + ["Curse of Agony"] = "Spell_Shadow_CurseOfSargeras", + ["Curse of Doom Effect"] = "Spell_Shadow_AuraOfDarkness", + ["Curse of Doom"] = "Spell_Shadow_AuraOfDarkness", + ["Curse of Exhaustion"] = "Spell_Shadow_GrimWard", + ["Curse of Idiocy"] = "Spell_Shadow_MindRot", + ["Curse of Recklessness"] = "Spell_Shadow_UnholyStrength", + ["Curse of Shadow"] = "Spell_Shadow_CurseOfAchimonde", + ["Curse of Tongues"] = "Spell_Shadow_CurseOfTounges", + ["Curse of Weakness"] = "Spell_Shadow_CurseOfMannoroth", + ["Curse of the Elements"] = "Spell_Shadow_ChillTouch", + ["Dagger Specialization"] = "INV_Weapon_ShortBlade_05", + ["Daggers"] = "Ability_SteelMelee", + ["Dampen Magic"] = "Spell_Nature_AbolishMagic", + ["Dark Pact"] = "Spell_Shadow_DarkRitual", + ["Darkness"] = "Spell_Shadow_Twilight", + ["Dash"] = "Ability_Druid_Dash", + ["Deadly Poison II"] = "Ability_Rogue_DualWeild", + ["Deadly Poison III"] = "Ability_Rogue_DualWeild", + ["Deadly Poison IV"] = "Ability_Rogue_DualWeild", + ["Deadly Poison V"] = "Ability_Rogue_DualWeild", + ["Deadly Poison"] = "Ability_Rogue_DualWeild", + ["Death Coil"] = "Spell_Shadow_DeathCoil", + ["Death Wish"] = "Spell_Shadow_DeathPact", + ["Deep Wounds"] = "Ability_BackStab", + ["Defense"] = "Ability_Racial_ShadowMeld", + ["Defensive Stance Passive"] = "Ability_Warrior_DefensiveStance", + ["Defensive Stance"] = "Ability_Warrior_DefensiveStance", + ["Defensive State 2"] = "Ability_Defend", + ["Defensive State"] = "Ability_Defend", + ["Defiance"] = "Ability_Warrior_InnerRage", + ["Deflection"] = "Ability_Parry", + ["Demon Armor"] = "Spell_Shadow_RagingScream", + ["Demon Skin"] = "Spell_Shadow_RagingScream", + ["Demonic Embrace"] = "Spell_Shadow_Metamorphosis", + ["Demonic Sacrifice"] = "Spell_Shadow_PsychicScream", + ["Demoralizing Roar"] = "Ability_Druid_DemoralizingRoar", + ["Demoralizing Shout"] = "Ability_Warrior_WarCry", + ["Desperate Prayer"] = "Spell_Holy_Restoration", + ["Destructive Reach"] = "Spell_Shadow_CorpseExplode", + ["Detect Greater Invisibility"] = "Spell_Shadow_DetectInvisibility", + ["Detect Invisibility"] = "Spell_Shadow_DetectInvisibility", + ["Detect Lesser Invisibility"] = "Spell_Shadow_DetectLesserInvisibility", + ["Detect Magic"] = "Spell_Holy_Dizzy", + ["Detect Traps"] = "Ability_Spy", + ["Detect"] = "Ability_Hibernation", + ["Deterrence"] = "Ability_Whirlwind", + ["Devastation"] = "Spell_Fire_FlameShock", + ["Devotion Aura"] = "Spell_Holy_DevotionAura", + ["Devour Magic Effect"] = "Spell_Nature_Purge", + ["Devour Magic"] = "Spell_Nature_Purge", + ["Devouring Plague"] = "Spell_Shadow_BlackPlague", + ["Diplomacy"] = "INV_Misc_Note_02", + ["Dire Bear Form"] = "Ability_Racial_BearForm", + ["Disarm Trap"] = "Spell_Shadow_GrimWard", + ["Disarm"] = "Ability_Warrior_Disarm", + ["Disease Cleansing Totem"] = "Spell_Nature_DiseaseCleansingTotem", + ["Disenchant"] = "Spell_Holy_RemoveCurse", + ["Disengage"] = "Ability_Rogue_Feint", + ["Dismiss Pet"] = "Spell_Nature_SpiritWolf", + ["Dispel Magic"] = "Spell_Holy_DispelMagic", + ["Distract"] = "Ability_Rogue_Distract", + ["Distracting Shot"] = "Spell_Arcane_Blink", + ["Dive"] = "Spell_Shadow_BurningSpirit", + ["Divine Favor"] = "Spell_Holy_Heal", + ["Divine Fury"] = "Spell_Holy_SealOfWrath", + ["Divine Intellect"] = "Spell_Nature_Sleep", + ["Divine Intervention"] = "Spell_Nature_TimeStop", + ["Divine Protection"] = "Spell_Holy_Restoration", + ["Divine Shield"] = "Spell_Holy_DivineIntervention", + ["Divine Spirit"] = "Spell_Holy_DivineSpirit", + ["Divine Strength"] = "Ability_GolemThunderClap", + ["Dodge"] = "Spell_Nature_Invisibilty", + ["Drain Life"] = "Spell_Shadow_LifeDrain02", + ["Drain Mana"] = "Spell_Shadow_SiphonMana", + ["Drain Soul"] = "Spell_Shadow_Haunting", + ["Dual Wield Specialization"] = "Ability_DualWield", + ["Dual Wield"] = "Ability_DualWield", + ["Duel"] = "Temp", + ["Eagle Eye"] = "Ability_Hunter_EagleEye", + ["Earth Shock"] = "Spell_Nature_EarthShock", + ["Earthbind Totem"] = "Spell_Nature_StrengthOfEarthTotem02", + ["Efficiency"] = "Spell_Frost_WizardMark", + ["Elemental Focus"] = "Spell_Shadow_ManaBurn", + ["Elemental Fury"] = "Spell_Fire_Volcano", + ["Elemental Mastery"] = "Spell_Nature_WispHeal", + ["Elune's Grace"] = "Spell_Holy_ElunesGrace", + ["Elusiveness"] = "Spell_Magic_LesserInvisibilty", + ["Emberstorm"] = "Spell_Fire_SelfDestruct", + ["Enchanting"] = "Trade_Engraving", + ["Endurance Training"] = "Spell_Nature_Reincarnation", + ["Endurance"] = "Spell_Nature_UnyeildingStamina", + ["Engineering Specialization"] = "INV_Misc_Gear_01", + ["Engineering"] = "Trade_Engineering", + ["Enrage"] = "Ability_Druid_Enrage", + ["Enslave Demon"] = "Spell_Shadow_EnslaveDemon", + ["Entangling Roots"] = "Spell_Nature_StrangleVines", + ["Entrapment"] = "Spell_Nature_StrangleVines", + ["Escape Artist"] = "Ability_Rogue_Trip", + ["Evasion"] = "Spell_Shadow_ShadowWard", + ["Eventide"] = "Spell_Frost_Stun", + ["Eviscerate"] = "Ability_Rogue_Eviscerate", + ["Evocation"] = "Spell_Nature_Purge", + ["Execute"] = "INV_Sword_48", + ["Exorcism"] = "Spell_Holy_Excorcism_02", + ["Expansive Mind"] = "INV_Enchant_EssenceEternalLarge", + ["Explosive Trap Effect"] = "Spell_Fire_SelfDestruct", + ["Explosive Trap"] = "Spell_Fire_SelfDestruct", + ["Expose Armor"] = "Ability_Warrior_Riposte", + ["Eye for an Eye"] = "Spell_Holy_EyeforanEye", + ["Eye of Kilrogg"] = "Spell_Shadow_EvilEye", + ["Eyes of the Beast"] = "Ability_EyeOfTheOwl", + ["Fade"] = "Spell_Magic_LesserInvisibilty", + ["Faerie Fire"] = "Spell_Nature_FaerieFire", + ["Far Sight"] = "Spell_Nature_FarSight", + ["Fear Ward"] = "Spell_Holy_Excorcism", + ["Fear"] = "Spell_Shadow_Possession", + ["Feed Pet"] = "Ability_Hunter_BeastTraining", + ["Feedback"] = "Spell_Shadow_RitualOfSacrifice", + ["Feign Death"] = "Ability_Rogue_FeignDeath", + ["Feint"] = "Ability_Rogue_Feint", + ["Fel Concentration"] = "Spell_Shadow_FingerOfDeath", + ["Fel Domination"] = "Spell_Nature_RemoveCurse", + ["Fel Intellect"] = "Spell_Holy_MagicalSentry", + ["Fel Stamina"] = "Spell_Shadow_AntiShadow", + ["Felfire"] = "Spell_Fire_Fireball", + ["Feline Grace"] = "INV_Feather_01", + ["Feline Swiftness"] = "Spell_Nature_SpiritWolf", + ["Feral Aggression"] = "Ability_Druid_DemoralizingRoar", + ["Feral Charge"] = "Ability_Hunter_Pet_Bear", + ["Feral Instinct"] = "Ability_Ambush", + ["Ferocious Bite"] = "Ability_Druid_FerociousBite", + ["Ferocity"] = "INV_Misc_MonsterClaw_04", + ["Fetish"] = "INV_Misc_Horn_01", + ["Find Herbs"] = "INV_Misc_Flower_02", + ["Find Minerals"] = "Spell_Nature_Earthquake", + ["Find Treasure"] = "Racial_Dwarf_FindTreasure", + ["Fire Blast"] = "Spell_Fire_Fireball", + ["Fire Nova Totem"] = "Spell_Fire_SealOfFire", + ["Fire Power"] = "Spell_Fire_Immolation", + ["Fire Resistance Aura"] = "Spell_Fire_SealOfFire", + ["Fire Resistance Totem"] = "Spell_FireResistanceTotem_01", + ["Fire Resistance"] = "Spell_Fire_FireArmor", + ["Fire Shield"] = "Spell_Fire_FireArmor", + ["Fire Vulnerability"] = "Spell_Fire_SoulBurn", + ["Fire Ward"] = "Spell_Fire_FireArmor", + ["Fireball"] = "Spell_Fire_FlameBolt", + ["Firebolt"] = "Spell_Fire_FireBolt", + ["First Aid"] = "Spell_Holy_SealOfSacrifice", + ["Fishing Poles"] = "Trade_Fishing", + ["Fishing"] = "Trade_Fishing", + ["Fist Weapon Specialization"] = "INV_Gauntlets_04", + ["Fist Weapons"] = "INV_Gauntlets_04", + ["Flame Shock"] = "Spell_Fire_FlameShock", + ["Flame Throwing"] = "Spell_Fire_Flare", + ["Flamestrike"] = "Spell_Fire_SelfDestruct", + ["Flamethrower"] = "Spell_Fire_Incinerate", + ["Flametongue Totem"] = "Spell_Nature_GuardianWard", + ["Flametongue Weapon"] = "Spell_Fire_FlameTounge", + ["Flare"] = "Spell_Fire_Flare", + ["Flash Heal"] = "Spell_Holy_FlashHeal", + ["Flash of Light"] = "Spell_Holy_FlashHeal", + ["Flurry"] = "Ability_GhoulFrenzy", + ["Focused Casting"] = "Spell_Arcane_Blink", + ["Force of Will"] = "Spell_Nature_SlowingTotem", + ["Freezing Trap"] = "Spell_Frost_ChainsOfIce", + ["Frenzied Regeneration"] = "Ability_BullRush", + ["Frenzy"] = "INV_Misc_MonsterClaw_03", + ["Frost Armor"] = "Spell_Frost_FrostArmor02", + ["Frost Channeling"] = "Spell_Frost_Stun", + ["Frost Nova"] = "Spell_Frost_FrostNova", + ["Frost Resistance Aura"] = "Spell_Frost_WizardMark", + ["Frost Resistance Totem"] = "Spell_FrostResistanceTotem_01", + ["Frost Resistance"] = "Spell_Frost_FrostWard", + ["Frost Shock"] = "Spell_Frost_FrostShock", + ["Frost Trap"] = "Spell_Frost_FreezingBreath", + ["Frost Ward"] = "Spell_Frost_FrostWard", + ["Frostbite"] = "Spell_Frost_FrostArmor", + ["Frostbolt"] = "Spell_Frost_FrostBolt02", + ["Frostbrand Weapon"] = "Spell_Frost_FrostBrand", + ["Furious Howl"] = "Ability_Hunter_Pet_Wolf", + ["Furor"] = "Spell_Holy_BlessingOfStamina", + ["Garrote"] = "Ability_Rogue_Garrote", + ["Generic"] = "INV_Shield_09", + ["Ghost Wolf"] = "Spell_Nature_SpiritWolf", + ["Ghostly Strike"] = "Spell_Shadow_Curse", + ["Gift of Nature"] = "Spell_Nature_ProtectionformNature", + ["Gift of the Wild"] = "Spell_Nature_Regeneration", + ["Gouge"] = "Ability_Gouge", + ["Grace of Air Totem"] = "Spell_Nature_InvisibilityTotem", + ["Great Stamina"] = "Spell_Nature_UnyeildingStamina", + ["Greater Blessing of Kings"] = "Spell_Magic_GreaterBlessingofKings", + ["Greater Blessing of Light"] = "Spell_Holy_GreaterBlessingofLight", + ["Greater Blessing of Might"] = "Spell_Holy_GreaterBlessingofKings", + ["Greater Blessing of Salvation"] = "Spell_Holy_GreaterBlessingofSalvation", + ["Greater Blessing of Sanctuary"] = "Spell_Holy_GreaterBlessingofSanctuary", + ["Greater Blessing of Wisdom"] = "Spell_Holy_GreaterBlessingofWisdom", + ["Greater Heal"] = "Spell_Holy_GreaterHeal", + ["Grim Reach"] = "Spell_Shadow_CallofBone", + ["Grounding Totem"] = "Spell_Nature_GroundingTotem", + ["Grovel"] = "Temp", + ["Growl"] = "Ability_Physical_Taunt", + ["Guardian's Favor"] = "Spell_Holy_SealOfProtection", + ["Gun Specialization"] = "INV_Musket_03", + ["Guns"] = "INV_Weapon_Rifle_01", + ["Hammer of Justice"] = "Spell_Holy_SealOfMight", + ["Hand of Justice"] = "INV_Jewelry_Talisman_01", + ["Hammer of Wrath"] = "Ability_ThunderClap", + ["Hamstring"] = "Ability_ShockWave", + ["Harass"] = "Ability_Hunter_Harass", + ["Hardiness"] = "INV_Helmet_23", + ["Hawk Eye"] = "Ability_TownWatch", + ["Heal"] = "Spell_Holy_Heal", + ["Healing Focus"] = "Spell_Holy_HealingFocus", + ["Healing Light"] = "Spell_Holy_HolyBolt", + ["Healing Stream Totem"] = "INV_Spear_04", + ["Healing Touch"] = "Spell_Nature_HealingTouch", + ["Healing Wave"] = "Spell_Nature_MagicImmunity", + ["Health Funnel"] = "Spell_Shadow_LifeDrain", + ["Heart of the Wild"] = "Spell_Holy_BlessingOfAgility", + ["Hellfire Effect"] = "Spell_Fire_Incinerate", + ["Hellfire"] = "Spell_Fire_Incinerate", + ["Hemorrhage"] = "Spell_Shadow_LifeDrain", + ["Herbalism"] = "Spell_Nature_NatureTouchGrow", + ["Herb Gathering"] = "Spell_Nature_NatureTouchGrow", + ["Heroic Strike"] = "Ability_Rogue_Ambush", + ["Hex of Weakness"] = "Spell_Shadow_FingerOfDeath", + ["Hibernate"] = "Spell_Nature_Sleep", + ["Holy Fire"] = "Spell_Holy_SearingLight", + ["Holy Light"] = "Spell_Holy_HolyBolt", + ["Holy Nova"] = "Spell_Holy_HolyNova", + ["Holy Power"] = "Spell_Holy_Power", + ["Holy Reach"] = "Spell_Holy_Purify", + ["Holy Shield"] = "Spell_Holy_BlessingOfProtection", + ["Holy Shock"] = "Spell_Holy_SearingLight", + ["Holy Specialization"] = "Spell_Holy_SealOfSalvation", + ["Holy Wrath"] = "Spell_Holy_Excorcism", + ["Honorless Target"] = "Spell_Magic_LesserInvisibilty", + ["Horse Riding"] = "Spell_Nature_Swiftness", + ["Howl of Terror"] = "Spell_Shadow_DeathScream", + ["Humanoid Slaying"] = "Spell_Holy_PrayerOfHealing", + ["Hunter's Mark"] = "Ability_Hunter_SniperShot", + ["Hurricane"] = "Spell_Nature_Cyclone", + ["Ice Armor"] = "Spell_Frost_FrostArmor02", + ["Ice Barrier"] = "Spell_Ice_Lament", + ["Ice Block"] = "Spell_Frost_Frost", + ["Ice Shards"] = "Spell_Frost_IceShard", + ["Ignite"] = "Spell_Fire_Incinerate", + ["Illumination"] = "Spell_Holy_GreaterHeal", + ["Immolate"] = "Spell_Fire_Immolation", + ["Immolation Trap Effect"] = "Spell_Fire_FlameShock", + ["Immolation Trap"] = "Spell_Fire_FlameShock", + ["Impact"] = "Spell_Fire_MeteorStorm", + ["Impale"] = "Ability_SearingArrow", + ["Improved Ambush"] = "Ability_Rogue_Ambush", + ["Improved Arcane Explosion"] = "Spell_Nature_WispSplode", + ["Improved Arcane Missiles"] = "Spell_Nature_StarFall", + ["Improved Arcane Shot"] = "Ability_ImpalingBolt", + ["Improved Aspect of the Hawk"] = "Spell_Nature_RavenForm", + ["Improved Aspect of the Monkey"] = "Ability_Hunter_AspectOfTheMonkey", + ["Improved Backstab"] = "Ability_BackStab", + ["Improved Battle Shout"] = "Ability_Warrior_BattleShout", + ["Improved Berserker Rage"] = "Spell_Nature_AncestralGuardian", + ["Improved Blessing of Might"] = "Spell_Holy_FistOfJustice", + ["Improved Blessing of Wisdom"] = "Spell_Holy_SealOfWisdom", + ["Improved Blizzard"] = "Spell_Frost_IceStorm", + ["Improved Bloodrage"] = "Ability_Racial_BloodRage", + ["Improved Chain Heal"] = "Spell_Nature_HealingWaveGreater", + ["Improved Chain Lightning"] = "Spell_Nature_ChainLightning", + ["Improved Challenging Shout"] = "Ability_Warrior_Challange", + ["Improved Charge"] = "Ability_Warrior_Charge", + ["Improved Cheap Shot"] = "Ability_CheapShot", + ["Improved Cleave"] = "Ability_Warrior_Cleave", + ["Improved Concentration Aura"] = "Spell_Holy_MindSooth", + ["Improved Concussive Shot"] = "Spell_Frost_Stun", + ["Improved Cone of Cold"] = "Spell_Frost_Glacier", + ["Improved Corruption"] = "Spell_Shadow_AbominationExplosion", + ["Improved Counterspell"] = "Spell_Frost_IceShock", + ["Improved Curse of Agony"] = "Spell_Shadow_CurseOfSargeras", + ["Improved Curse of Exhaustion"] = "Spell_Shadow_GrimWard", + ["Improved Curse of Weakness"] = "Spell_Shadow_CurseOfMannoroth", + ["Improved Dampen Magic"] = "Spell_Nature_AbolishMagic", + ["Improved Deadly Poison"] = "Ability_Rogue_DualWeild", + ["Improved Demoralizing Shout"] = "Ability_Warrior_WarCry", + ["Improved Devotion Aura"] = "Spell_Holy_DevotionAura", + ["Improved Disarm"] = "Ability_Warrior_Disarm", + ["Improved Distract"] = "Ability_Rogue_Distract", + ["Improved Drain Life"] = "Spell_Shadow_LifeDrain02", + ["Improved Drain Mana"] = "Spell_Shadow_SiphonMana", + ["Improved Drain Soul"] = "Spell_Shadow_Haunting", + ["Improved Enrage"] = "Ability_Druid_Enrage", + ["Improved Enslave Demon"] = "Spell_Shadow_EnslaveDemon", + ["Improved Entangling Roots"] = "Spell_Nature_StrangleVines", + ["Improved Evasion"] = "Spell_Shadow_ShadowWard", + ["Improved Eviscerate"] = "Ability_Rogue_Eviscerate", + ["Improved Execute"] = "INV_Sword_48", + ["Improved Expose Armor"] = "Ability_Warrior_Riposte", + ["Improved Eyes of the Beast"] = "Ability_EyeOfTheOwl", + ["Improved Fade"] = "Spell_Magic_LesserInvisibilty", + ["Improved Feign Death"] = "Ability_Rogue_FeignDeath", + ["Improved Fire Blast"] = "Spell_Fire_Fireball", + ["Improved Fire Nova Totem"] = "Spell_Fire_SealOfFire", + ["Improved Fire Ward"] = "Spell_Fire_FireArmor", + ["Improved Fireball"] = "Spell_Fire_FlameBolt", + ["Improved Firebolt"] = "Spell_Fire_FireBolt", + ["Improved Firestone"] = "INV_Ammo_FireTar", + ["Improved Flamestrike"] = "Spell_Fire_SelfDestruct", + ["Improved Flametongue Weapon"] = "Spell_Fire_FlameTounge", + ["Improved Flash of Light"] = "Spell_Holy_FlashHeal", + ["Improved Frost Nova"] = "Spell_Frost_FreezingBreath", + ["Improved Frost Ward"] = "Spell_Frost_FrostWard", + ["Improved Frostbolt"] = "Spell_Frost_FrostBolt02", + ["Improved Frostbrand Weapon"] = "Spell_Frost_FrostBrand", + ["Improved Garrote"] = "Ability_Rogue_Garrote", + ["Improved Ghost Wolf"] = "Spell_Nature_SpiritWolf", + ["Improved Gouge"] = "Ability_Gouge", + ["Improved Grace of Air Totem"] = "Spell_Nature_InvisibilityTotem", + ["Improved Grounding Totem"] = "Spell_Nature_GroundingTotem", + ["Improved Hammer of Justice"] = "Spell_Holy_SealOfMight", + ["Improved Hamstring"] = "Ability_ShockWave", + ["Improved Healing Stream Totem"] = "INV_Spear_04", + ["Improved Healing Touch"] = "Spell_Nature_HealingTouch", + ["Improved Healing Wave"] = "Spell_Nature_MagicImmunity", + ["Improved Healing"] = "Spell_Holy_Heal02", + ["Improved Health Funnel"] = "Spell_Shadow_LifeDrain", + ["Improved Healthstone"] = "INV_Stone_04", + ["Improved Heroic Strike"] = "Ability_Rogue_Ambush", + ["Improved Hunter's Mark"] = "Ability_Hunter_SniperShot", + ["Improved Immolate"] = "Spell_Fire_Immolation", + ["Improved Imp"] = "Spell_Shadow_SummonImp", + ["Improved Inner Fire"] = "Spell_Holy_InnerFire", + ["Improved Instant Poison"] = "Ability_Poisons", + ["Improved Intercept"] = "Ability_Rogue_Sprint", + ["Improved Intimidating Shout"] = "Ability_GolemThunderClap", + ["Improved Judgement"] = "Spell_Holy_RighteousFury", + ["Improved Kick"] = "Ability_Kick", + ["Improved Kidney Shot"] = "Ability_Rogue_KidneyShot", + ["Improved Lash of Pain"] = "Spell_Shadow_Curse", + ["Improved Lay on Hands"] = "Spell_Holy_LayOnHands", + ["Improved Lesser Healing Wave"] = "Spell_Nature_HealingWaveLesser", + ["Improved Life Tap"] = "Spell_Shadow_BurningSpirit", + ["Improved Lightning Bolt"] = "Spell_Nature_Lightning", + ["Improved Lightning Shield"] = "Spell_Nature_LightningShield", + ["Improved Magma Totem"] = "Spell_Fire_SelfDestruct", + ["Improved Mana Burn"] = "Spell_Shadow_ManaBurn", + ["Improved Mana Shield"] = "Spell_Shadow_DetectLesserInvisibility", + ["Improved Mana Spring Totem"] = "Spell_Nature_ManaRegenTotem", + ["Improved Mark of the Wild"] = "Spell_Nature_Regeneration", + ["Improved Mend Pet"] = "Ability_Hunter_MendPet", + ["Improved Mind Blast"] = "Spell_Shadow_UnholyFrenzy", + ["Improved Moonfire"] = "Spell_Nature_StarFall", + ["Improved Nature's Grasp"] = "Spell_Nature_NaturesWrath", + ["Improved Overpower"] = "INV_Sword_05", + ["Improved Power Word: Fortitude"] = "Spell_Holy_WordFortitude", + ["Improved Power Word: Shield"] = "Spell_Holy_PowerWordShield", + ["Improved Prayer of Healing"] = "Spell_Holy_PrayerOfHealing02", + ["Improved Psychic Scream"] = "Spell_Shadow_PsychicScream", + ["Improved Pummel"] = "INV_Gauntlets_04", + ["Improved Regrowth"] = "Spell_Nature_ResistNature", + ["Improved Reincarnation"] = "Spell_Nature_Reincarnation", + ["Improved Rejuvenation"] = "Spell_Nature_Rejuvenation", + ["Improved Rend"] = "Ability_Gouge", + ["Improved Renew"] = "Spell_Holy_Renew", + ["Improved Retribution Aura"] = "Spell_Holy_AuraOfLight", + ["Improved Revenge"] = "Ability_Warrior_Revenge", + ["Improved Revive Pet"] = "Ability_Hunter_BeastSoothe", + ["Improved Righteous Fury"] = "Spell_Holy_SealOfFury", + ["Improved Rockbiter Weapon"] = "Spell_Nature_RockBiter", + ["Improved Rupture"] = "Ability_Rogue_Rupture", + ["Improved Sap"] = "Ability_Sap", + ["Improved Scorch"] = "Spell_Fire_SoulBurn", + ["Improved Scorpid Sting"] = "Ability_Hunter_CriticalShot", + ["Improved Seal of Righteousness"] = "Ability_ThunderBolt", + ["Improved Seal of the Crusader"] = "Spell_Holy_HolySmite", + ["Improved Searing Pain"] = "Spell_Fire_SoulBurn", + ["Improved Searing Totem"] = "Spell_Fire_SearingTotem", + ["Improved Serpent Sting"] = "Ability_Hunter_Quickshot", + ["Improved Shadow Bolt"] = "Spell_Shadow_ShadowBolt", + ["Improved Shadow Word: Pain"] = "Spell_Shadow_ShadowWordPain", + ["Improved Shield Bash"] = "Ability_Warrior_ShieldBash", + ["Improved Shield Block"] = "Ability_Defend", + ["Improved Shield Wall"] = "Ability_Warrior_ShieldWall", + ["Improved Shred"] = "Spell_Shadow_VampiricAura", + ["Improved Sinister Strike"] = "Spell_Shadow_RitualOfSacrifice", + ["Improved Slam"] = "Ability_Warrior_DecisiveStrike", + ["Improved Slice and Dice"] = "Ability_Rogue_SliceDice", + ["Improved Spellstone"] = "INV_Misc_Gem_Sapphire_01", + ["Improved Sprint"] = "Ability_Rogue_Sprint", + ["Improved Starfire"] = "Spell_Arcane_StarFire", + ["Improved Stoneclaw Totem"] = "Spell_Nature_StoneClawTotem", + ["Improved Stoneskin Totem"] = "Spell_Nature_StoneSkinTotem", + ["Improved Strength of Earth Totem"] = "Spell_Nature_EarthBindTotem", + ["Improved Succubus"] = "Spell_Shadow_SummonSuccubus", + ["Improved Sunder Armor"] = "Ability_Warrior_Sunder", + ["Improved Taunt"] = "Spell_Nature_Reincarnation", + ["Improved Thorns"] = "Spell_Nature_Thorns", + ["Improved Thunder Clap"] = "Ability_ThunderClap", + ["Improved Tranquility"] = "Spell_Nature_Tranquility", + ["Improved Vampiric Embrace"] = "Spell_Shadow_ImprovedVampiricEmbrace", + ["Improved Vanish"] = "Ability_Vanish", + ["Improved Voidwalker"] = "Spell_Shadow_SummonVoidWalker", + ["Improved Windfury Weapon"] = "Spell_Nature_Cyclone", + ["Improved Wing Clip"] = "Ability_Rogue_Trip", + ["Improved Wrath"] = "Spell_Nature_AbolishMagic", + ["Incinerate"] = "Spell_Fire_FlameShock", + ["Inferno"] = "Spell_Shadow_SummonInfernal", + ["Initiative"] = "Spell_Shadow_Fumble", + ["Inner Fire"] = "Spell_Holy_InnerFire", + ["Inner Focus"] = "Spell_Frost_WindWalkOn", + ["Innervate"] = "Spell_Nature_Lightning", + ["Insect Swarm"] = "Spell_Nature_InsectSwarm", + ["Inspiration"] = "Spell_Holy_LayOnHands", + ["Instant Poison II"] = "Ability_Poisons", + ["Instant Poison III"] = "Ability_Poisons", + ["Instant Poison IV"] = "Ability_Poisons", + ["Instant Poison V"] = "Ability_Poisons", + ["Instant Poison VI"] = "Ability_Poisons", + ["Instant Poison"] = "Ability_Poisons", + ["Intensity"] = "Spell_Fire_LavaSpawn", + ["Intercept"] = "Ability_Rogue_Sprint", + ["Intercept Stun"] = "Ability_Rogue_Sprint", + ["Intimidating Shout"] = "Ability_GolemThunderClap", + ["Intimidation"] = "Ability_Devour", + ["Iron Will"] = "Spell_Magic_MageArmor", + ["Judgement of Command"] = "Ability_Warrior_InnerRage", + ["Judgement of Justice"] = "Spell_Holy_SealOfWrath", + ["Judgement of Light"] = "Spell_Holy_HealingAura", + ["Judgement of Righteousness"] = "Spell_Holy_RighteousFury", + ["Judgement of Wisdom"] = "Spell_Holy_RighteousnessAura", + ["Judgement of the Crusader"] = "Spell_Holy_HolySmite", + ["Judgement"] = "Spell_Holy_RighteousFury", + ["Kick"] = "Ability_Kick", + ["Kidney Shot"] = "Ability_Rogue_KidneyShot", + ["Killer Instinct"] = "Spell_Holy_BlessingOfStamina", + ["Kodo Riding"] = "Spell_Nature_Swiftness", + ["Lash of Pain"] = "Spell_Shadow_Curse", + ["Last Stand"] = "Spell_Holy_AshesToAshes", + ["Lasting Judgement"] = "Spell_Holy_HealingAura", + ["Lay on Hands"] = "Spell_Holy_LayOnHands", + ["Leader of the Pack"] = "Spell_Nature_UnyeildingStamina", + ["Leather"] = "INV_Chest_Leather_09", + ["Leatherworking"] = "INV_Misc_ArmorKit_17", + ["Lesser Heal"] = "Spell_Holy_LesserHeal", + ["Lesser Healing Wave"] = "Spell_Nature_HealingWaveLesser", + ["Lesser Invisibility"] = "Spell_Magic_LesserInvisibilty", + ["Lethal Shots"] = "Ability_SearingArrow", + ["Lethality"] = "Ability_CriticalStrike", + ["Levitate"] = "Spell_Holy_LayOnHands", + ["Libram"] = "INV_Misc_Book_11", + ["Life Tap"] = "Spell_Shadow_BurningSpirit", + ["Lightning Bolt"] = "Spell_Nature_Lightning", + ["Lightning Breath"] = "Spell_Nature_Lightning", + ["Lightning Mastery"] = "Spell_Lightning_LightningBolt01", + ["Lightning Reflexes"] = "Spell_Nature_Invisibilty", + ["Lightning Shield"] = "Spell_Nature_LightningShield", + ["Lightwell Renew"] = "Spell_Holy_SummonLightwell", + ["Lightwell"] = "Spell_Holy_SummonLightwell", + ["Long Daze"] = "Spell_Frost_Stun", + ["Mace Specialization"] = "INV_Mace_01", + ["Mace Stun Effect"] = "Spell_Frost_Stun", + ["Mage Armor"] = "Spell_MageArmor", + ["Magma Totem"] = "Spell_Fire_SelfDestruct", + ["Mail"] = "INV_Chest_Chain_05", + ["Malice"] = "Ability_Racial_BloodRage", + ["Mana Burn"] = "Spell_Shadow_ManaBurn", + ["Mana Shield"] = "Spell_Shadow_DetectLesserInvisibility", + ["Mana Spring Totem"] = "Spell_Nature_ManaRegenTotem", + ["Mana Tide Totem"] = "Spell_Frost_SummonWaterElemental", + ["Mangle"] = "Ability_Druid_Mangle.tga", + ["Mark of the Wild"] = "Spell_Nature_Regeneration", + ["Martyrdom"] = "Spell_Nature_Tranquility", + ["Master Demonologist"] = "Spell_Shadow_ShadowPact", + ["Master Summoner"] = "Spell_Shadow_ImpPhaseShift", + ["Master of Deception"] = "Spell_Shadow_Charm", + ["Maul"] = "Ability_Druid_Maul", + ["Mechanostrider Piloting"] = "Spell_Nature_Swiftness", + ["Meditation"] = "Spell_Nature_Sleep", + ["Melee Specialization"] = "INV_Axe_02", + ["Mend Pet"] = "Ability_Hunter_MendPet", + ["Mental Agility"] = "Ability_Hibernation", + ["Mental Strength"] = "Spell_Nature_EnchantArmor", + ["Mind Blast"] = "Spell_Shadow_UnholyFrenzy", + ["Mind Control"] = "Spell_Shadow_ShadowWordDominate", + ["Mind Flay"] = "Spell_Shadow_SiphonMana", + ["Mind Soothe"] = "Spell_Holy_MindSooth", + ["Mind Vision"] = "Spell_Holy_MindVision", + ["Mind-numbing Poison II"] = "Spell_Nature_NullifyDisease", + ["Mind-numbing Poison III"] = "Spell_Nature_NullifyDisease", + ["Mind-numbing Poison"] = "Spell_Nature_NullifyDisease", + ["Mining"] = "Trade_Mining", + ["Mocking Blow"] = "Ability_Warrior_PunishingBlow", + ["Mongoose Bite"] = "Ability_Hunter_SwiftStrike", + ["Monster Slaying"] = "INV_Misc_Head_Dragon_Black", + ["Moonfire"] = "Spell_Nature_StarFall", + ["Moonfury"] = "Spell_Nature_MoonGlow", + ["Moonglow"] = "Spell_Nature_Sentinal", + ["Moonkin Aura"] = "Spell_Nature_MoonGlow", + ["Moonkin Form"] = "Spell_Nature_ForceOfNature", + ["Mortal Shots"] = "Ability_PierceDamage", + ["Mortal Strike"] = "Ability_Warrior_SavageBlow", + ["Multi-Shot"] = "Ability_UpgradeMoonGlaive", + ["Murder"] = "Spell_Shadow_DeathScream", + ["Natural Armor"] = "Spell_Nature_SpiritArmor", + ["Natural Shapeshifter"] = "Spell_Nature_WispSplode", + ["Natural Weapons"] = "INV_Staff_01", + ["Nature Resistance Totem"] = "Spell_Nature_NatureResistanceTotem", + ["Nature Resistance"] = "Spell_Nature_ResistNature", + ["Nature's Focus"] = "Spell_Nature_HealingWaveGreater", + ["Nature's Grace"] = "Spell_Nature_NaturesBlessing", + ["Nature's Grasp"] = "Spell_Nature_NaturesWrath", + ["Nature's Reach"] = "Spell_Nature_NatureTouchGrow", + ["Nature's Swiftness"] = "Spell_Nature_RavenForm", + ["Nightfall"] = "Spell_Shadow_Twilight", + ["Omen of Clarity"] = "Spell_Nature_CrystalBall", + ["One-Handed Axes"] = "INV_Axe_01", + ["One-Handed Maces"] = "INV_Mace_01", + ["One-Handed Swords"] = "Ability_MeleeDamage", + ["One-Handed Weapon Specialization"] = "INV_Sword_20", + ["Opening - No Text"] = "Trade_Engineering", + ["Opening"] = "Trade_Engineering", + ["Opportunity"] = "Ability_Warrior_WarCry", + ["Overpower"] = "Ability_MeleeDamage", + ["Paranoia"] = "Spell_Shadow_AuraOfDarkness", + ["Parry"] = "Ability_Parry", + ["Pathfinding"] = "Ability_Mount_JungleTiger", + ["Perception"] = "Spell_Nature_Sleep", + ["Permafrost"] = "Spell_Frost_Wisp", + ["Pet Aggression"] = "Ability_Druid_Maul", + ["Pet Hardiness"] = "Ability_BullRush", + ["Pet Recovery"] = "Ability_Hibernation", + ["Pet Resistance"] = "Spell_Holy_BlessingOfAgility", + ["Phase Shift"] = "Spell_Shadow_ImpPhaseShift", + ["Pick Lock"] = "Spell_Nature_MoonKey", + ["Pick Pocket"] = "INV_Misc_Bag_11", + ["Piercing Howl"] = "Spell_Shadow_DeathScream", + ["Piercing Ice"] = "Spell_Frost_Frostbolt", + ["Plate Mail"] = "INV_Chest_Plate01", + ["Poison Cleansing Totem"] = "Spell_Nature_PoisonCleansingTotem", + ["Poisons"] = "Trade_BrewPoison", + ["Polearm Specialization"] = "INV_Weapon_Halbard_01", + ["Polearms"] = "INV_Spear_06", + ["Polymorph"] = "Spell_Nature_Polymorph", + ["Polymorph: Pig"] = "Spell_Magic_PolymorphPig", + ["Polymorph: Turtle"] = "Ability_Hunter_Pet_Turtle", + ["Portal: Darnassus"] = "Spell_Arcane_PortalDarnassus", + ["Portal: Ironforge"] = "Spell_Arcane_PortalIronForge", + ["Portal: Orgrimmar"] = "Spell_Arcane_PortalOrgrimmar", + ["Portal: Stormwind"] = "Spell_Arcane_PortalStormWind", + ["Portal: Thunder Bluff"] = "Spell_Arcane_PortalThunderBluff", + ["Portal: Undercity"] = "Spell_Arcane_PortalUnderCity", + ["Pounce Bleed"] = "Ability_Druid_SupriseAttack", + ["Pounce"] = "Ability_Druid_SupriseAttack", + ["Power Infusion"] = "Spell_Holy_PowerInfusion", + ["Power Word: Fortitude"] = "Spell_Holy_WordFortitude", + ["Power Word: Shield"] = "Spell_Holy_PowerWordShield", + ["Prayer of Fortitude"] = "Spell_Holy_PrayerOfFortitude", + ["Prayer of Healing"] = "Spell_Holy_PrayerOfHealing02", + ["Prayer of Shadow Protection"] = "Spell_Holy_PrayerofShadowProtection", + ["Prayer of Spirit"] = "Spell_Holy_PrayerofSpirit", + ["Precision"] = "Ability_Marksmanship", + ["Predatory Strikes"] = "Ability_Hunter_Pet_Cat", + ["Premeditation"] = "Spell_Shadow_Possession", + ["Preparation"] = "Spell_Shadow_AntiShadow", + ["Presence of Mind"] = "Spell_Nature_EnchantArmor", + ["Primal Fury"] = "Ability_Racial_Cannibalize", + ["Prowl"] = "Ability_Druid_SupriseAttack", + ["Psychic Scream"] = "Spell_Shadow_PsychicScream", + ["Pummel"] = "INV_Gauntlets_04", + ["Purge"] = "Spell_Nature_Purge", + ["Purification"] = "Spell_Frost_WizardMark", + ["Purify"] = "Spell_Holy_Purify", + ["Pursuit of Justice"] = "Spell_Holy_PersuitofJustice", + ["Pyroblast"] = "Spell_Fire_Fireball02", + ["Pyroclasm"] = "Spell_Fire_Volcano", + ["Quickness"] = "Ability_Racial_ShadowMeld", + ["Rain of Fire"] = "Spell_Shadow_RainOfFire", + ["Rake"] = "Ability_Druid_Disembowel", + ["Ram Riding"] = "Spell_Nature_Swiftness", + ["Ranged Weapon Specialization"] = "INV_Weapon_Rifle_06", + ["Rapid Concealment"] = "Ability_Ambush", + ["Rapid Fire"] = "Ability_Hunter_RunningShot", + ["Raptor Riding"] = "Spell_Nature_Swiftness", + ["Raptor Strike"] = "Ability_MeleeDamage", + ["Ravage"] = "Ability_Druid_Ravage", + ["Readiness"] = "Spell_Nature_Sleep", + ["Rebirth"] = "Spell_Nature_Reincarnation", + ["Recklessness"] = "Ability_CriticalStrike", + ["Reckoning"] = "Spell_Holy_BlessingOfStrength", + ["Redemption"] = "Spell_Holy_Resurrection", + ["Redoubt"] = "Ability_Defend", + ["Reflection"] = "Spell_Frost_WindWalkOn", + ["Regeneration"] = "Spell_Nature_Regenerate", + ["Regrowth"] = "Spell_Nature_ResistNature", + ["Reincarnation"] = "Spell_Nature_Reincarnation", + ["Rejuvenation"] = "Spell_Nature_Rejuvenation", + ["Relentless Strikes"] = "Ability_Warrior_DecisiveStrike", + ["Remorseless Attacks"] = "Ability_FiegnDead", + ["Remove Curse"] = "Spell_Holy_RemoveCurse", + ["Remove Insignia"] = "Temp", + ["Remove Lesser Curse"] = "Spell_Nature_RemoveCurse", + ["Rend"] = "Ability_Gouge", + ["Renew"] = "Spell_Holy_Renew", + ["Repentance"] = "Spell_Holy_PrayerOfHealing", + ["Resurrection"] = "Spell_Holy_Resurrection", + ["Retaliation"] = "Ability_Warrior_Challange", + ["Retribution Aura"] = "Spell_Holy_AuraOfLight", + ["Revenge Stun"] = "Ability_Warrior_Revenge", + ["Revenge"] = "Ability_Warrior_Revenge", + ["Reverberation"] = "Spell_Frost_FrostWard", + ["Revive Pet"] = "Ability_Hunter_BeastSoothe", + ["Righteous Fury"] = "Spell_Holy_SealOfFury", + ["Rip"] = "Ability_GhoulFrenzy", + ["Riposte"] = "Ability_Warrior_Challange", + ["Ritual of Doom Effect"] = "Spell_Arcane_PortalDarnassus", + ["Ritual of Doom"] = "Spell_Shadow_AntiMagicShell", + ["Ritual of Summoning"] = "Spell_Shadow_Twilight", + ["Rockbiter Weapon"] = "Spell_Nature_RockBiter", + ["Rogue Passive"] = "Ability_Stealth", + ["Ruin"] = "Spell_Shadow_ShadowWordPain", + ["Rupture"] = "Ability_Rogue_Rupture", + ["Ruthlessness"] = "Ability_Druid_Disembowel", + ["Sacrifice"] = "Spell_Shadow_SacrificialShield", + ["Safe Fall"] = "INV_Feather_01", + ["Sanctity Aura"] = "Spell_Holy_MindVision", + ["Sap"] = "Ability_Sap", + ["Savage Fury"] = "Ability_Druid_Ravage", + ["Savage Strikes"] = "Ability_Racial_BloodRage", + ["Scare Beast"] = "Ability_Druid_Cower", + ["Scatter Shot"] = "Ability_GolemStormBolt", + ["Scorch"] = "Spell_Fire_SoulBurn", + ["Scorpid Poison"] = "Ability_PoisonSting", + ["Scorpid Sting"] = "Ability_Hunter_CriticalShot", + ["Screech"] = "Ability_Hunter_Pet_Bat", + ["Seal Fate"] = "Spell_Shadow_ChillTouch", + ["Seal of Command"] = "Ability_Warrior_InnerRage", + ["Seal of Justice"] = "Spell_Holy_SealOfWrath", + ["Seal of Light"] = "Spell_Holy_HealingAura", + ["Seal of Righteousness"] = "Ability_ThunderBolt", + ["Seal of Wisdom"] = "Spell_Holy_RighteousnessAura", + ["Seal of the Crusader"] = "Spell_Holy_HolySmite", + ["Searing Light"] = "Spell_Holy_SearingLightPriest", + ["Searing Pain"] = "Spell_Fire_SoulBurn", + ["Searing Totem"] = "Spell_Fire_SearingTotem", + ["Seduction"] = "Spell_Shadow_MindSteal", + ["Sense Demons"] = "Spell_Shadow_Metamorphosis", + ["Sense Undead"] = "Spell_Holy_SenseUndead", + ["Sentry Totem"] = "Spell_Nature_RemoveCurse", + ["Serpent Sting"] = "Ability_Hunter_Quickshot", + ["Setup"] = "Spell_Nature_MirrorImage", + ["Shackle Undead"] = "Spell_Nature_Slow", + ["Shadow Affinity"] = "Spell_Shadow_ShadowWard", + ["Shadow Bolt"] = "Spell_Shadow_ShadowBolt", + ["Shadow Focus"] = "Spell_Shadow_BurningSpirit", + ["Shadow Mastery"] = "Spell_Shadow_ShadeTrueSight", + ["Shadow Protection"] = "Spell_Shadow_AntiShadow", + ["Shadow Reach"] = "Spell_Shadow_ChillTouch", + ["Shadow Resistance Aura"] = "Spell_Shadow_SealOfKings", + ["Shadow Resistance"] = "Spell_Shadow_AntiShadow", + ["Shadow Trance"] = "Spell_Shadow_Twilight", + ["Shadow Ward"] = "Spell_Shadow_AntiShadow", + ["Shadow Weaving"] = "Spell_Shadow_BlackPlague", + ["Shadow Word: Pain"] = "Spell_Shadow_ShadowWordPain", + ["Shadowburn"] = "Spell_Shadow_ScourgeBuild", + ["Shadowform"] = "Spell_Shadow_Shadowform", + ["Shadowguard"] = "Spell_Nature_LightningShield", + ["Shadowmeld Passive"] = "Ability_Ambush", + ["Shadowmeld"] = "Ability_Ambush", + ["Sharpened Claws"] = "INV_Misc_MonsterClaw_04", + ["Shatter"] = "Spell_Frost_FrostShock", + ["Shell Shield"] = "Ability_Hunter_Pet_Turtle", + ["Shield Bash"] = "Ability_Warrior_ShieldBash", + ["Shield Block"] = "Ability_Defend", + ["Shield Slam"] = "INV_Shield_05", + ["Shield Specialization"] = "INV_Shield_06", + ["Shield Wall"] = "Ability_Warrior_ShieldWall", + ["Shield"] = "INV_Shield_04", + ["Shoot Bow"] = "Ability_Marksmanship", + ["Shoot Crossbow"] = "Ability_Marksmanship", + ["Shoot Gun"] = "Ability_Marksmanship", + ["Shoot"] = "Ability_ShootWand", + ["Shred"] = "Spell_Shadow_VampiricAura", + ["Silence"] = "Spell_Shadow_ImpPhaseShift", + ["Silent Resolve"] = "Spell_Nature_ManaRegenTotem", + ["Sinister Strike"] = "Spell_Shadow_RitualOfSacrifice", + ["Siphon Life"] = "Spell_Shadow_Requiem", + ["Skinning"] = "INV_Misc_Pelt_Wolf_01", + ["Slam"] = "Ability_Warrior_DecisiveStrike", + ["Slice and Dice"] = "Ability_Rogue_SliceDice", + ["Slow Fall"] = "Spell_Magic_FeatherFall", + ["Smelting"] = "Spell_Fire_FlameBlades", + ["Smite"] = "Spell_Holy_HolySmite", + ["Soothe Animal"] = "Ability_Hunter_BeastSoothe", + ["Soothing Kiss"] = "Spell_Shadow_SoothingKiss", + ["Soul Fire"] = "Spell_Fire_Fireball02", + ["Soul Link"] = "Spell_Shadow_GatherShadows", + ["Soulstone Resurrection"] = "INV_Misc_Orb_04", + ["Spell Lock"] = "Spell_Shadow_MindRot", + ["Spell Warding"] = "Spell_Holy_SpellWarding", + ["Spirit Bond"] = "Ability_Druid_DemoralizingRoar", + ["Spirit Tap"] = "Spell_Shadow_Requiem", + ["Spirit of Redemption"] = "INV_Enchant_EssenceEternalLarge", + ["Spiritual Focus"] = "Spell_Arcane_Blink", + ["Spiritual Guidance"] = "Spell_Holy_SpiritualGuidence", + ["Spiritual Healing"] = "Spell_Nature_MoonGlow", + ["Sprint"] = "Ability_Rogue_Sprint", + ["Starfire"] = "Spell_Arcane_StarFire", + ["Starshards"] = "Spell_Arcane_StarFire", + ["Staves"] = "INV_Staff_08", + ["Stealth"] = "Ability_Stealth", + ["Stoneclaw Totem"] = "Spell_Nature_StoneClawTotem", + ["Stoneform"] = "Spell_Shadow_UnholyStrength", + ["Stoneskin Totem"] = "Spell_Nature_StoneSkinTotem", + ["Stormstrike"] = "Spell_Holy_SealOfMight", + ["Strength of Earth Totem"] = "Spell_Nature_EarthBindTotem", + ["Stuck"] = "Spell_Shadow_Teleport", + ["Subtlety"] = "Ability_EyeOfTheOwl", + ["Suffering"] = "Spell_Shadow_BlackPlague", + ["Summon Charger"] = "Ability_Mount_Charger", + ["Summon Dreadsteed"] = "Ability_Mount_Dreadsteed", + ["Summon Felhunter"] = "Spell_Shadow_SummonFelHunter", + ["Summon Felsteed"] = "Spell_Nature_Swiftness", + ["Summon Imp"] = "Spell_Shadow_SummonImp", + ["Summon Succubus"] = "Spell_Shadow_SummonSuccubus", + ["Summon Voidwalker"] = "Spell_Shadow_SummonVoidWalker", + ["Summon Warhorse"] = "Spell_Nature_Swiftness", + ["Sunder Armor"] = "Ability_Warrior_Sunder", + ["Suppression"] = "Spell_Shadow_UnsummonBuilding", + ["Surefooted"] = "Ability_Kick", + ["Survivalist"] = "Spell_Shadow_Twilight", + ["Sweeping Strikes"] = "Ability_Rogue_SliceDice", + ["Swiftmend"] = "INV_Relics_IdolOfRejuvenation", + ["Swipe"] = "INV_Misc_MonsterClaw_03", + ["Sword Specialization"] = "INV_Sword_27", + ["Tactical Mastery"] = "Spell_Nature_EnchantArmor", + ["Tailoring"] = "Trade_Tailoring", + ["Tainted Blood"] = "Spell_Shadow_LifeDrain", + ["Tame Beast"] = "Ability_Hunter_BeastTaming", + ["Tamed Pet Passive"] = "Ability_Mount_PinkTiger", + ["Taunt"] = "Spell_Nature_Reincarnation", + ["Teleport: Darnassus"] = "Spell_Arcane_TeleportDarnassus", + ["Teleport: Ironforge"] = "Spell_Arcane_TeleportIronForge", + ["Teleport: Moonglade"] = "Spell_Arcane_TeleportMoonglade", + ["Teleport: Orgrimmar"] = "Spell_Arcane_TeleportOrgrimmar", + ["Teleport: Stormwind"] = "Spell_Arcane_TeleportStormWind", + ["Teleport: Thunder Bluff"] = "Spell_Arcane_TeleportThunderBluff", + ["Teleport: Undercity"] = "Spell_Arcane_TeleportUnderCity", + ["The Human Spirit"] = "INV_Enchant_ShardBrilliantSmall", + ["Thick Hide"] = "INV_Misc_Pelt_Bear_03", + ["Thorns"] = "Spell_Nature_Thorns", + ["Throw"] = "Ability_Throw", + ["Throwing Specialization"] = "INV_ThrowingAxe_03", + ["Throwing Weapon Specialization"] = "INV_ThrowingKnife_01", + ["Thrown"] = "INV_ThrowingKnife_02", + ["Thunder Clap"] = "Spell_Nature_ThunderClap", + ["Thundering Strikes"] = "Ability_ThunderBolt", + ["Thunderstomp"] = "Ability_Hunter_Pet_Gorilla", + ["Tidal Focus"] = "Spell_Frost_ManaRecharge", + ["Tidal Mastery"] = "Spell_Nature_Tranquility", + ["Tiger Riding"] = "Spell_Nature_Swiftness", + ["Tiger's Fury"] = "Ability_Mount_JungleTiger", + ["Torment"] = "Spell_Shadow_GatherShadows", + ["Totem"] = "Spell_Nature_StoneClawTotem", + ["Totemic Focus"] = "Spell_Nature_MoonGlow", + ["Touch of Weakness"] = "Spell_Shadow_DeadofNight", + ["Toughness"] = "Spell_Holy_Devotion", + ["Track Beasts"] = "Ability_Tracking", + ["Track Demons"] = "Spell_Shadow_SummonFelHunter", + ["Track Dragonkin"] = "INV_Misc_Head_Dragon_01", + ["Track Elementals"] = "Spell_Frost_SummonWaterElemental", + ["Track Giants"] = "Ability_Racial_Avatar", + ["Track Hidden"] = "Ability_Stealth", + ["Track Humanoids"] = "Ability_Tracking", + ["Track Undead"] = "Spell_Shadow_DarkSummoning", + ["Tranquil Air Totem"] = "Spell_Nature_Brilliance", + ["Tranquil Spirit"] = "Spell_Holy_ElunesGrace", + ["Tranquility"] = "Spell_Nature_Tranquility", + ["Tranquilizing Shot"] = "Spell_Nature_Drowsy", + ["Trap Mastery"] = "Ability_Ensnare", + ["Travel Form"] = "Ability_Druid_TravelForm", + ["Tremor Totem"] = "Spell_Nature_TremorTotem", + ["Trueshot Aura"] = "Ability_TrueShot", + ["Turn Undead"] = "Spell_Holy_TurnUndead", + ["Two-Handed Axes and Maces"] = "INV_Axe_10", + ["Two-Handed Axes"] = "INV_Axe_04", + ["Two-Handed Maces"] = "INV_Mace_04", + ["Two-Handed Swords"] = "Ability_MeleeDamage", + ["Two-Handed Weapon Specialization"] = "INV_Axe_09", + ["Unarmed"] = "Ability_GolemThunderClap", + ["Unbreakable Will"] = "Spell_Magic_MageArmor", + ["Unbridled Wrath Effect"] = "Spell_Nature_StoneClawTotem", + ["Unbridled Wrath"] = "Spell_Nature_StoneClawTotem", + ["Undead Horsemanship"] = "Spell_Nature_Swiftness", + ["Underwater Breathing"] = "Spell_Shadow_DemonBreath", + ["Unending Breath"] = "Spell_Shadow_DemonBreath", + ["Unholy Power"] = "Spell_Shadow_ShadowWordDominate", + ["Unleashed Fury"] = "Ability_BullRush", + ["Unyielding Faith"] = "Spell_Holy_UnyieldingFaith", + ["Vampiric Embrace"] = "Spell_Shadow_UnsummonBuilding", + ["Vanish"] = "Ability_Vanish", + ["Vanished"] = "Ability_Vanish", + ["Vengeance"] = "Ability_Warrior_Revenge", + ["Vigor"] = "Spell_Nature_EarthBindTotem", + ["Vile Poisons"] = "Ability_Rogue_FeignDeath", + ["Vindication"] = "Spell_Holy_Vindication", + ["Viper Sting"] = "Ability_Hunter_AimedShot", + ["Volley"] = "Ability_Marksmanship", + ["Wand Specialization"] = "INV_Wand_01", + ["Wands"] = "Ability_ShootWand", + ["War Stomp"] = "Ability_WarStomp", + ["Water Breathing"] = "Spell_Shadow_DemonBreath", + ["Water Walking"] = "Spell_Frost_WindWalkOn", + ["Weakened Soul"] = "Spell_Holy_AshesToAshes", + ["Whirlwind"] = "Ability_Whirlwind", + ["Will of the Forsaken"] = "Spell_Shadow_RaiseDead", + ["Windfury Totem"] = "Spell_Nature_Windfury", + ["Windfury Weapon"] = "Spell_Nature_Cyclone", + ["Windwall Totem"] = "Spell_Nature_EarthBind", + ["Wing Clip"] = "Ability_Rogue_Trip", + ["Winter's Chill"] = "Spell_Frost_ChillingBlast", + ["Wisp Spirit"] = "Spell_Nature_WispSplode", + ["Wolf Riding"] = "Spell_Nature_Swiftness", + ["Wound Poison II"] = "INV_Misc_Herb_16", + ["Wound Poison III"] = "INV_Misc_Herb_16", + ["Wound Poison IV"] = "INV_Misc_Herb_16", + ["Wound Poison"] = "INV_Misc_Herb_16", + ["Wrath"] = "Spell_Nature_AbolishMagic", + ["Wyvern Sting"] = "INV_Spear_02" +} + +BabbleSpell:Debug() +BabbleSpell:SetStrictness(true) + +function BabbleSpell:GetSpellIcon(spell) + self:argCheck(spell, 2, "string") + local icon = spellIcons[spell] or spellIcons[self:HasReverseTranslation(spell) and self:GetReverseTranslation(spell) or false] + if not icon then + return nil + end + return "Interface\\Icons\\" .. icon +end + +function BabbleSpell:GetShortSpellIcon(spell) + self:argCheck(spell, 2, "string") + return spellIcons[spell] or spellIcons[self:HasReverseTranslation(spell) and self:GetReverseTranslation(spell) or false] +end + +AceLibrary:Register(BabbleSpell, MAJOR_VERSION, MINOR_VERSION) +BabbleSpell = nil diff --git a/MikScrollingBattleText/MikCombatEventHelper.lua b/MikScrollingBattleText/MikCombatEventHelper.lua index 9752e4d..0904edc 100644 --- a/MikScrollingBattleText/MikCombatEventHelper.lua +++ b/MikScrollingBattleText/MikCombatEventHelper.lua @@ -1,6 +1,7 @@ -------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- -- Title: Mik's Combat Event Helper -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create "namespace." @@ -106,8 +107,6 @@ MikCEH.CombatEventData = {}; -- Hold trigger event data. MikCEH.TriggerEventData = {}; - - ------------------------------------------------------------------------------------- -- Private constants. ------------------------------------------------------------------------------------- @@ -199,6 +198,7 @@ function MikCEH.OnLoad() table.insert(listenEvents, "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES"); -- Incoming Melee Misses, Dodges, Parries, Blocks, Absorbs, Immunes table.insert(listenEvents, "CHAT_MSG_COMBAT_PARTY_MISSES"); -- Incoming Melee Misses, Dodges, Parries, Blocks, Absorbs, Immunes table.insert(listenEvents, "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses + table.insert(listenEvents, "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses -- athenne add table.insert(listenEvents, "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses table.insert(listenEvents, "CHAT_MSG_SPELL_PARTY_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses table.insert(listenEvents, "CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS"); -- Incoming damage from shields @@ -214,6 +214,7 @@ function MikCEH.OnLoad() table.insert(listenEvents, "CHAT_MSG_SPELL_SELF_BUFF"); -- Outgoing Heals, Power Gains, Dispel/Purge Resists table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS"); -- Outgoing HoTs table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS"); -- Outgoing HoTs + table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS"); table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"); -- Outgoing DoTs table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"); -- Outgoing DoTs, Power Losses table.insert(listenEvents, "CHAT_MSG_COMBAT_PET_HITS"); -- Outgoing Pet Melee Hits/Crits @@ -388,7 +389,10 @@ function MikCEH.ParseCombatEvents(event, combatMessage) MikCEH.ParseForIncomingSpellHeals(combatMessage); -- Incoming Debuffs, DoTs, Power Gains - elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE") then + elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE" or + event == "CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS" or + event == "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS" or + event == "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS") then MikCEH.ParseForIncomingDebuffs(combatMessage); MikCEH.ParseForPowerGains(combatMessage); @@ -890,6 +894,123 @@ function MikCEH.ParseForIncomingDamageShieldDamage(combatMessage) -- Return the parse was successful. return true; end + + -- Look for a resist. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLRESISTOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_RESIST, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a miss. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLMISSOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a dodge. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLDODGEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a parry. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPARRIEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a block. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLBLOCKEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for an absorb. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for an immune. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLIMMUNEOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a reflect. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLREFLECTOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_REFLECT, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Return the parse was NOT successful. return false; @@ -907,6 +1028,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_CRIT, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); --athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -921,6 +1047,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_NORMAL, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); --athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -936,6 +1067,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); -- athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -950,6 +1086,9 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, playerName); + -- Get overheal info. + MikCEH.PopulateOverhealData(eventData); --athenne add + -- Send the event. MikCEH.SendEvent(eventData); @@ -969,7 +1108,7 @@ end function MikCEH.ParseForIncomingDebuffs(combatMessage) -- Look for a debuff. local capturedData = MikCEH.GetCapturedData(combatMessage, "AURAADDEDSELFHARMFUL", {"%b"}); - + -- If a match was found. if (capturedData ~= nil) then local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_DEBUFF, capturedData.Amount, capturedData.BuffName); @@ -981,13 +1120,23 @@ function MikCEH.ParseForIncomingDebuffs(combatMessage) return true; end - + capturedData = nil -- Look for damage from a debuff. - local capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%a", "%t", "%n", "%s"}); + if (GetLocale() == "frFR") then + capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%t", "%a", "%s", "%n"}); + else + capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%a", "%t", "%n", "%s"}); +end -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name); + + local eventData + if (GetLocale() == "frFR") then + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name); + else + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.Name, capturedData.SpellName); + end -- Look for any partial actions and populate them into the event data. MikCEH.ParseForPartialActions(combatMessage, eventData); @@ -998,7 +1147,36 @@ function MikCEH.ParseForIncomingDebuffs(combatMessage) -- Return the parse was successful. return true; end + + + + -- Look for damage from a self debuff. + local capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGESELFSELF", {"%a", "%t", "%s"}); + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, nil); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for absorbed damage from a self debuff. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBSELFSELF", {"%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, capturedData.SpellName, nil); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Look for absorbed damage from a debuff. local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBOTHERSELF", {"%n", "%s"}); @@ -1023,14 +1201,16 @@ end -- Parses for power gains. -- ********************************************************************************** function MikCEH.ParseForPowerGains(combatMessage) - -- Look for self power gains. - local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%a", "%p", "%s"}); + local capturedData = nil + + -- Look for power gains from others. + local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINOTHERSELF", {"%p", "%a", "%s", "%n"}); -- If a match was found. if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1039,15 +1219,19 @@ function MikCEH.ParseForPowerGains(combatMessage) return true; end end - - -- Look for power gains from others. - local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINOTHERSELF", {"%a", "%p", "%n", "%s"}); + + -- Look for self power gains. +if (GetLocale() == "frFR") then + capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%p", "%s", "%a"}); +else + capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%a", "%p", "%s"}); +end -- If a match was found. if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1064,7 +1248,7 @@ function MikCEH.ParseForPowerGains(combatMessage) if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1088,7 +1272,7 @@ function MikCEH.ParseForPowerLosses(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1103,7 +1287,7 @@ function MikCEH.ParseForPowerLosses(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1140,6 +1324,20 @@ function MikCEH.ParseForIncomingBuffs(combatMessage) -- Return the parse was successful. return true; end + + -- Look for a self mana drain. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPOWERDRAINSELFSELF", {"%s", "%a", "%p"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Return the parse was NOT successful. return false; @@ -1708,7 +1906,113 @@ function MikCEH.ParseForOutgoingDamageShieldDamage(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, nil, capturedData.Name); + local eventData + if capturedData.DamageType == 2 and capturedData.Amount == "20" then + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, "Aura de vindicte", capturedData.Name); + else + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, nil, capturedData.Name); + end + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a resist. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLRESISTSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_RESIST, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for an immune. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLIMMUNESELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for an evade + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLEVADEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_EVADE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a miss. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLMISSSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a dodge. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLDODGEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a parry. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPARRIEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a block. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLBLOCKEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, capturedData.SpellName, capturedData.Name); -- Send the event. MikCEH.SendEvent(eventData); @@ -1838,6 +2142,9 @@ function MikCEH.ParseForOutgoingHoTs(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + MikCEH.PopulateOverhealData(eventData); --athenne add + -- Send the event. MikCEH.SendEvent(eventData); @@ -2589,7 +2896,7 @@ function MikCEH.GetGlobalStringInfo(globalStringName) formatCode = currentChar; else -- Check if the character is one of the magic characters and escape it. - if (string.find(currentChar, "[%^%$%(%)%.%[%]%*%+%-%?]")) then + if (string.find(currentChar, "[%^%$%(%)%.%[%]%*%-%+%?]")) then searchString = searchString .. "%" .. currentChar; -- Normal character so just add it to the formatted string. else @@ -2779,6 +3086,8 @@ function MikCEH.GetDamageTypeNumber(damageTypeString) return MikCEH.DAMAGETYPE_SHADOW; elseif (damageTypeString == SPELL_SCHOOL6_CAP) then return MikCEH.DAMAGETYPE_ARCANE; + elseif (damageTypeString == "Arcane") then + return MikCEH.DAMAGETYPE_ARCANE; end -- Return the unknown damage type. @@ -2865,7 +3174,7 @@ end -- Populates the combat event data table for a notification event with the passed -- info. -- ********************************************************************************** -function MikCEH.GetNotificationEventData(notificationType, amount, effectName) +function MikCEH.GetNotificationEventData(notificationType, amount, effectName, SpellName) -- Get the global combat event data table. local eventData = MikCEH.CombatEventData; @@ -2876,7 +3185,12 @@ function MikCEH.GetNotificationEventData(notificationType, amount, effectName) eventData.EventType = MikCEH.EVENTTYPE_NOTIFICATION; eventData.NotificationType = notificationType; eventData.Amount = amount; - eventData.EffectName = effectName; + if effectName == MANA or effectName == RAGE or effectName == ENERGY then + eventData.Amount = amount.." "..effectName; + eventData.EffectName = SpellName; + else + eventData.EffectName = effectName; + end -- Return the event data. return eventData; @@ -2926,7 +3240,14 @@ end -- ********************************************************************************** function MikCEH.PopulateOverhealData(eventData) -- Get the appropriate unit id for the unit being checked for overheals. + local unitID = MikCEH.GetUnitIDFromName(eventData.Name); + + if not unitID then + if UnitName("target") == eventData.Name then + unitID = "target"; + end + end -- Make sure it's a valid unit id. if (unitID) then @@ -3128,7 +3449,8 @@ function MikCEH.ParseSelfHealthTriggers() if (healthPercentage < triggerSettings.Threshold/100 and lastSelfHealthPercentage >= triggerSettings.Threshold/100) then -- Get trigger event data and call the trigger handler. local eventData = MikCEH.GetThresholdTriggerEventData(triggerKey, healthAmount); - MikCEH.SendTriggerEvent(eventData) + MikCEH.SendTriggerEvent(eventData); + PlaySoundFile("Interface\\AddOns\\MikScrollingBattleText\\sounds\\LowHealth.mp3"); end end @@ -3152,7 +3474,8 @@ function MikCEH.ParseSelfManaTriggers() if (manaPercentage < triggerSettings.Threshold/100 and lastSelfManaPercentage >= triggerSettings.Threshold/100) then -- Get trigger event data and call the trigger handler. local eventData = MikCEH.GetThresholdTriggerEventData(triggerKey, manaAmount); - MikCEH.SendTriggerEvent(eventData) + MikCEH.SendTriggerEvent(eventData); + PlaySoundFile("Interface\\AddOns\\MikScrollingBattleText\\sounds\\LowMana.mp3"); end end diff --git a/MikScrollingBattleText/MikScrollingBattleText-enUS.lua b/MikScrollingBattleText/MikScrollingBattleText-enUS.lua new file mode 100644 index 0000000..8d6d6ce --- /dev/null +++ b/MikScrollingBattleText/MikScrollingBattleText-enUS.lua @@ -0,0 +1,25 @@ +local L = AceLibrary("AceLocale-2.2"):new("MikScrollingBattleText") + +L:RegisterTranslations("enUS", function() + return { + ["Debug mode has been enabled."] = true, + ["Debug mode has been disabled."] = true, + ["Event search mode has been enabled. Searching for: "] = true, + ["Event search mode has been disabled."] = true, + ["The mod is now disabled."] = true, + ["The mod is now enabled."] = true, + ["Hits"] = true, + ["Crit"] = true, + ["Crits"] = true, + ["Multiple"] = true, + [" (%d vulnerability)"] = true, + [" <\124cff00b37e\124h%d\124h\124r>"] = true, + ["Profile Reset"] = true, + ["Drowning"] = true, + ["Falling"] = true, + ["Fatigue"] = true, + ["Fire"] = true, + ["Lava"] = true, + ["Slime"] = true, + } +end) \ No newline at end of file diff --git a/MikScrollingBattleText/MikScrollingBattleText-frFR.lua b/MikScrollingBattleText/MikScrollingBattleText-frFR.lua new file mode 100644 index 0000000..2c48368 --- /dev/null +++ b/MikScrollingBattleText/MikScrollingBattleText-frFR.lua @@ -0,0 +1,25 @@ +local L = AceLibrary("AceLocale-2.2"):new("MikScrollingBattleText") + +L:RegisterTranslations("frFR", function() + return { + ["Debug mode has been enabled."] = "Debug mode has been enabled.", + ["Debug mode has been disabled."] = "Debug mode has been disabled.", + ["Event search mode has been enabled. Searching for: "] = "Event search mode has been enabled. Searching for: ", + ["Event search mode has been disabled."] = "Event search mode has been disabled.", + ["The mod is now disabled."] = "The mod is now disabled.", + ["The mod is now enabled."] = "The mod is now enabled.", + ["Hits"] = "Coups", + ["Crit"] = "Crit", + ["Crits"] = "Crits", + ["Multiple"] = "Multiple", + [" (%d vulnerability)"] = " (%d vulnérabilité)", + [" <\124cff00b37e\124h%d\124h\124r>"] = " <\124cff00b37e\124h%d\124h\124r>", + ["Profile Reset"] = "Profile Reset", + ["Drowning"] = "Noyade", + ["Falling"] = "Chute", + ["Fatigue"] = "Fatigue", + ["Fire"] = "Feu", + ["Lava"] = "Lave", + ["Slime"] = "Gelée", + } +end) \ No newline at end of file diff --git a/MikScrollingBattleText/MikScrollingBattleText.lua b/MikScrollingBattleText/MikScrollingBattleText.lua index 940e471..3896c9a 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.lua +++ b/MikScrollingBattleText/MikScrollingBattleText.lua @@ -1,6 +1,7 @@ -------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- @@ -25,8 +26,96 @@ MikSBT.CurrentProfile = nil; -- Private constants. ------------------------------------------------------------------------------------- +-- cache des icones trouvées par l'algo et des icones qu'il ne trouverait pas +if not ICON_CACHE then + ICON_CACHE = {} +end +ICON_CACHE["repousser au loin"] = "Interface\\Icons\\Inv_Gauntlets_05" +ICON_CACHE["rupture du sol"] = "Interface\\Icons\\Spell_Nature_Earthquake" +ICON_CACHE["rayon de l'oeil"] = "Interface\\Icons\\Spell_Nature_Callstorm" +ICON_CACHE["salve de traits de l'ombre"] = "Interface\\Icons\\Spell_Shadow_Shadowbolt" +ICON_CACHE["tempête d'ombre"] = "Interface\\Icons\\spell_shadow_shadowbolt" +ICON_CACHE["gaz"] = "Interface\\Icons\\Spell_Nature_Abolishmagic" +ICON_CACHE["décimer"] = "Interface\\Icons\\Inv_Shield_01" +ICON_CACHE["champ statique"] = "Interface\\Icons\\Spell_Nature_WispHeal" +ICON_CACHE["horion"] = "Interface\\Icons\\Spell_Nature_WispHeal" +ICON_CACHE["secousse"] = "Interface\\Icons\\spell_nature_earthquake" +ICON_CACHE["charge de bouclier"] = "Interface\\Icons\\ability_warrior_charge" +ICON_CACHE["eclair des arcanes"] = "Interface\\Icons\\spell_arcane_starfire" +ICON_CACHE["gémissement des âmes"] = "Interface\\Icons\\spell_nature_lightning" +ICON_CACHE["trait noir"] = "Interface\\Icons\\spell_shadow_shadowbolt" +ICON_CACHE["infusion de mana"] = "Interface\\Icons\\inv_trinket_naxxramas01" +ICON_CACHE["afflux"] = "Interface\\Icons\\Ability_Warrior_Charge" +ICON_CACHE["frappe"] = "Interface\\Icons\\Ability_Rogue_Ambush" +ICON_CACHE["souffle de lave"] = "Interface\\Icons\\Spell_Fire_WindsOfWoe" +ICON_CACHE["frappe des ailes"] = "Interface\\Icons\\Inv_Misc_Monsterscales_14" +ICON_CACHE["lance de flammes"] = "Interface\\Icons\\Ability_Throw" +ICON_CACHE["horion de l'ombre"] = "Interface\\Icons\\Spell_Shadow_Shadowbolt" +ICON_CACHE["explosion de lave"] = "Interface\\Icons\\Spell_Fire_Volcano" +ICON_CACHE["bouclier de lave"] = "Interface\\Icons\\Spell_Fire_Immolation" +ICON_CACHE["fleur de feu"] = "Interface\\Icons\\Spell_Fire_Fireball02" +ICON_CACHE["bombe"] = "Interface\\Icons\\Spell_Fire_Selfdestruct" +ICON_CACHE["explosion"] = "Interface\\Icons\\Spell_Fire_Selfdestruct" +ICON_CACHE["colère de ragnaros"] = "Interface\\Icons\\Spell_Fire_Soulburn" +ICON_CACHE["choc"] = "Interface\\Icons\\Ability_Smash" +ICON_CACHE["secousse violente"] = "Interface\\Icons\\Ability_Smash" +ICON_CACHE["nova de feu"] = "Interface\\Icons\\Spell_Fire_SealOfFire" +ICON_CACHE["marque de détonation"] = "Interface\\Icons\\spell_fire_selfdestruct" +ICON_CACHE["cône de feu"] = "Interface\\Icons\\Spell_Fire_WindsOfWoe" +ICON_CACHE["volée de boules de feu"] = "Interface\\Icons\\Spell_Fire_Flamebolt" +ICON_CACHE["vague de foudre"] = "Interface\\Icons\\Spell_Nature_Chainlightning" +ICON_CACHE["coup de queue"] = "Interface\\Icons\\Inv_Misc_MonsterScales_05" +ICON_CACHE["exploiter faiblesse"] = "Interface\\Icons\\ability_backstab" +ICON_CACHE["lancer feu liquide"] = "Interface\\Icons\\spell_fire_meteorstorm" +ICON_CACHE["poing de force"] = "Interface\\Icons\\inv_gauntlets_31" +ICON_CACHE["uppercut"] = "Interface\\Icons\\inv_gauntlets_31" +ICON_CACHE["sangsue"] = "Interface\\Icons\\ability_racial_cannibalize" +ICON_CACHE["choc de feu"] = "Interface\\Icons\\spell_fire_immolation" +ICON_CACHE["malédiction du sang"] = "Interface\\Icons\\spell_shadow_ritualofsacrifice" +ICON_CACHE["brasier"] = "Interface\\Icons\\spell_fire_incinerate" +ICON_CACHE["météore"] = "Interface\\Icons\\spell_fire_meteorstorm" +ICON_CACHE["jet de poison"] = "Interface\\Icons\\spell_nature_corrosivebreath" +ICON_CACHE["explosion d'ombre"] = "Interface\\Icons\\spell_shadow_antishadow" +ICON_CACHE["voile de l'ombre"] = "Interface\\Icons\\spell_shadow_gathershadows" +ICON_CACHE["nuée maléfique"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["crachat empoisonné"] = "Interface\\Icons\\spell_nature_corrosivebreath" +ICON_CACHE["piétiner"] = "Interface\\Icons\\spell_nature_natureswrath" +ICON_CACHE["spores mutées"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["heurtoir du vomisseur de bile"] = "Interface\\Icons\\ability_devour" +ICON_CACHE["eruption"] = "Interface\\Icons\\spell_fire_volcano" +ICON_CACHE["tempête de mana"] = "Interface\\Icons\\spell_frost_icestorm" +ICON_CACHE["frappe sacrée"] = "Interface\\Icons\\ability_thunderbolt" +ICON_CACHE["grondement du tonnerre"] = "Interface\\Icons\\spell_nature_thunderclap" +ICON_CACHE["déflagration des arcanes"] = "Interface\\Icons\\spell_shadow_deathpact" +ICON_CACHE["nuage pestilentiel"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["régénération de mana"] = "Interface\\Icons\\spell_nature_manaregentotem" +ICON_CACHE["potion de soins"] = "Interface\\Icons\\inv_potion_54" +ICON_CACHE["restauration du mana"] = "Interface\\Icons\\inv_potion_76" +ICON_CACHE["rune démoniaque"] = "Interface\\Icons\\inv_misc_rune_04" +ICON_CACHE["rune ténébreuse"] = "Interface\\Icons\\spell_shadow_sealofkings" +ICON_CACHE["absorption de magie"] = "Interface\\Icons\\spell_nature_astralrecalgroup" +ICON_CACHE["gel"] = "Interface\\Icons\\spell_frost_glacier" + +ICON_CACHE["lésions cérébrales"] = "Interface\\Icons\\ability_gouge" +ICON_CACHE["décharge électrique"] = "Interface\\Icons\\spell_lightning_lightningbolt01" +ICON_CACHE["foudre"] = "Interface\\Icons\\spell_lightning_lightningbolt01" +ICON_CACHE["enchantement flamboyant"] = "Interface\\Icons\\spell_fire_selfdestruct" +ICON_CACHE["pierre de soins supérieure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins mineure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins inférieure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins majeure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["capturer un esprit"] = "Interface\\Icons\\Spell_Shadow_Haunting" + + +-- Cache des spells dont l'icone n'a pas été trouvée +NO_ICON_CACHE = {} + +-- Babble-Spell pour les icones des spells de class +local BS = AceLibrary("Babble-Spell-2.2") + -- Number of font strings. -local NUM_FONT_STRINGS = 15; +local NUM_FONT_STRINGS = 20; -- Animation values for incoming and outgoing events. local MIN_VERTICAL_SPACING = 8; @@ -40,7 +129,7 @@ local STICKY_DISPLAY_TIME = 2; local STICKY_FADE_OUT_TIME = 0.5; -- The animation speed. -local ANIMATION_SPEED = 0.015; +local ANIMATION_SPEED = 0.02; -- Scroll directions local SCROLL_DIRECTION_UP = 1; @@ -83,9 +172,9 @@ local stillMerging = false; local activeNonStickies = {}; local activeStickies = {}; --- Create a new table recycler object that holds up to 50 table references +-- Create a new table recycler object that holds up to 40 table references -- in primary cache. -local eventsRecycler = MikTRO:NewRecyclerObject(50); +local eventsRecycler = MikTRO:NewRecyclerObject(40); ------------------------------------------------------------------------------------- @@ -482,7 +571,11 @@ function MikSBT.CombatEventsHandler(combatEvent) end -- Copy the amount, effect name, and player/enemy name from the passed combat event data. - animationEvent.Amount = combatEvent.Amount; + -- if combatEvent.Amount then + -- animationEvent.Amount = combatEvent.Amount * 420; + -- else + animationEvent.Amount = combatEvent.Amount; + -- end animationEvent.EffectName = combatEvent.EffectName; animationEvent.Name = combatEvent.Name; @@ -490,19 +583,19 @@ function MikSBT.CombatEventsHandler(combatEvent) if (combatEvent.DamageType ~= nil) then animationEvent.DamageType = MikCEH.GetDamageTypeString(combatEvent.DamageType); end - + -- If there are partial action types set the partial effect text appropriately. if (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_ABSORB) then if (ABSORB_TRAILER) then - animationEvent.PartialEffectText = string.gsub(ABSORB_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = "\124cffFAFA00\124h"..string.gsub(ABSORB_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_BLOCK) then if (BLOCK_TRAILER) then - animationEvent.PartialEffectText = string.gsub(BLOCK_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = "\124cff7F00FF\124h"..string.gsub(BLOCK_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_RESIST) then if (RESIST_TRAILER) then - animationEvent.PartialEffectText = string.gsub(RESIST_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = " \124cff81007F\124h"..string.gsub(RESIST_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_VULNERABLE) then if (MikSBT.MSG_VULERNABLE_TRAILER) then @@ -510,11 +603,11 @@ function MikSBT.CombatEventsHandler(combatEvent) end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_CRUSHING) then if (CRUSHING_TRAILER) then - animationEvent.PartialEffectText = CRUSHING_TRAILER; + animationEvent.PartialEffectText = "\124cff7D0000\124h"..CRUSHING_TRAILER.."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_GLANCING) then if (GLANCING_TRAILER) then - animationEvent.PartialEffectText = GLANCING_TRAILER; + animationEvent.PartialEffectText = "\124cffFA0000\124h"..GLANCING_TRAILER.."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_OVERHEAL) then animationEvent.OverhealAmount = combatEvent.PartialAmount; @@ -553,6 +646,10 @@ function MikSBT.TriggerHandler(triggerEvent) animationEvent.ScrollArea = scrollAreas.Notification; animationEvent.EventSettings = MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].EventSettings; MikSBT.FormatTriggerText(animationEvent, triggerEvent); + + if (MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].Texture) then + animationEvent.Texture = MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].Texture + end -- Dispatch the event to the animation system. MikSBT.DispatchAnimationEvent(animationEvent); @@ -637,7 +734,11 @@ function MikSBT.MergeEvents(mergeData, numEvents) -- If the events have an amount then total them. if (animationEvent.Amount ~= nil and mergeData.UnmergedEvents[x].Amount ~= nil) then - animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; + animationEvent.Amount = tonumber (animationEvent.Amount, 10) + if animationEvent.Amount and mergeData.UnmergedEvents[x].Amount then + animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; + end + -- animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; end -- Check if there is an overheal amount and total it. @@ -916,12 +1017,39 @@ end -- ********************************************************************************** function MikSBT.FormatEventText(animationEvent) local outputString = animationEvent.UnformattedText; - + + -- Print(animationEvent) + -- Check if there is no unformatted text and bail. if (outputString == nil) then return; end + outputString = string.gsub(outputString, "-%%a", "\124cffff0000\124h-\124h\124r%%a"); + + if (animationEvent.DamageType ~= nil) then + if animationEvent.DamageType == SPELL_SCHOOL1_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffF6F99E\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL2_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFF8080\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL3_CAP then + outputString = string.gsub(outputString, "%%a", "\124cff80FF80\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL4_CAP then + outputString = string.gsub(outputString, "%%a", "\124cff8080FF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL5_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffA000A0\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL6_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFFB9FF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL0_CAP and animationEvent.EffectName and animationEvent.ScrollArea.AssociatedFrame == "MSBTFrameOutgoing" then + outputString = string.gsub(outputString, "%%a", "\124cffFFFF00\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL0_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFFFFFF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == "Inconnu" then + outputString = string.gsub(outputString, "%%a", "\124cffFFB9FF\124h%%a\124h\124r"); + -- DEFAULT_CHAT_FRAME:AddMessage(animationEvent.DamageType) + end + end + -- Substitute amount. if (animationEvent.Amount ~= nil) then -- Check if there is overheal info @@ -934,8 +1062,11 @@ function MikSBT.FormatEventText(animationEvent) end -- Substitute enemy/player names. - if (animationEvent.Name ~= nil) then + if (animationEvent.Name ~= nil) and (animationEvent.Name ~= UnitName("player")) then outputString = string.gsub(outputString, "%%n", animationEvent.Name); + else + outputString = string.gsub(outputString, "%(%%n%)", ""); + outputString = string.gsub(outputString, "%%n", ""); end -- Substitute effect names. @@ -1376,10 +1507,14 @@ function MikSBT.AddAnimation(animationEvent) -- Loop through all of the suppression entries and look for a match. for _, suppressionSettings in MikSBT.CurrentProfile.Suppressions do -- Check if the suppression's search pattern is a match. - if (suppressionSettings.Enabled and string.find(animationEvent.Text, suppressionSettings.SearchPattern)) then + if (suppressionSettings.Enabled and (string.find(animationEvent.Text, suppressionSettings.SearchPattern))) then -- Reclaim the animation event table to the events recycler and leave the function. eventsRecycler:ReclaimTable(animationEvent); - return; + return; + elseif (suppressionSettings.Enabled and animationEvent.EffectName and string.find(animationEvent.EffectName, suppressionSettings.SearchPattern)) then + -- Reclaim the animation event table to the events recycler and leave the function. + eventsRecycler:ReclaimTable(animationEvent); + return; end end @@ -1389,6 +1524,30 @@ function MikSBT.AddAnimation(animationEvent) animationEvent.IsSticky = true; end + -- Color UnitName by class + local UnitID = MikCEH.GetUnitIDFromName(animationEvent.Name) + if UnitID then + local Class = UnitClass(UnitID) + if Class and Class == "Paladin" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffF58CBA|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Druide" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFF7D0A|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Chasseur" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffABD473|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Mage" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff69CCF0|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Prêtre" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFFFFFF|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Voleur" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFFF569|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Chaman" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff0070DE|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Démoniste" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff9482C9|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Guerrier" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffC79C6E|h"..animationEvent.Name.."|h|r") + end + end -- Get the next available animation display info object for the scroll area. local animDisplayInfo = MikSBT.GetNextAnimationDisplayInfo(animationEvent); @@ -1447,7 +1606,62 @@ function MikSBT.AddAnimation(animationEvent) animDisplayInfo.FontObject:SetText(animationEvent.Text); animDisplayInfo.FontObject:SetAlpha(animDisplayInfo.Alpha); animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); - + + -- Athene Edit - Spell Icon + local texture + if animationEvent.Texture then texture = animationEvent.Texture end + if animationEvent.EffectName then + local name = string.gsub(animationEvent.EffectName, " %(%d+%)", "") + -- DEFAULT_CHAT_FRAME:AddMessage(animationEvent.EffectName) + -- DEFAULT_CHAT_FRAME:AddMessage(name) + -- texture = BS:GetSpellIcon(name) + if ICON_CACHE[strlower(name)] then + texture = ICON_CACHE[strlower(name)] + elseif not texture and MikSBT.FindBuff(name) then + local bufftype,index,_ = MikSBT.FindBuff(name) + local icon + if bufftype == "buff" then + icon = UnitBuff("player", index) + ICON_CACHE[strlower(name)] = icon + texture = icon + elseif bufftype == "debuff" then + icon = UnitDebuff("player", index) + ICON_CACHE[strlower(name)] = icon + texture = icon + else + texture = nil + NO_ICON_CACHE[strlower(name)] = 1 + end + elseif not texture and BS:GetSpellIcon(name) then + texture = BS:GetSpellIcon(name) + elseif not texture and MikSBT.FindItemIcon(name) then + texture = MikSBT.FindItemIcon(name) + ICON_CACHE[strlower(name)] = MikSBT.FindItemIcon(name) + elseif not texture then + texture = nil + NO_ICON_CACHE[strlower(name)] = 1 + end + end + + if texture then + -- local frame + if not animDisplayInfo.Texture then + -- on creer une nouvelle texture + animDisplayInfo.Texture = getglobal(animationEvent.ScrollArea.AssociatedFrame):CreateTexture(nil, "ARTWORK") + end + -- on réutilise une texture existante + animDisplayInfo.Texture:ClearAllPoints(); + animDisplayInfo.Texture:SetTexture(nil); + animDisplayInfo.Texture:SetTexture(texture); + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetTexCoord(0.125, 0.875, 0.125, 0.875) + animDisplayInfo.Texture:SetPoint("RIGHT", animDisplayInfo.FontObject, "LEFT", -4, 0); + animDisplayInfo.Texture:SetDrawLayer(animDisplayInfo.IsSticky and "OVERLAY" or animDisplayInfo.IsCrit and "OVERLAY" or "ARTWORK"); + elseif animDisplayInfo.Texture then + animDisplayInfo.Texture:SetTexture(nil); + end + -- Set the last update to the current time. animDisplayInfo.LastUpdated = GetTime(); @@ -1475,6 +1689,116 @@ function MikSBT.AddAnimation(animationEvent) eventsRecycler:ReclaimTable(animationEvent); end +-- ********************************************************************************** +-- This function return the buff texture based on +-- it's name. +-- ********************************************************************************** +function ItemLinkToName(link) + return gsub(link,"^.*%[(.*)%].*$","%1"); +end + +function MikSBT.FindItemIcon(item) + if ( not item ) then return; end + item = string.lower(item); + local link; + for i = 1,23 do + link = GetInventoryItemLink("player",i); + if ( link ) then + if ( item == string.lower(ItemLinkToName(link)) )then + return i, nil, GetInventoryItemTexture('player', i), GetInventoryItemCount('player', i); + end + end + end + local count, bag, slot, texture; + for i = 0,NUM_BAG_FRAMES do + for j = 1,MAX_CONTAINER_ITEMS do + link = GetContainerItemLink(i,j); + if ( link ) then + if ( item == string.lower(ItemLinkToName(link))) then + bag, slot = i, j; + texture, count = GetContainerItemInfo(i,j); + end + end + end + end + return texture; +end + +-- ********************************************************************************** +-- This function return the buff texture based on +-- it's name. +-- ********************************************************************************** +function MikSBT.FindBuff( obuff, unit, item) + local buff=strlower(obuff); + local tooltip=MSBT_Tooltip; + local textleft1=getglobal(tooltip:GetName().."TextLeft1"); + if ( not unit ) then + unit ='player'; + end + local my, me, mc, oy, oe, oc = GetWeaponEnchantInfo(); + if ( my ) then + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetInventoryItem( unit, 16); + for i=1, 23 do + local text = getglobal("MSBT_TooltipTextLeft"..i):GetText(); + if ( not text ) then + break; + elseif (text and strlower(text) == buff) then + tooltip:Hide(); + return "main",me, mc; + end + end + tooltip:Hide(); + elseif ( oy ) then + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetInventoryItem( unit, 17); + for i=1, 23 do + local text = getglobal("MSBT_TooltipTextLeft"..i):GetText(); + if ( not text ) then + break; + elseif (text and strlower(text) == buff) then + tooltip:Hide(); + return "off", oe, oc; + end + end + tooltip:Hide(); + end + if ( item ) then return end + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetTrackingSpell(); + local b = textleft1:GetText(); + if ( b and strlower(b) == buff ) then + tooltip:Hide(); + return "track",b; + end + local c=nil; + for i=1, 32 do + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetUnitBuff(unit, i); + b = textleft1:GetText(); + tooltip:Hide(); + if ( b and strlower(b) == buff ) then + return "buff", i, b; + elseif ( c==b ) then + break; + end + --c = b; + end + c=nil; + for i=1, 16 do + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetUnitDebuff(unit, i); + b = textleft1:GetText(); + tooltip:Hide(); + if ( b and strlower(b) == buff ) then + return "debuff", i, b; + elseif ( c==b) then + break; + end + --c = b; + end + tooltip:Hide(); +end -- ********************************************************************************** -- This function gets the next animation display info object for the correct @@ -1769,18 +2093,55 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) local textDelta = animDisplayInfo.FontSize * (1 - (elapsedTime / STICKY_FADE_IN_TIME)); animDisplayInfo.FontObject:SetTextHeight(animDisplayInfo.FontSize + textDelta); animDisplayInfo.FontObject:SetAlpha(1); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(1); + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize + textDelta); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize + textDelta); + end return; elseif (elapsedTime <= (STICKY_DISPLAY_TIME + STICKY_FADE_IN_TIME)) then animDisplayInfo.FontObject:SetTextHeight(animDisplayInfo.FontSize); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize); + end + if animDisplayInfo.IsCrit then + if not animDisplayInfo.timeLastJiggled then + animDisplayInfo.originalPositionX = animDisplayInfo.PositionX + animDisplayInfo.originalPositionY = animDisplayInfo.PositionY + animDisplayInfo.DecalageX = 0 + animDisplayInfo.DecalageY = 0 + animDisplayInfo.timeLastJiggled = 0 + end + if animDisplayInfo.PositionY ~= (animDisplayInfo.originalPositionY + animDisplayInfo.DecalageY) then + animDisplayInfo.originalPositionX = animDisplayInfo.PositionX + animDisplayInfo.originalPositionY = animDisplayInfo.PositionY + end + if (elapsedTime - animDisplayInfo.timeLastJiggled > 0.05) then + animDisplayInfo.DecalageX = math.ceil(math.random(-1, 1)); + animDisplayInfo.DecalageY = math.ceil(math.random(-1, 1)); + animDisplayInfo.PositionX = animDisplayInfo.originalPositionX + animDisplayInfo.DecalageX; + animDisplayInfo.PositionY = animDisplayInfo.originalPositionY + animDisplayInfo.DecalageY; + animDisplayInfo.timeLastJiggled = elapsedTime; + animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); + end + end return; elseif (elapsedTime <= (STICKY_DISPLAY_TIME + STICKY_FADE_IN_TIME + STICKY_FADE_OUT_TIME)) then local alpha = 1 - ((elapsedTime - STICKY_DISPLAY_TIME - STICKY_FADE_IN_TIME) / STICKY_FADE_OUT_TIME); + animDisplayInfo.timeLastJiggled = nil animDisplayInfo.FontObject:SetAlpha(alpha); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(alpha); + end return; end -- Deactivate the animation. animDisplayInfo.FontObject:SetAlpha(0); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(0); + end animDisplayInfo.IsActive = false; return; @@ -1797,6 +2158,9 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) if (animationComplete) then -- Set the font object's alpha. animDisplayInfo.FontObject:SetAlpha(0); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(0); + end -- Deactive the animation. animDisplayInfo.IsActive = false; @@ -1804,6 +2168,9 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) -- Move the font object and set its alpha. animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); animDisplayInfo.FontObject:SetAlpha(animDisplayInfo.Alpha); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(animDisplayInfo.Alpha); + end end -- Set the last update to the current time. @@ -2151,7 +2518,7 @@ end -- Displays the passed message in the passed scroll area with the passed parameters. -- This function is for easy displaying of messages from external sources. -- ********************************************************************************** -function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, colorB, fontSize, fontIndex, outlineIndex) +function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, colorB, fontSize, fontIndex, outlineIndex, Texture) -- Check if no message was passed and do nothing. if (message == nil) then return; @@ -2235,6 +2602,7 @@ function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, c animationEvent.ColorR = colorR; animationEvent.ColorG = colorG; animationEvent.ColorB = colorB; + animationEvent.Texture = Texture; -- Add the event to the animation system. diff --git a/MikScrollingBattleText/MikScrollingBattleText.toc b/MikScrollingBattleText/MikScrollingBattleText.toc index 878bc23..e780d18 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.toc +++ b/MikScrollingBattleText/MikScrollingBattleText.toc @@ -1,8 +1,17 @@ ## Interface: 11200 -## Version: 3.01 +## Version: 3.9 ## Title: Mik's Scrolling Battle Text ## Notes: Scrolls battle information around the character model. +## OptionalDeps: SW_FixLogStrings ## SavedVariables: MikSBT_Save + +Libs\AceLibrary\AceLibrary.lua +Libs\AceLocale-2.2\AceLocale-2.2.lua +Libs\BabbleSpell-2.2\Babble-Spell-2.2.lua + +MikScrollingBattleText-enUS.lua +MikScrollingBattleText-frFR.lua + localization.lua MikTableRecyclerObject.lua MikCombatEventHelper.lua diff --git a/MikScrollingBattleText/MikScrollingBattleText.xml b/MikScrollingBattleText/MikScrollingBattleText.xml index c6b75ac..0975874 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.xml +++ b/MikScrollingBattleText/MikScrollingBattleText.xml @@ -11,6 +11,15 @@ + + + @@ -29,91 +38,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -140,91 +159,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -251,91 +280,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MikScrollingBattleText/MikTableRecyclerObject.lua b/MikScrollingBattleText/MikTableRecyclerObject.lua index 9c35d6b..03d308b 100644 --- a/MikScrollingBattleText/MikTableRecyclerObject.lua +++ b/MikScrollingBattleText/MikTableRecyclerObject.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Table Recyler Object -- Author: Mik +-- Maintainer: Athene -- Credits: -- Thanks to tekkub, the author of compostLib. I adapted much of his code for -- this object. diff --git a/MikScrollingBattleText/localization.lua b/MikScrollingBattleText/localization.lua index f3f5b70..e5dbf56 100644 --- a/MikScrollingBattleText/localization.lua +++ b/MikScrollingBattleText/localization.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create "namespace." @@ -11,12 +12,14 @@ MikSBT = {}; ------------------------------------------------------------------------------- MikSBT.MOD_NAME = "MikScrollingBattleText" -MikSBT.VERSION_NUMBER = 3.01; -MikSBT.VERSION_STRING = "v3.01"; -MikSBT.WINDOW_TITLE = "Mik's Scrolling Battle Text " .. MikSBT.VERSION_STRING; +MikSBT.VERSION_NUMBER = 3.9; +MikSBT.VERSION_STRING = "v3.9"; +MikSBT.WINDOW_TITLE = "Mik's Scrolling Battle Text " .. MikSBT.VERSION_STRING .. " - \124cffF58CBA\124hAthene Edit\124h\124r"; MikSBT.COMMAND = "/msbt"; +local BS = AceLibrary("Babble-Spell-2.2") +local L = AceLibrary("AceLocale-2.2"):new(MikSBT.MOD_NAME) ------------------------------------------------------------------------------- -- English (Default) @@ -53,25 +56,25 @@ MikSBT.COMMAND_USAGE = { -- Output messages ------------------------------ -MikSBT.MSG_DEBUG_ENABLE = "Debug mode has been enabled."; -MikSBT.MSG_DEBUG_DISABLE = "Debug mode has been disabled."; -MikSBT.MSG_SEARCH_ENABLE = "Event search mode has been enabled. Searching for: "; -MikSBT.MSG_SEARCH_DISABLE = "Event search mode has been disabled."; -MikSBT.MSG_DISABLE = "The mod is now disabled."; -MikSBT.MSG_ENABLE = "The mod is now enabled."; -MikSBT.MSG_HITS = "Hits"; -MikSBT.MSG_CRIT = "Crit"; -MikSBT.MSG_CRITS = "Crits"; -MikSBT.MSG_MULTIPLE_TARGETS = "Multiple"; -MikSBT.MSG_VULERNABLE_TRAILER = " (%d vulnerability)"; -MikSBT.MSG_OVERHEAL_TRAILER = " <%d>"; -MikSBT.MSG_PROFILE_RESET = "Profile Reset"; -MikSBT.MSG_ENVIRONMENTAL_DROWNING = "Drowning"; -MikSBT.MSG_ENVIRONMENTAL_FALLING = "Falling"; -MikSBT.MSG_ENVIRONMENTAL_FATIGUE = "Fatigue"; -MikSBT.MSG_ENVIRONMENTAL_FIRE = "Fire"; -MikSBT.MSG_ENVIRONMENTAL_LAVA = "Lava"; -MikSBT.MSG_ENVIRONMENTAL_SLIME = "Slime"; +MikSBT.MSG_DEBUG_ENABLE = L["Debug mode has been enabled."]; +MikSBT.MSG_DEBUG_DISABLE = L["Debug mode has been disabled."]; +MikSBT.MSG_SEARCH_ENABLE = L["Event search mode has been enabled. Searching for: "]; +MikSBT.MSG_SEARCH_DISABLE = L["Event search mode has been disabled."]; +MikSBT.MSG_DISABLE = L["The mod is now disabled."]; +MikSBT.MSG_ENABLE = L["The mod is now enabled."]; +MikSBT.MSG_HITS = L["Hits"]; +MikSBT.MSG_CRIT = L["Crit"]; +MikSBT.MSG_CRITS = L["Crits"]; +MikSBT.MSG_MULTIPLE_TARGETS = L["Multiple"]; +MikSBT.MSG_VULERNABLE_TRAILER = L[" (%d vulnerability)"]; +MikSBT.MSG_OVERHEAL_TRAILER = L[" <\124cff00b37e\124h%d\124h\124r>"]; +MikSBT.MSG_PROFILE_RESET = L["Profile Reset"]; +MikSBT.MSG_ENVIRONMENTAL_DROWNING = L["Drowning"]; +MikSBT.MSG_ENVIRONMENTAL_FALLING = L["Falling"]; +MikSBT.MSG_ENVIRONMENTAL_FATIGUE = L["Fatigue"]; +MikSBT.MSG_ENVIRONMENTAL_FIRE = L["Fire"]; +MikSBT.MSG_ENVIRONMENTAL_LAVA = L["Lava"]; +MikSBT.MSG_ENVIRONMENTAL_SLIME = L["Slime"]; @@ -89,6 +92,11 @@ MikSBT.AVAILABLE_FONTS = { [6] = {Name="Friz", Path="Fonts\\FRIZQT__.TTF"}, [7] = {Name="Porky", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\porky.ttf"}, [8] = {Name="Signature", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\signature.ttf"}, + [9] = {Name="Black Castle", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\BlackCastleMF.ttf"}, + [10] = {Name="Exocet", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\exocet.ttf"}, + [11] = {Name="FuturaBold", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\FuturaBold.ttf"}, + [12] = {Name="Mail Ray Stuff", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\mailrays.ttf"}, + [13] = {Name="Pepsi", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\pepsi.ttf"}, }; -- Holds the available font outlines. @@ -151,20 +159,20 @@ MikSBT.DEFAULT_CONFIG = { CreationVersion = MikSBT.VERSION_NUMBER, ShowPartialEffects = true, ShowOverheals = true, - ShowGameDamage = false, + ShowGameDamage = true, UseStickyCrits = true, - AnimationStep = 2, + AnimationStep = 1.5, MasterFontSettings = { - Normal = {FontIndex=1, OutlineIndex=3, FontSize=18}, - Crit = {FontIndex=1, OutlineIndex=3, FontSize=26}, + Normal = {FontIndex=7, OutlineIndex=2, FontSize=18}, + Crit = {FontIndex=7, OutlineIndex=2, FontSize=26}, }, DisplaySettings = { Incoming = { Show = true, - FrameOffsets = {x=-60, y=-160}, - AnimationStyle = 2, - ScrollDirection = 2, - ScrollHeight = 260, + FrameOffsets = {x=-450, y=-170}, + AnimationStyle = 1, + ScrollDirection = 1, + ScrollHeight = 450, FontSettings = { Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -173,10 +181,10 @@ MikSBT.DEFAULT_CONFIG = { }, Outgoing = { Show = true, - FrameOffsets = {x=60, y=-160}, - AnimationStyle = 3, - ScrollDirection = 2, - ScrollHeight = 260, + FrameOffsets = {x=450, y=-170}, + AnimationStyle = 1, + ScrollDirection = 1, + ScrollHeight = 450, FontSettings = { Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -185,8 +193,8 @@ MikSBT.DEFAULT_CONFIG = { }, Notification = { Show = true, - FrameOffsets = {x=0, y=100}, - AnimationStyle = 1, + FrameOffsets = {x=-300, y=-322}, + AnimationStyle = 1, ScrollDirection = 1, ScrollHeight = 150, FontSettings = { @@ -199,16 +207,16 @@ MikSBT.DEFAULT_CONFIG = { EventSettings = { MSBT_EVENTTYPE_INCOMING_DAMAGE = { Show = true, - Message = "(%n) -%a", + Message = "-%a", FontSettings = { - Color = {r=1, g=0, b=0}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_MISS = { Show = true, - Message = "Miss!", + Message = MISS.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -216,7 +224,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_DODGE = { Show = true, - Message = "Dodge!", + Message = DODGE.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -224,7 +232,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_PARRY = { Show = true, - Message = "Parry!", + Message = PARRY.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -232,7 +240,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_BLOCK = { Show = true, - Message = "Block!", + Message = BLOCK.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -240,7 +248,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_ABSORB = { Show = true, - Message = "Absorb!", + Message = ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -248,7 +256,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_IMMUNE = { Show = true, - Message = "Immune!", + Message = IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -256,24 +264,24 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_DAMAGE = { Show = true, - Message = "(%s) -%a", + Message = "-%a", FontSettings = { - Color = {r=0.502, g=0, b=0.502}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_SPELL_DOT = { Show = true, - Message = "(%s) -%a", + Message = "-%a", FontSettings = { - Color = {r=0.502, g=0, b=0.502}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_SPELL_MISS = { Show = true, - Message = "(%s) Miss!", + Message = MISS.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -281,7 +289,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_DODGE = { Show = true, - Message = "(%s) Dodge!", + Message = DODGE.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -289,7 +297,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_PARRY = { Show = true, - Message = "(%s) Parry!", + Message = PARRY.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -297,7 +305,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_BLOCK = { Show = true, - Message = "(%s) Block!", + Message = BLOCK.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -305,7 +313,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_RESIST = { Show = true, - Message = "(%s) Resist!", + Message = "(%s) "..RESIST.."!", FontSettings = { Color = {r=0.502, g=0, b=0.502}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -313,7 +321,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_ABSORB = { Show = true, - Message = "(%s) Absorb!", + Message = "(%s) "..ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -321,7 +329,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_IMMUNE = { Show = true, - Message = "(%s) Immune!", + Message = "(%s) "..IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -329,7 +337,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_REFLECT = { Show = true, - Message = "(%s) Reflect!", + Message = "(%s) "..REFLECT.."!", FontSettings = { Color = {r=0.502, g=0, b=0.502}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -338,7 +346,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_HEAL = { Show = true, - Message = "(%s - %n) +%a", + Message = "+%a (%n)", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -347,7 +355,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_HOT = { Show = true, - Message = "(%s - %n) +%a", + Message = "+%a (%n)", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -367,46 +375,46 @@ MikSBT.DEFAULT_CONFIG = { Show = true, Message = "%a", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_MISS = { Show = true, - Message = "Miss!", + Message = MISS.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_DODGE = { Show = true, - Message = "Dodge!", + Message = DODGE.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_PARRY = { Show = true, - Message = "Parry!", + Message = PARRY.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_BLOCK = { Show = true, - Message = "Block!", + Message = BLOCK.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_ABSORB = { Show = true, - Message = "Absorb!", + Message = ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -414,7 +422,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_IMMUNE = { Show = true, - Message = "Immune!", + Message = IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -422,7 +430,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_EVADE = { Show = true, - Message = "Evade!", + Message = EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -430,7 +438,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_DAMAGE = { Show = true, - Message = "%a (%s)", + Message = "%a", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -439,7 +447,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_DOT = { Show = true, - Message = "%a (%s)", + Message = "%a", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -447,39 +455,39 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_MISS = { Show = true, - Message = "Miss! (%s)", + Message = MISS.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_DODGE = { Show = true, - Message = "Dodge! (%s)", + Message = DODGE.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_PARRY = { Show = true, - Message = "Parry! (%s)", + Message = PARRY.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_BLOCK = { Show = true, - Message = "Block! (%s)", + Message = BLOCK.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_RESIST = { Show = true, - Message = "Resist! (%s)", + Message = RESIST.."!", FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -487,7 +495,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_ABSORB = { Show = true, - Message = "Absorb! (%s)", + Message = "(%s) "..ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -495,7 +503,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_IMMUNE = { Show = true, - Message = "Immune! (%s)", + Message = "(%s) "..IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -503,7 +511,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_REFLECT = { Show = true, - Message = "Reflect! (%s)", + Message = "(%s) "..REFLECT.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -512,7 +520,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_EVADE = { Show = true, - Message = "Evade! (%s)", + Message = "(%s) "..EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -520,7 +528,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_HEAL = { Show = true, - Message = "+%a (%s - %n)", + Message = "+%a", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -529,7 +537,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_HOT = { Show = true, - Message = "+%a (%s - %n)", + Message = "+%a", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -549,7 +557,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_MISS = { Show = true, - Message = "Pet Miss!", + Message = "Pet "..MISS.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -557,7 +565,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_DODGE = { Show = true, - Message = "Pet Dodge!", + Message = "Pet "..DODGE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -565,7 +573,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_PARRY = { Show = true, - Message = "Pet Parry!", + Message = "Pet "..PARRY.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -573,7 +581,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_BLOCK = { Show = true, - Message = "Pet Block!", + Message = "Pet "..BLOCK.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -581,7 +589,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_ABSORB = { Show = true, - Message = "Pet Absorb!", + Message = "Pet "..ABSORB.."!", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -589,7 +597,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_IMMUNE = { Show = true, - Message = "Pet Immune!", + Message = "Pet "..IMMUNE.."!", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -597,7 +605,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_EVADE = { Show = true, - Message = "Pet Evade!", + Message = "Pet "..EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -614,7 +622,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_MISS = { Show = true, - Message = "Pet Miss! (%s)", + Message = "Pet "..MISS.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -622,7 +630,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_DODGE = { Show = true, - Message = "Pet Dodge! (%s)", + Message = "Pet "..DODGE.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -630,7 +638,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_PARRY = { Show = true, - Message = "Pet Parry! (%s)", + Message = "Pet "..PARRY.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -638,7 +646,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_BLOCK = { Show = true, - Message = "Pet Block! (%s)", + Message = "Pet "..BLOCK.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -646,7 +654,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_RESIST = { Show = true, - Message = "Pet Resist! (%s)", + Message = "Pet "..RESIST.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -654,7 +662,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_ABSORB = { Show = true, - Message = "Pet Absorb! (%s)", + Message = "Pet "..ABSORB.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -662,7 +670,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_IMMUNE = { Show = true, - Message = "Pet Immune! (%s)", + Message = "Pet "..IMMUNE.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -670,7 +678,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_EVADE = { Show = true, - Message = "Pet Evade! (%s)", + Message = "Pet "..EVADE.."! (%s)", FontSettings = { Color = {r=1, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -735,19 +743,19 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_POWER_GAIN = { Show = true, - Message = "+%a %s", + Message = "+%a", IsSticky = false, FontSettings = { - Color = {r=1, g=1, b=0}, + Color = {r=0.3098039215686275, g=0.3098039215686275, b=0.8784313725490196}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_NOTIFICATION_POWER_LOSS = { Show = true, - Message = "-%a %s", + Message = "-%a", IsSticky = false, FontSettings = { - Color = {r=1, g=1, b=0}, + Color = {r=0.7568627450980392, g=0.2705882352941176, b=0.8235294117647058}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, @@ -771,7 +779,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_HONOR_GAIN = { Show = true, - Message = "+%a Honor", + Message = "+%a "..HONOR, IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -780,7 +788,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_REP_GAIN = { Show = true, - Message = "+%a Reputation (%s)", + Message = "+%a "..TUTORIAL_TITLE16.." (%s)", IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -789,7 +797,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_REP_LOSS = { Show = true, - Message = "-%a Reputation (%s)", + Message = "-%a "..TUTORIAL_TITLE16.." (%s)", IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -849,6 +857,7 @@ MikSBT.DEFAULT_CONFIG = { TriggerType = 1, Threshold = 40, }, + Texture = "Interface\\Icons\\spell_holy_sealofsacrifice" }, MSBT_TRIGGER_LOW_MANA = { EventSettings = { @@ -881,11 +890,12 @@ MikSBT.DEFAULT_CONFIG = { TriggerType = 3, Threshold = 40, }, + Texture = "Interface\\Icons\\spell_holy_sealofsacrifice" }, MSBT_TRIGGER_EXECUTE = { EventSettings = { Show = true, - Message = "Execute!", + Message = BS["Execute"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -893,15 +903,33 @@ MikSBT.DEFAULT_CONFIG = { }, }, TriggerSettings = { - Classes = {PALADIN=true,WARRIOR=true}, + Classes = {WARRIOR=true}, TriggerType = 4, Threshold = 20, }, + Texture = "Interface\\Icons\\inv_sword_48" + }, + MSBT_TRIGGER_HAMMER_OF_WRATH = { + EventSettings = { + Show = true, + Message = BS["Hammer of Wrath"].."!", + IsSticky = true, + FontSettings = { + Color = {r=1, g=1, b=0}, + Normal = {FontIndex=0, OutlineIndex=0, FontSize=26}, + }, + }, + TriggerSettings = { + Classes = {PALADIN=true}, + TriggerType = 4, + Threshold = 20, + }, + Texture = "Interface\\Icons\\ability_thunderclap" }, MSBT_TRIGGER_COUNTER_ATTACK = { EventSettings = { Show = true, - Message = "Counterattack!", + Message = BS["Counterattack"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -915,11 +943,12 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSPARRYOTHERSELF", "SPELLPARRIEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_warrior_challange" }, MSBT_TRIGGER_MONGOOSE_BITE = { EventSettings = { Show = true, - Message = "Mongoose Bite!", + Message = BS["Mongoose Bite"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -933,11 +962,12 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSDODGEOTHERSELF", "SPELLDODGEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_hunter_swiftstrike" }, MSBT_TRIGGER_CLEARCAST = { EventSettings = { Show = true, - Message = "Clearcast!", + Message = BS["Clearcasting"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -948,13 +978,14 @@ MikSBT.DEFAULT_CONFIG = { Classes = {MAGE=true,SHAMAN=true}, TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain Clearcast"}, + SearchPatterns = {string.format(AURAADDEDSELFHELPFUL, BS["Clearcasting"])}, }, + Texture = "Interface\\Icons\\spell_shadow_manaburn" }, MSBT_TRIGGER_RIPOSTE = { EventSettings = { Show = true, - Message = "Riposte!", + Message = BS["Riposte"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -968,6 +999,7 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSPARRYOTHERSELF", "SPELLPARRIEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_warrior_challange" }, MSBT_TRIGGER_WINDFURY = { EventSettings = { @@ -982,13 +1014,31 @@ MikSBT.DEFAULT_CONFIG = { TriggerSettings = { TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain %d extra attacks through Windfury"}, + SearchPatterns = {string.format(SPELLEXTRAATTACKSSELF, 1, BS["Windfury Weapon"])}, --"Vous gagnez %d attaques supplémentaires grâce à Arme Furie-des-vents" }, + Texture = "Interface\\Icons\\spell_nature_cyclone" + }, + MSBT_TRIGGER_HAND_OF_JUSTICE = { + EventSettings = { + Show = true, + Message = BS["Hand of Justice"].."!", + IsSticky = true, + FontSettings = { + Color = {r=1, g=1, b=0}, + Normal = {FontIndex=0, OutlineIndex=0, FontSize=26}, + }, + }, + TriggerSettings = { + TriggerType = 6, + TriggerEvents = {"CHAT_MSG_SPELL_SELF_BUFF"}, + SearchPatterns = {string.format(SPELLEXTRAATTACKSSELF, 1, BS["Hand of Justice"])}, --"Vous gagnez %d attaques supplémentaires grâce à Main de justice" + }, + Texture = "Interface\\Icons\\inv_jewelry_talisman_01" }, MSBT_TRIGGER_NIGHTFALL = { EventSettings = { Show = true, - Message = "Nightfall!", + Message = BS["Nightfall"].."!", IsSticky = true, FontSettings = { Color = {r=0.709, g=0, b=0.709}, @@ -999,13 +1049,14 @@ MikSBT.DEFAULT_CONFIG = { Classes = {WARLOCK=true}, TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain Shadow Trance"}, + SearchPatterns = {string.format(AURAADDEDSELFHELPFUL, BS["Shadow Trance"])}, }, + Texture = "Interface\\Icons\\spell_shadow_twilight" }, MSBT_TRIGGER_OVERPOWER = { EventSettings = { Show = true, - Message = "Overpower!", + Message = BS["Overpower"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -1018,6 +1069,7 @@ MikSBT.DEFAULT_CONFIG = { TriggerEvents = {"CHAT_MSG_COMBAT_SELF_MISSES", "CHAT_MSG_SPELL_SELF_DAMAGE"}, SearchPatterns = {"VSDODGESELFOTHER", "SPELLDODGEDSELFOTHER"}, }, + Texture = "Interface\\Icons\\ability_meleedamage" }, }, diff --git a/MikScrollingBattleText/sounds/LowHealth.mp3 b/MikScrollingBattleText/sounds/LowHealth.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b97b8942cb9548d5fd0c095eba7b2dff31b16a8f GIT binary patch literal 8112 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 literal 0 HcmV?d00001 diff --git a/MikScrollingBattleText/sounds/LowMana.mp3 b/MikScrollingBattleText/sounds/LowMana.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..93bfd890f4ac05db9f8b551a9351fcdbdfe4fbc7 GIT binary patch literal 9956 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 + + + + + + + + + + + + + + @@ -2226,7 +2240,7 @@ - + diff --git a/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc b/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc index 6621658..0cd1f75 100644 --- a/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc +++ b/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc @@ -1,5 +1,5 @@ ## Interface: 11200 -## Version: 3.0 +## Version: 3.9 ## Title: Mik's Scrolling Battle Text Options ## Notes: Load on demand options for Mik's Scrolling Battle Text ## Dependencies: MikScrollingBattleText diff --git a/MikScrollingBattleTextOptions/localization_options.lua b/MikScrollingBattleTextOptions/localization_options.lua index a3f4a29..6caf9d2 100644 --- a/MikScrollingBattleTextOptions/localization_options.lua +++ b/MikScrollingBattleTextOptions/localization_options.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text Options -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create Options "namespace." @@ -126,6 +127,7 @@ MikSBTOpt.EDITBOXES = { ["Tab1FrameNewProfileNameEditbox"] = { Label="New Profile Name", Tooltip="Allows you to enter the name of a new profile."}, ["XOffsetEditbox"] = { Label="X Offset", Tooltip="Allows you to enter the X offset of the selected scroll frame."}, ["YOffsetEditbox"] = { Label="Y Offset", Tooltip="Allows you to enter the Y offset of the selected scroll frame."}, + ["IconNameEditbox"] = { Label="Icon Path", Tooltip="Allows you to enter the path of the file to display as icon."}, ["SearchPattern1Editbox"] = { Label="Search Pattern 1", Tooltip="Allows you to enter a search pattern that will cause the trigger to fire."}, ["SearchPattern2Editbox"] = { Label="Search Pattern 2", Tooltip="Allows you to enter a search pattern that will cause the trigger to fire."}, };