From 609976f2ea7abf6c36d3d5ab5d020b17491bf263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Wed, 19 Jul 2017 19:46:04 +0200 Subject: [PATCH] battle: Add visual feedback for toggle actions --- TODO.md | 5 +- graphics/ui/battle.svg | 291 ++++++++++++++++++-- out/assets/images/battle/actionbar/icon.png | Bin 10856 -> 16827 bytes src/ui/battle/ActionIcon.ts | 11 +- src/ui/battle/ActionTooltip.ts | 2 + src/ui/battle/ArenaShip.ts | 34 ++- 6 files changed, 316 insertions(+), 27 deletions(-) diff --git a/TODO.md b/TODO.md index 70298d4..bf94230 100644 --- a/TODO.md +++ b/TODO.md @@ -26,16 +26,16 @@ Character sheet * Highlight allowed destinations during drag-and-drop, with text hints * When transferring to another ship, if the item can't be equipped (unmatched requirements), the transfer is cancelled instead of trying cargo * Effective skill is sometimes not updated when upgrading base skill -* Tooltip to show the sources of attributes [WIP] * Forbid to modify escorted ship * Add merged cargo display for the whole fleet +* Fix player's ship name not updating with level Battle ------ * Add a voluntary retreat option * Display effects description instead of attribute changes -* Display radius for area effects (both on action hover, and while action is active) +* Display radius and power usage hints for area effects on action icon hover + add confirmation ? * Any displayed info should be based on a ship copy stored in ArenaShip, and in sync with current log index (not the game state ship) * Add engine trail effect, and sound * Fix targetting not resetting on current cursor location when using keyboard shortcuts @@ -78,6 +78,7 @@ Technical Common UI --------- +* Add feedback sounds (clicks...) * Fix hover being stuck when the cursor exits the window, or the item moves or is hidden * Add a standard confirm dialog * Mobile: think UI layout so that fingers do not block the view (right and left handed) diff --git a/graphics/ui/battle.svg b/graphics/ui/battle.svg index a488839..07875fd 100644 --- a/graphics/ui/battle.svg +++ b/graphics/ui/battle.svg @@ -1161,6 +1161,81 @@ style="color-interpolation-filters:sRGB" id="filter5016" inkscape:label="filtre19" /> + + + + + + + + + + + + + + + + + + + inkscape:snap-bbox-midpoints="true" + inkscape:lockguides="true" /> @@ -2533,10 +2609,10 @@ + style="display:none"> - - + inkscape:export-ydpi="90" + style="display:inline"> + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + qwCNC%T<-M!{0DvG6!u#Euj{o(0fnfSsRtoU; z-1d&o-1b^ zdhrH}UWd@P0Ne9b{u0(BlqrBXO#29ob~Er}y=jY;8BDlg=Y0e$@A_Tv4VZx4d9`IR)^}fsb}+R4@jcCVmeF#}G4hL}Bbz;jL^qUewWVw~lj|0bE#~*oIw$ed~xj!8Vk3 zsS$eTo@Y#mRogF4)R#2v)0bE(LMjqxcUF6(dkC3IQp;HN@Zj(FV+Q`Y+@|ED-NUhi zpo3vK->HJji6g-v54bACcopBb?A!pAeTkqXrLLR9NgO`Jtku_+MOOVSovih{jlX|; zHibmEJv;9Xq;tGpQGXk4?Ca;i7e9AQUR@V`PCL!s*jK(bSmXZ}O$tF{xjhs?ds?aJ zPS;z72;e&bCv%0{UZ9g0ITP8dk4%W6cfTRpBoh2c4yY9H@gmSQ7o+I>BXvOkSXR0c z&%uD&;@F0y^zczvTVd<0jK35;(Tuy48N4w~@;5-9xz6ifV#oHY4}h0#Gu&iGK+o6+ zVyL?pp^yu@z8_lRq*ysF_JtS`8ER(yH!M_Axif_Q4Sco}a7#TQ{}f6YzqGJ4X+O#_ z=uRPGRUsJ$z!0P?CR@Yc9=o)$A zaKCue68oJ$GS*{+VtMHoPwM_u*9@`tZ!n>p5?q1Q+gUy7;tFEzVn<^0RW4Bo0a{FA z&tz&#Fwr19RAj8|dT3655qy#K30yh$9E`*iCWTG}Qq^ON_am5VR-r;nQf@~p(m^MP z&LvVoJ~maF_;1$Tb>`-X_n>Ip2EM2$I^d21usJGmhDWhIgV!&c#|MTPS!Xd7bR~I# zvYcNpJYXy}U|?AUmjR2}(5A|zj+&s&$rOZm&Ez7ZZ8ci@ou2FhIb@R~KkFhLSv0i9 z1qTV?Grs&W(JCq|w8%)1LyH(^f*H%~k^I{;hZu}_tkJ|oh87}T2}8fCkixY)_1h_~ z*$fa9Lihkdpun@I!n3=3YC0 z{z=v}gc|sL4)?RFAXR({Ql^ZB#V?>7f;NJr1V>Q!EGFSNED3Mz@cB6ovXw=aYgPyr zz#dA#jm3qF@TaHZ+}zPdrn|cbLrF;f)$&NS1_F3E2stL- zi82>BX?>rK&J;;{>IyAOsR4vh~C^*X}OoSANujxh{+V#bAGZhr;#Eynl84dbj9L+$H->o)I zPY0KcMHN!oi)4O}suq|;*}vP0Lh(GMB?h&UfmC8}qx;n;_R>uKN>`-}(khq1&r`*L z!yFmG4FVJ(tHDd|Z;#HT7Nuwn=qC3h=7apIgl4VllJdq5C#=t$5v%j#@SzUVPX=4b zq%DT`16(tqgHs)M!d5zVH!T(jyL8wX4$6A*&RtxwN(0Yt6FWm2+4HyQfKk3sX{K)e*#q!t?h>h2W z`SC#xPnwC>@$=yljHHhecD$dgvKf&d@F`nKSxM>FNj+f;9y0`_r&J4uTf|}2>zsJN zjWt$z>Kp5SsS~#08IscI(XZ7!O3skavYro=hxx!)#h^VCV&Z~h?lLk1La@sNS-co8 zfGmEyNzDq)7{dQJ`1KVi)R52`Yx?I~)5ilmozNT_5n&hHUh$(QA03b}Bv1&GypP)g z9I4d}_^D%oYnbHH3%reOdfv-IBF23lp+L zBg|zjyf%YNj0_ukEed4<#94%%;&dJoLVU(}my#y5$u+HQkK?oDwoM=B``crmtnT!1 zHLBc=S43JB6ibh{WEYRF=Mm(7b7|C8MNK`bF$UbL1WVJ665eeV3||lU2(f%z65UYt z_BApuSyA#1+CE%j*%%?ao*2p_4u4R{DmC=TMS_sb}exbgdQ|t`96{Bw86N<5}p+7b526-58rGY(1cZB9P z_#>bMMatpkx4+xwCUX%-;b0`CT5;CPqHt)lU;1Ded(%@8@fo#;xK}WuJ~-E9#y?t&WFwN^;nYRavq^;3EKSxjm=x1& zbY4h5V%Xk35L)RXHi%XbYi;p!tduZXZ7@*Ku?|u95ZoVFLl;B|JLU8fS0t*|3kT%96NHin zVIyYr1j_*mRcS0PBL#iQnh(VUJeTsAG$c>ta+{ZZQbGe#xtqoX6obYMwv!{Fdl!?@ z)a;Op33v*eq1d)Hew#~1*U?!!H>>Db8$Gque#y9A49P#RjQ^C!P2>Lr{)uRjLnrTk zC-kOsa8Mx-sBM|<1lD0f<9ODJ%Iv$PCX8kG)<|Q zSQ0%d9(?F&6YnN@_Zp!eEfwTmM7SQK5w_TQFPRx46y~9KXEJrU>TT30{3(tTiItW( zUed@x(rn@nemdWzUm+)cH@#xdGzu!24HoJ~0*6~Q$q8^yCrf&6nZ#S^A6S~plNx?j zozG?a#e&j(ZG+Zf#Y1|Nxfv2WzyUnDvpS>b0}0g<6-2|o3w@OkYf~oS&TkaUxGSe8 z2O(!8G3t=4N-nuKOkI$o5+xl8lA{e4U99f_-(D+12IY9(%Q= z7V!}~V|p32)ZHPW*N$P0L$g_-7{p$PT!92z;@+@A%+2jC_kdV|JarIS zP9g1W z0$_m2=NA8?nkiy2njR6-Goy*dkUkK9Fmk6Bl{fd6F-<>M4G4icYmhwB=&9gsVcwt5oAI zJpmYMmZF2T(E2P%p}jHWeG^gB&P_cn_9H3hq_t3_9>;cs^3%wv;ROID&X?>~@s4;z z@||f9*F-E5l~5}2a`+Pdy_iKZ3nF`Lj9BjxcM0=dmK`-3QXM$bUL^GpOw6!^uiO+N z%ua~$j?%}>PbRx4=3Ev*&^i{$#^IM)91rF;Io9QcqmN($Qs>=pcu0?#p z*e9Z&p^CCnKj0X;3jx31mPH~ZP`3e$0fj`0O|nbpSe}dwaa-#T1V(fg zt1Nj}d1R}t-FJF>>obHu&t^5uzjNRrr3gvsfQX|jJopJ*ZDGo>G!RoBI#>^$Vndfw z5F35C=bEePx(AY&J_NS}3y|D%!i~F=BeE0PH@#NjRNL=Rr61)j@q}9W6b=wLUr_r7 zCX;X>_9B>7hr<>eU5iZiA8+dtu_^VG7Xth9m_YEK0~Y57JrFN{ADCES40Jf+TsjFo zd;t#O)!X#prpMg0>?$rbA}lWqv9E6D4nl$1U@s1iV7>I{D{+ym;T%ZAj1;U!3{~F; zJdjp+4ebQJAD)vdjM#w3bk&as6EEXTD{}kKe0H!%dj1}1_5_u#1!iqE<5Wj^&Lyi% z(gf{}0FAdC>C>nhVEP$Jc*wueO>_RG!yuk4B(9To zX>UkvyayUYnN{e@+h@Rd&~{yS(_{v!Y(Xg#)55-0z!Y|JZ#tEIiS8F-AMAeWz@C%v zXEGmBI-}@jyPaSH@f^-t+?B))&GkbN+@CR(r!w*eUkOU<#cHHeAD{eXB}YIcdb=yRXv*a>U@@re=tiyRN!ky!bD&VT(}BSmU>8Dur-(DXXmaT%U!FYW~(Va zL|h|bCQf|e_D{%(JYgw%2`gcKz6IQ*?(*L;S5w)REyTkfLhQ4NmZI9JfBa!3b`WGx zDn;$#BS18r1C)>QYhPYpmSUqGRO7(G72k>B-}oF2)!5T>t}Z11u+PC?b$HN295R6ZdkD{{X z#HrC$6Y~&i60anZ}Px*M8xNA57)r(5POo6h4Jv5H6Zt~6BfE07DRwO zKRRAL@$(Pq8F#^)_{5{j!$yfs z``AT);=6!MTz`;FlA%Be<+Nd+)s6)>;p2mY{hc!jggiDC1WWPjVpafp1*Xik{VB-W zXqO_hGi8=c9Gp>fgGkqi74@(I>=-hF833)nZg3k-Rsyohk2&RCW=CL=ENSyGnsaT6MjmG5@Kp~&0d+k&CFEHI#9x*gQ~ z34`Q;J~#F_0S-BIZzMRp`IzRHA5P!O)TC$+GMBnx$@4*DRX>)|8hQdkj<%Ed5b95#h9Ro$Wc-g5~jYcGv8T?E@v8yE&Ji%Jeg_-1Dt zct7@|rhJ{94hAu4`ezt`>gUQIpJZvYOW7h6u_F7vZV5PSV3_faL=l@lpT0Szyt)!5 zKuZRWI*6{--*p-RobS%F$gm;7m5D?4GAH|S;OUU(6RuuVCa<8_{HTu+&wSXg?~a84Y;c;3bykEu+gE^aEZ(5 zslPKxH3Lkv6nq|6T~JLg?k~QOm}b)&ZUsOUR~<~vwfIOr!acPHnK1`|55E?Jf>v!m z9CORplRaq$zn0ZF7pO_LKnBx|lUXs>E6Iqm7!(FZ4(lZHX1fLc{LS6cwY)vGvn7~X zP|KE&p?$1d7j=U{2@{ucUme=EVBw=8fWg&g4_ieujg$8|A5nK1wdve2*?r5^A2U## zk=e=!%%bE?F|rY}iopmIhoCe+jgPTyD&m2Tw~vCHPg8`bn_8bEsUh_clq2ZjiR`0_ zN01WwPwX@!RK%)CalMVn9oDm5YQieMAzh;4Bm(uk6@=dwMA)o-R87LjEaxpfh1e)BR4 zY=&;{y#P0KfC4&L#Xw5Pya)lf?1BkpRn4MJ+%FZh#oIQ;;vFj2UN(YuD4{p%uWeOa z>x^`jT5Vv$DKgB^_A&15nyO+^>!Z8ul8f;f0)XXtOXs&cPddtfQCu&fl6$S-3`t~Q z$L(NE3fxzag-W1#4`L7>N1Yjb<k~?sEi)~d zJ3z2Js&I8eY0Qll+;8SfZx3iz)ggaxfG+7GK2z?$=V zbU{X`3YcGQud3~v)T~vQt*14r=Wac#u^j8vv3(PpArs>vo&AjpRCQYdfs}^K>;aV+ z&a%n_s#0Gj2H;0P#~O39BeOl4$d)1ZiONY~o`GV)6-RJL`a1B4NGw4Gy8X-q;?y*B za2U9>1AZrMxbGD1Mz1gM;RdR!4ro)u*|MGlN+FRJwdX@1+Sq)s1(`-=`o9Uu?+7 zs_SJu`_4qeu=VD`O{D|mhOa05bw}&3LOayBJ8`lc;U_aUSM=BzHI6v~RS^Zdq}{h~ z2pHwzJwJMhkCes}Fg5waq^#Hej4@m9?jMqYjL{nn2+!F0uR5&Q;L;*dJDargtigF4 za?+Ba5g%|r{8fNOW*cAT)J7@?$Ce-FvO4nS6V-(+2IP23K@2 znB19(23c8PvDk|zqOwE*oeAtTdS!Xc6_w9AegS_m<#}QJ+LUSWN3q>}ofQtEFGm8C zFTt|HHa-hPg{o&V`rC{s{Ja4(0lnwS#^7vFY|tc#036)*@ruBH@LxEgZcqsMLJ{H^ zAq9zjc+~VKH9cE+B3YMT$r$kwL=L_-t9T7{J%+sn%!OfVs`SCmN zJsKa21y1d+Lu4kT@GIb|jA6I0DZC?Gx-p{{L_YGJs7ozR0K2wsV!%%l#hNxjH!RCb zYm`oY*jyfQ^5BW!otl8V-~bFj9I^x~lg6cH;0T6032Mh3*_2B>c#|xYoQ}~1yv;Q7 z)&EdNFSWS7b$*`4MjMn!Y;Q1x&^@Ne8C(d*$w|ZZSmd5PHlxj}K7~^T$6`MPn?aXgQ^d^mu)= zZAe{$;RDcxnQNV!e!L*wHhf*<{F`bR>`%n$MdD6ByhRh>3oegd6Pa9}zy&EL1fjS}mZBmity~!GQhtIZIPgu_m%IM_3KJ56YzFZU`^0N#**2O>h#K zf_}kX^`T0M!W2ZJ!iE0K%FoG1-;qz@KLU9Jlh;yWoE$FeY~s%KUz~c?*|5FY%nxeQ0eS zJpIkG)G^_3D~R?>Kqx`K*}wZ)48$$n1~Se0x}GYJclo-EjfzzT8(=zlWgf_UPN}3IzuEc1>p6%#WH2wPM|adr<%-dVH4MqGee8 zr2ukcPumC#f$ng?2GLG1@+DmTLrfBM`R23?o* zEkncPgO+9s%I66CXr-j2w7ak{Mp1oCPt*Bk@tf&05KI^K^BaXuh7Q@FvuMavoBxZq z+jcMfx=NoEgg@*0JFy?Zs}34uy>)JYBhckZ7(+2}bad3g+`I^A+`0*w?00U*mGF$+ zD~mrQ=bZfr`z81zK#Yxc3UR+xCDAc++5B*gSX0vgh0?C{kSbN#q?i@d_K~s;8&^JJ0DF= zY+r;`L=)gA%O$8hrjDM)Rml>_mZaG{t9MN8d6mj~^3!~&C@*&~*JE3YwcI&?m;OE8?z%fF-OJgnIze zeBRIhvlk$+t-bw>#i-M_aN0@;r~D)pb0oLvZXo}6wbwxhG9_L1)Fg9p)iSkRgYMCx zU;DoUz0&gY(`vrM%eh$&8>k*N))sxh~A zrhn)y_1oVZ*oAAGySe12k6oRPXFjG8D(8yCsJV8!+@vf&X8RvCdKi@9Qc3-c;3_dC z(K%vM>QW}}g4uF(*zD}M%Itc`{DsiGkaIaPHpb)$2|zc$+RX2`s^4g_9(qdF-1lQ# z;4T&_u}lix{Ty9DkeQhY0GE}~0^6a(s_4T>x-ufRq0`hpP zC-i)(#B@5Vg(`FTv29%#5CF&SQ8xBPo<_7M)F!r{QVM9b5-i@#G&SF@_lA?2$lN=Z z7UhI=m%~CsLys|gCn+Isn~$<=+e z#M(d%F|U8>-b&w?@*F@^;&CRm^Jl`dxW;~fSw&Nvo=-}7la1~}jXcrBn(n&8Yo^~BRi6FnLp^U!W6V5>c_#$Q_NP|E?)QFc%WGxm z$$n8$QPSaLE|j}Fe3&=Bwzl?rVR`u^^*fKPw^+x)wD*OPGC?Y;HZ)E>0=`Izc>Ft= zUyg+TXbZ+@eV1|8e##I_o#eOVjh6Wue^#-7)7E~OMA!aXCki;ySD|!KIsOm(sk=m5 zlGuK;T-l45{?h`Pv<)3<6dG|Gcb31toZI0o*otCB?WB&`iB& zkTy=tui{l5{Pw?m%a}%wp=Q)JU})JyjxeLNnxZWzcg8_bwXcV;9$TT#P|)gwf9dM^ zMAo}uc<(6fKjQ#><>MZ!qa&+ohrC>{AV}sQma|By)xRHm@2i`ZmidE zam{Tw4En>ASY9r|^Zc8;8&O_btx!`_I5t1EcW&%*FOqytn<|oEJbol$C5|$nh%raqP~MNJFV={TtGYy}n${rixv>qGIDKI<&o`K} z874uFr?Ww`(I<2$A#A7jaofwq%1I|^zK%9GA`@jW|7p#%o5roeoGJ*u}diQD1E4aXp+v18G6~3fmsX9AXg@Hs-&hP9G(-GAeP)yI7&O*}1eCx4FHC z@nV%kwKgh2p}c0JrrYHS>63ha!PTK4iv?}~D5`_1Cd_8jKU`JQX<|7COFIUyUY6sX zqlCbthN1x_KKs`w-iKPbZD^*vef|>|Mo$B_q^dQis)*$8nnit#)NhqmUI*6ql1Yk1 z?e^d*PL#avh(Dx_`f|SOu}*mz0m%QCt|Q4#fM8g`TDPk(wndHl#Z`rpgi;k$r( zcX&KXFQ*z#)*-iYV*N6CgHD9jN==`i@u~H;Abv?BAz<(4C0NT6z{6vr__&XYU_T=#nCHYCC?$4fn=d~Z+B6_| z=AI^hHKgC=^H=x173AQoj@XfHn#k9-vr!(GHTsb7xw`#Y;lUq62e$pKpe9j2f$p(u zIjePS!4(w>;yKE~=P5C@RyK&uKY|%f4rf;>N4TGk=#|z<*;GG#!x)=zOS3@t4XK0+ zmHRT-63VlC9{_u~{?*WH{})rS0qk>x=Qa+la%I^GL~iAo=rA@>{?Ur-h|V}MYK-(l zOk#keMHlq(w7Ocf(jLJEOpcW;=<&PN|K;%mA9Qjl;}yNw0!L>0wOW)M$ugEEE60yo zx$f)5T8qm*#@i(Z`3k}N!pq8a{nP83hrQ%IC*?n1 z?!IdR$<>G8K>ybWvbJCLPOGMLF%iAmF6(C>I_=-ZwTj61_M;RRn`P&;8K}Kl>!jds z_}+|XV$2G>o0c6Sdv27io5)>Jx$D=fsSP^9@;C=H6XY%GgawVCvd8nim$qIxZxtBG z8}ARHUohS&-??Yf#n3TPr>z&b@AonVopv(BETM8isjqyM=6Ap{lrDLHW>GZ3Al?p8~P;Q^bz)kJ+^O+DjR+{DPY@i7$e=G;g2V*8N{@ zk7tQ7d~BEBd513Xc?Z8MEx{MHdsAA?x5xXO*40nCaI?CS>EEyF3znQ{D)B_=v}_E! zMwZW6&ye!Rw)e3{QoEk_JN-aT?+S_{A~iL2eZJzWWdWV{iUePU`4#_peQI;dfkd?d zdnwgV1WoGwKufMTQAUa8h}(DY*D*GxmBQng9@j}EJq-`oG%C(*p+BtJ|RFvT4o3~+gqN+*1sGG^me zhexx(V>1*Ag*!HeqlYO_%_@=pV_EmnPT5`?cO8@bjYYb11p;N|&K!Ri1FxbQ41TH& zoUKv&G^{suw5y9t?EAqI-6xmdEAJrceQiIU{PV8cc#;ML{OJCn`$04W6EESAeMG3P zmZm|YDrh(!o*L*3L$0>d&lKeooz$DP7UWVLdH;3%?A*)G@~2h%NRBI0vb$;8b3AT+5C z@k=@MN~DqhX2B9728hU)8&|9-XK05?Yif4T$UolP-0WXp*Dj0L@CmbZbN74nJ(U7| zF+W0L-JknDlRoRBIabMHZ}lNNqd|Z$_ch}BeLeu72ovVwC7Cf8L!h6#Jud9z_nvMz zFUOPN?Yh%_o4z4qU!J ztjMX7w5E-+dQzbV@1t?iZzo|JwZfJm<~CVaMJ=~x=CKS$U&{#;pcm<+@1 zgV?!!aK~)*o;QnaMTO&gG`f=VH_$&V(K1JT?p#^vW27k1vII%UTsfz3yKwrz$_|_Y zaAotvjLsU09K_0fnZ!TbiMS7V+s{sRG-O(kj3kjF?k44IE8hC3_7pq4ajf^xZ_}}< zT3@^?>>len>FHrdzzbWxnwOWH`?5Jwgm!BX%~!$rhm7)cTA))QAAyx>1So^KmHch^ z;8x}J)~t%@rro;(wCQ7}8ywG}MmWJZ)~4cD{Ji zVieOHDa{AovVEiZLTw4KO|+7sj8qZIj@8M|(z-%&(upb`4WdC{;M?NXH!}_*k@j7S(sbAzRExfu{ z7x8~a+$lUN>$s6wcC3!PT~Sc~5gnGdLtl(n^!HE6z7KEb;_ooDHr*#a?uP1#!?Kbo zre&dRl3c`lLM#zjQ*`4MD@yN^P(GjSL87Wj|BJaZ6j9&$KdrTf20j%GblrowakX!^ zXT#}5yUYPM7PQZz_`iR5z4A(TF^yRq{0%r$m*2g4`|EO};%E0szQhH;d}KjuPJ@zd zpir8ozvp|JUTV63S65hmY_A)f|5S7^M3*NUQw95Cw@?_^2NSB}B9lLu<35bh!6o=I ztdeUdAe?h#-@~8~9n3bP0mQ~^MBau~{ z?SDH`5#~rd|*}pQtZhZ#f22fCNZv_Cr~pUh@pcTua-96( zm{w2Z+ODbXvBaot?zKYnq~5X9AURI-;CWNDjqB+ir%nwNRnFz}ii0v7_jX=1a3k6r zpTjpDp#`b`H`%!X*=RA)T7Uh7ms*_9^~3!5&+*dprv(Si{eyBsK%ltTt+lp#Zl(R$ zo_!_dT=N{BsR~$-v|l#%h^jq{qt7|9j%H_>UnWkJ_@n4^60M#Z?w`fUe{rwl`!SAP z3+MiC;|y_fA}@AXBJSTAU;u}3aoJfLcO69IX`0)Wi{{!-7FZYh6%0pucQ~TZTaAo? z>nnWaZ(loav^w4O`UaxlF=ydoGcO}S?hmeM9ezl*A5|swWw+KpFbgG+1~${mKfpy= znxqA?=?ZP{kUzAv9Mk3qWRwyazWr!w3;6fX{qP)OW%$8j0!XWTFISkz_r3kQc|ohM zSC#M6j7>|;()9+)+w)u7^xOGnXPy6UYnW;pJa=hEOLP1#t>vx^=ZD9jrs~7LCrT*g z6vF^hbtMP*+)b}L*ZB_jsz$8$T;;k*b8{5Y$sWNlJg04ZM6t!TiU|J4l3W8tz}CX} z{B`wPpUmOHd^xCv5U|I8rt(Gu*=TPt+^(pgd$dpy#s3)ac80@gee&?aNIc*5+M$>E zb)#INYD_HeOuXyqt8^E8!?v<;M+S*O#t$;l4$Mh%qaUn(bwk`@##UJRm?!N&JKc5> zE&!z`18c8|XDCmY)M0~_m@aIB68V&-J0YIeiqx4IHhh|WO>d7{kcoL!hu_*xu?{Bm zg4;N$4wbf^FV#O@n^;o3*tTT-_vCi(Bdv1}i(a<7S{7ahjPN=PH@WPk$Nv@$>|#3O zfmgpuJRCG>Jz9j79f$cmr!(mYZBr+rOCcL)bW6w;&O2V5IzZp^_}3&E%k{8K?0uD3 zXau3SWWxKq4}a+q0q5fm+AS%mjJ)+6u)1|uSmd8G%zs-WgnX%*&woD8wP_IfmtHhC zc1iwvuM0VS*Ic{{c@|~2^E$IC|%3}+KDs)n!1td5SZuz)Pj_75d!=yu6HfmZ1z z3uRn06R!0tBNYoGuuD-65kKw3)28DCFRg=TvWhc>XCeT`=gMuZe#}3me}9TikU)$>b0N2}M%lWuuAP|T-8Uz2;B$U!0G%brDM z#jh1@2m?TIl571ezj=VG9f)p0-#zv-hC|J0_1!Bnn4~Nli|p-*59|ZciJ2+rXGy_< z9ZKfL1&PXGGKzl#<2#g(#FVn}MIKy#K4(udE0YVaxMsWmdb@*GH+B8Lzl`OHz zfR^*feM)!K_+aOv*>|982o(D%rI@*+IR3t)6fq$xZ8Qi8prc*-s|>h-70Aqqpr9C> zCJtbWqS%R~`wj=DVr9~>Q0@N90t2oE`C$)X52?J3X`Jp(vVO7&tA2Z`SQmZp?pk-S zts!Nv8)HTUkbj1QzwXq@!AAf%@6jlSI5WXa#Y{+>I1>P(nKFAKak%-oyKxSUkvY04 z;-`@s7P-a5iLnV_)NaSe09Ydw`RFscEIdLld#-0$TYC78hXMDFygZH@bd2jCZ7X;P z+GNndOpnDRBZ2XH5*9wZo>V23vHN76dOL6|@>?O(=N1dp1_%)q6{5^5nYW}wfkw%%$fQaLjm z7rjAbo*#^TqA+$K#mcFc{ck7(AT8Urxj;oqEd%N4Wr{O+Kxvaidb<|<&!^bDlec|h z`fr(Idivc>`C?WWiO#LRMdLPrg7tf4l@)))lqzQmoPa44m>y75GBLJ2SBF$wtgobk zcDdDf)=?^83)`x!J&CHBz^U(3$J7~M-4Q}qY(eC3<%uneB-LNJ$ifRBU-obxcmp%* zauozxvi+K=Y-~tTk~2EId^IK^flW-@;k27==zOS4r=es* zhq}OiWPjK|Djf{3TFdo!W*8yop$CD;FMPJdHUeF+yZt-7rrJ*fly>@&)x3YkT6coQ zj;~6~0XH#v`~VU`XPU<)+RT`i0v6M6joyM?#Ws|-kH?|A$7VX5Hb_mKNtlV;1q(Y@ zw|^>+OEj4)H_nXWIJWvZ)t=`DGmmFx5SVujydy7dblIDvQ<;PLicx zlfU)vE}vA@UaO_1c4^*0){guFyjgUjaZ<;}24&gF)5CgdWSyM=;a+=FtJ=ek@^;>5 z&g6avmKo}z_vwSg6g7>tYJR5;4IA^kqwPnZ;dSw&G!qwt!)!NbN%Jh%mGP}t#5hNt z_R_Y>EX{lmSyd&Uv1~T$r51Fz6cfGGt)q<5x3JQRDAPuL*yPA*RVHcViAHxKnJ)H7 zPdy|-z*hIRH9F+e;5-~>T<=8FsHyi)cMf!0X4dHzW)NCjR|YNpnQULC;<9ach{_nF zdONQU9igu$wjJZ++#0&eQ%@@%#*Z-oeQX1xm-IKgGT-NA)LBk-HqN!?KT#0BIw@$Z zv3*qz)awX1fKb_xHfxKE#18*GR;o`U(UAC);d0jS%kxgX%B&QbAU6(gF-i#$2<*j* zYi{Vq%RACA;oY)gpIWi5+>+oS$!jl;Ploe$Mw>K18}PmOA-&75b>6B_S+ZvF_5OUq z=vB?~W~Hc{?t2Qw3PL;DigfVHxJ<*<#J|r+xsUG%$6sXNEJ23=b+P*Q&RqjC<5%R$ z>O}y#1q!=z$)6Yptkkb&G>*vjNN)i?hmFL8&Tv!e!kle&ye!qVEi`mdUr6q;b;5A? zcue5}6H=cg{MpFk$uBd5>71#g7hr({x?h*HAKdn1fBJ=Kf)iOY21_O)$Migj zZ_-GaiQc%NjHDquCvkNCGxM(;r;#r zos(=ls_UhN-0$_+lwGJ!C&5H*JetjUgj4fHB3f{~eJ>GbhIi9ov5GV}Koink_GK@2 zq19yTv$Y!iW$IEvf%DpN{RGV9Ld+vts8~0mK}@l7tyK1rMA*yjP8D?V#0QahJ~_Fy zX~w~m@qB)&09gB^qIsz}3E7)u^A_C~9th}|#wU$z32D)tlm z3+5>2Eh6X$^9gGXnMj>AXeC`an6A|}@!~{PQWxDVlD*a2SEAUHqX^jJ2Tt(0B7+`qP>??>9a z()QgTrCxOvZ2TwoVE_KB;GadzN4crk$uI%I{fCD%O%BY=Lv^SJJ3(bcqK)tI}UKefIT~L;o@SD&loAZxMJC&TxQB zyNI={wT3WIS^fpF%6Xn>BrhUDK(jJRDj%CtQDgs$lVx{glpv0!p{M7rrR*-jP{3=2 zL3T7Y!>{j7f?E@;Cu@95z!179KH;p(y*NVrN#tfGcn0`aUK)h@Rr5bxwZF_R z{`*cay@8AFufIKxae8(R!G!y8oxgQkKe^jwp*mCn<2H;j{w{}X;N|s?+FGS^v$_?! zZrq^N(6n+SyIE~t#$qaTODQH(?7u||twT5KREws6n0Ef&M}$AcqupO6;CPzzSa4meC6D2r=uyQW%M_6 z^B*t&qZLyg1tBK(*(q;HWo1xr`*LQv?y%@QzdQDF(6p-i4ZcbeQ4qz z+Dg?2v6{v_AK!u5Cr**4m!JpL$b9<4{rxK3d%={43Tn%L^L0-OHt1pj9?;ZQ{r-M= zg@pYGI`JX}?W!rOc_bP)Cg%6w3$Xq7Ux2>L(V~=5c-leMW@tFSrOKBHa&r-Dc^O6+#HwB}_26 z7?I!(=zsR8bMgK2o@#yR{X$KLCa45g?G2g|^gzCAdt&}QH`C+!+`VZBPDMGGoW1#m zMP%cn)>9vrK9Wqmb=vcYl4nd;G}oW|Wh#f~F=j{q*r&R_sv_wmSM!M`o)zj-9!;Bq e0sh#3EdOc!Me@sxm!Lx#7(8A5T-G@yGywp7Wsrve literal 10856 zcmXw91yCGK(?0ZY4);TY1ef6M1a~KRa0%{*1cw9&E+K~n3lM_a;RJW*kRS=}1TMgT z?^pHL*6d8r)a-2ac0c{>Oeg4Qso>*K;{X5vd^J@?J!D<~U%|pe-s@U+t&kO_t-6XL z;Q7C+xT_)q*@Nw+YU+cWvGiX-k!Q~jM0Nsw)ijlW+n89`FVJ3)U{C`93;;DnIfKB} zlS0j8`z624=Vza@kh&_F{b(r#g26OLCjC#6mvK&*nD!XcUL-3Cg_aWXDp@wevI?8HpsqU2>L*261v6l>1_7iNRY734ljkYst&w z5_>A_OHzt3u9)(9DCikyg&4!^X^wxAlK_Jmn^bhQb%7W1;!%aDJF%5|09l6L=)UL* z(p0ve`=Gs@SuHmQ(A=hsEaf9J9l-?mOwyM`)V^bhSY!JXH9C~1p3tUxr=Xad9ZMhF ziut|iLBJ6yy?Og}r`1}dReMaJ1AcQmj-UkP_%G^K!gn|f>gl@$MP?}Gk5s{5Z{_qp-C zf{~UJQR57pE`qa(?F}Olhelv|Gw++x%-#FNs}ty;e(q-(5-u*W;S8K{^{oO^r?gpt zIpKsXl*-%}kRZXpucA2*PUj4ThdMhmvXld;s#F}Nv&oqj+u-nF05!JYJZ=FbFVf(Z zAUj?RH5DUIR6HiS3VkvbIX5ah`#8}L;OjWWih8K}>o|fnt64;)Ewgq=OZPj0j;jay zXSai<&0zir&_MVHJjJN*AJ}cl9>`XIg=6ZHI}OXK9ryOIJ^EEn8D9Q@qE=_7(aAb3~Ul9FuY< zKV-=@L_O`-xF%6%F>CM@lm#MTa~~-u&}h+DcAY}yQ6`f82GuB0rdbhR^X7CY2S!6m z96Vi=VX#XzeSPAzA!}J3hH0ITc#iB0zvY(6ynq9#D0C$!CZD)71M6tg5)*zG7G;+m z2rn)+w6!PO%D78%5Ux)Nuw?FUI7o;{11#^2(#sS@&iukl@>Z@86FdVvz?w;d$-)?FR6=*cnE*65@^ zuoQ#@Kv)c@c)jtmbJnA@eMK|k?%gR!; z?&7){EKDT*InE2Wt*0ntGZQ`4ivu6KMioolS_Ac?&eqp`QqrhNEFyV>?HIicd4sLe zs6d?nqL?~+4BroY!JX3cCV#9e`&p)6YkURiMpw-!vCpFu#R%lcgKP{K<%Q4*-;j2* z|EOnL&`}(_l=OcU*sPUP2z01CC@2TFT(Gvcb_OV(vB5a)+N}PzkvJ6wp-9j_%Q&Td z_-!E=-EfvLmNW+v(27|dhlL&HgayBc5GmeMQO1-Tz0SH&&)aTLIQ}lYI%TPNa1fES zym1;~*`mTW)qS}QoRasba!t7SfjyP}JAonel*{9J;wpZ{kZ%+6BO_*TpL-?z6z|uf z71gt@MZ9n+g%x%IO|;}paK#`bNN*A@ADoNCcA*Hyq1?K5sXd2R3KRu5mSV%OVa zKM+BtHa*+i2UnsbaBWYy6pmH*&9jT%*ZV#;e~tm%f=AFUIM&zIipeoP6<GhyMz0T16SD(DH;QSSsDPwTXl!xkFiMI@f8LSopM5_z(eFs-TS?to~A2dcOf*O zrAhtiCPP2Dm=lPk)T8Yv@S62_7S_Qji=O@i_WC8>*522H6Pe8jjVe+agd8~5s|3{& zGfr0Yunkd1^4bp`US9GPq&GKTqcxW2CKmdWQ?2?zio`~$9@B%3L66nesh^K6R#=bq z#QwIucnurN&bCh&&qw(OHp|8uBFT3}Au5X_t12#qH2%)Pww{3Z5bVdBY4W z^uFp+6eEYg$m;5`tOYNwzI%pSegnSU<;8w&*qA(li7TX4cZHA0ir}(0?1Q?&mf?9; zQFCaK-~9}*p`BQN{oIeNvw!I)VE?J5mvVrzDzE>24s8O4bW<&0?c1ezxqHcvl+{@N z75}Zj4*pf{7$dY;>co_*fPLCBjL$452b0I<EbRSsG-JWDaWm2~8BeVscLMKWD62y2f zLc?Uo_$IBVe}b0cgl^VyyaTNy6nR6jvc#tGz>1i~7)p+qpW9aEV06IQ-u}_=Iw{;L z595WaEnNQ;7T4o_zeZ0aAlV`R%41$6+y3dP1wc>1e|m2+99B2|rJTy&32)X#p-z2g zy6fD=rqw`w!4Xi(zMLptsG2kIm3J&P>El=Dbl&598)cC#lTj`QZa6=f$5|&irI*Iu5V{ zVg3i4C9?Cvo15IozlAq`{_384I-2EtCd6dlI-2gC06y!8Mai=*am$}TnrP>(AcwDo z!1Gjl`catY-_~T>o2&V42PsI6Z<}FX0UEa+qDW;vwm6EXy2IV@zEt5lxJmloXGn(wA?BnphGG9OVe&t81=! z`>n+G*UPq3I`__uXlASBHUS5t*NNRrdoV#lxUqKT0@_&bquL|RuYeB(G+pk~=(Z5x zAN=zlzk}BrfnMM7#oteFsRg6L=hZz!j)-2J7u`%+iU)lxV^DdchZgWV*I|J9juDI= z(U&$)>(aJw`HSap)0uXsA@W*94anw^H2>TB99>eQYer2V+BCk1vrZW^P(e&`p6Gjh zD?|nGcdmjtVMBoxxY3E$m1qN0(Ukt!;Q-^y;PZFbk_Kn1i3S9fb(?pvprgw@~C{Ngt`74Ls9Y+=O{5nyJINZxTK0Rc4# zfIV~M#uia^q+JQu!tha^vmd1avyk%FA(Uyyn;AzVjO6|d0(-@U?S>;X{y&To0;XF? zyq=%J9-B|2)CAz*Yx$@~nEm5gzDlyL`z=~e3-J_+%w^s-Be=X7`;e~utGE2o3zD4@ zweUG>F3xBS!_@%4%B-&%XMxyh!DQpGn8L%$ppfkGDitOs;4pUUzoHVeb+?JS;HUW8 zUKB78V^Hy}hT`1=z)cX+LtuGM0ZloZ{$OY{LyRB1Q!;yepoa9T_#1_g+7gEi*tb* zzFtH}_|Kb0Xo;+HC@j;#hUvBUm1rp!y4yepwA=wm!hoo&(u_YI!vMVa=)y;LQ(poO z{GEw7Poq=t!CMeJH`Y$fb`Ne4#5 zTc{;zHM$J|0x?FluhUi-K1+KNbtjSj*42JIgTHKAU1xtLMyvq5LUyYa|$XE$!2iL{_h!!pAR z5NG1By>I;knN)MdH-IU)1Og`L#M_@(E!vU6m{Q zIBEXlmKQh3DR8*S>*UF4$ojaOU@7415j>b2N$?Atx-gpN3E}2dY0o%^Ir*4Ub^K zSOTWhI8rVJ|4Akh1ftzki92CM9}l&*(8pyzD(gvnpqqJp1Q>!^^k`rzX)sbcYRHS; zQffNcWh{*i62KZKF zM$;$JsfWjUK{o>y8wO`~KU+F0iv#-v#)}-hw1`Tw=A2%tT@();)8E>;*|${)uvf2J zzlwAB#ZaS>9s5$zT=k)@r@TLg1<2nX^D`d3@)Dc5keV_W-aR0i9=T>xhMmbzJ?71z zoKoBl9>d^$I~-M9(4z$c<*Y_hUse1bsZaZqo8r4?t9WI*n=XU5JYSQg4xT#8iX({X z*cMF)CR}6av6$-&EB*lNbSV2%JnPGcv#_^ya%3!qYbu0RA4umL^kH5g9_=mzQS4tRF54US26Bat)yqCtCe=>Mb(WZ=08^ zW~vJzc!}Qy{x(6}YmD-y*F43X_HREpIB@@;Qb->_`*zgtef=AcQfXda$vHm52Thw< z?Q8{1=hK|NBC&`W$1l9OBs7gVR2sD7uD3AD#G=6cy0mIEe3Vz7q?8&q%02|Fd8P$T z)*3b+-zg~R$$hEpMVC5Ws$|Aj)SiMmlvgd3{}6iJ)88PHks>y<+@nb7_+b!;$KnPE zH@jVuL7PS!3-_+ZFAA|P({#0K4#(r8C38)1@aKtp1)%4b2-sFqA5Uf)m5cgkohf{i z(nfpYgleKnLl|n$U0SOrT)b{lU|8liQ}}ae{SL;G^0?L95n(C>kkLHy|I(oGxpI|{ zu%?lXQGQjRlDhG*n77w<@jE9zOl9gDAl`KI*C(sD#%12k)IL4T(e^9q4E3ehJE=T< z2~EjNX8E4BWtc^bgyS}L{(Fl}MyG^W8CdGyU7`muw@MtQ0(eZPwIUvxzpRSpqvEfw zw9J;*aakvG8%9UXf9Lx8vfR7l0;V!+6^y~!Q0t-#1ko&vLkIjL`bOs!)}K>!C2qXY z9QjDv*{QC}jHwAjcaK#(QHlLO`JzB(zd|aBbWyK=O{`qN=so+sm(r*H_0kGVfpkag`xMn}b~i(AiHQ8x@9W4V=h1lcNGMP^0i@+v zS|D>A#O3AXc;GfKFRyv^c&rM*!4&cy+t$^l0jc+eODtw00I6dZNmf47z98km-rgcR z(T~3Icd*3hPfBR#`ai5<)Uds@M|dFMgz0=aNQj{wYZ<4#F^q>VbF{@ zK5UL@CI@AP5hM^e4Tg3)APiUMSIquI%5ieJ7(?jtd}T=swLR#vfTx6cE}gstU-;{4 zVCirw4Bd~jDDH7TQWetKx&+(53rM`T%)+SpUQgg8;n;v{#+Zc29%O+4)pxIfruiH~ zF)M39_DnrSnS<8)`4?sH3ET>I?0m9zkuhXh7m8N=o0NX4pyD?vrA3O4WeOfUk7Q#{ z!6gZ-c9U0=%*;3cX1L0B25NpHD*mMgjJoUlCupMOqia0f7q@Ct6^wiTr_Ndwi^?|+ zOR_b`(!&x*M;72Ue8lL=?9y?Q<;fr6z+bEV_a$o-w_p>i)PfL_Y!54NP&nODP7Z+u zXP3tb4=+H7krQxYl4_5Ar*t=faQ@SChSpjs8#YuuC^J71(z+i>=$&1olw z3HEf3ORVJ|W9N!aD&hY*SI&j*-Qu%=Aj$nR8&Z9^*Ph|vDqMkA1`rd&40YG9fLTF{+OARXSq#Bo7IJ@&FtzsipU=a|inD#2i{>Vu|RrgQX?CbG;bv1?5BK zDpm>tBV|i)eWUQcVa>=v)wjN8d0{a-#VEetf*@x0_P|mv^>_;2%zY-86#BF05|z`G z;gn3YxR}F`sLYL{pV6io-Avcl<$+a9W~pQYPuwXYW1G0_n8nfB9(2n{%$HlItNU$r zFE-C}VwoBqMWG955XS@bO@_HWo;+e&0UDNi7dN{lc<3MY%6=Kwg`Eh@TbllEMHNAd z4m|6P_vxnFFSgL>FGzF0a!UG+4^@(LjGZ4Dzyli~ck|whOy}n@Ggf&);%7yh$GM%O z_YMfq`NrIhN2OR@dy+5}VscgQI|i9FnbCV0B4Z&jD2cKSeGm(ckQm>b*K9+}FD!@A z)?}BHIhy~3X@jJrZaiW?`gz}Pzw)BrsyBX7@UTaK5woq6ZLJhOQd~YH3J#;T0@)hxyaD;9TD|^)U2zw_PjS3#Lv`Ab!DyPQvjHN$PIKMztfI$Ooy!{9&0iNhO^##@~5`JmT+vd3ES8UtnSH;?L2Xfw`;)vb|90&sA z3lTY5=m=40+b`>5w-XepG4y|5DWr9b`T+d`iA&FaGq|N%zHaZQI{qveWS1)0AbCe% zy{55-=}hF7&lqj0+}FRQ7Kj%5CuLhzTu>AZy{5C~%ld9hb3$N~h~Sv!6l=)NLuyaW zq+XbJwLi|Hi@rQYb@c~+%2%@>07qPWR3w*FedUepAK6-5vtc~CXg7(SqQC&x;Y4%p z7QeIL3-7mknd;kXgzO43a^f*n^6%0~DAYP1vt?X<41l(<80tp3G(Hj&UVGI&E+*Y0 z&rQ0cGP;;HI;-0}qtnG4UNc1UM-HM}+Y-Pd;aFd0s2Es5FAJDis0*-Y@d#q-*R}Qd zma)4Z;HdH(%2;Al)||%9bKCRJHvJ`Xj5?mvvN`NfY$yj*$5!YoiQ-G4s!EapRdjD+ z&}gsvqnrj2<5b47U)$M0tXadRwu7PDXjt>{R0^ilAheVMfWn{s1k466~mv zOHC79qrMbNPx1N|%5&UMSY5{|sic3^^lEf|yt8khX?|IW*z6^h0h5sRnuV)XNWQt( zdsFEilT@Mpuo$P`-Q!7fcr`2^O-ajUv`?24r*^kJU^bH z{5Ben7ZGmU(O1n)liFEadwj>Cg>O7->DD^}zv`|_9JpvxQM>Kxr-57}W>2=+U z;N;{KrjC&8e6Yv(h8GP%8CY3PGn%@``71phZEf>1g!{HzelPQ&mfkN=VXwx~eeD;U zO9qP~oocnASsi9wK7h9Z1ow`&tCf_;U;an*LeVY`{X7uEW#ZSo)EQUcW>;r@s+?pv zl9<^*E&vcj<_khdfSJ^}6=+F6l_*0(kUB&j+zQsUi)yI^dWHnSoiPK62Yxw}=B(GQ zFOyut{Nhck0jJ&?oUOo{fec79CY-H+qe}P~OgPZ0@^OeN^0qjVu6~LE>^k&WnhHYW zdfaLz$l2C_xiv)X3h=1;Ujx})gVNeCRFr)GSk&44p67P$2n@j6?5dBC5Oc@y@xygR z4?mNu>!_dR%JvSGI{(y%3!tE=w}qXF#A|TE^zl5=E`Fd%qMZwav^imd=>Lf*lF{d> za-E9|J{BlNHi537I$;n!_Z5C8A>qXWHv~57jW}g#>+Iw@m@K@SZ1XQV;7-rYec`yD z2n7LD(-qZ})8FUb%nF?hQA&t-tYaM=9R+`iO*oY(xLhS~=lh4igm3u!;Z~y?r3Qm@ zSd5L0H-?6WXdxsU9(VTXENq51R0r#SB&Vj(L|q--1=XwXc3C6<9_7x#QbU0%iXOw1 zXG4@{)rVbEVW&QY3kwT>f7pbBV9&RGs85>FM@4&A2nurW`pSino4dQFu&{8tR)x=N z#iAQ{4@mxR`rzL&-JAE6ztjv18!0D7oT^sYA_447LO#B!Oy7TX^>FU0fP&V2eKH;wJHn zG&(`5a-sGC_0*HrHnK!G99$H*z96+iALqRCmY9FAia(#l4&W*LR%iYlG@Hmn*%0kj zW)XlkQEPQ|_33JpYsK2ht&-tm)5n81XJmsEwz}~{%ZA1ElqFSF@w7Rw(sc|I<8=nG zb6Z)QgATURci%eaJypj4E1mme(dD(>SIEY}O%17t**pt9kT_vcn>+}5B1^iU-)9Vc zL5d-->#Om~*szv6^G4M%t>JAcGG*Y;f4KmTq(lb=>H`S>9jOd1gmXHJj7It{Z~Mk+ z+$I8kC$5dUgSlnr(SzvdIhrgG^N}~~DXq#*l6;@4iC z^Nniyu2s5&%r(3RWvk1)#be{SmoOYe1EEl3L@>rwv~hilzpLdMBcJ065z(BJ5o&z)IbCnlHZn2-k1@qfKyK}v>bf7Qdi;(S z8v)%}cfp&7{vEtzO5P$v%Y$>4bEe!wTJWQd6MykH$NnA9sIVoEjrN=4>bmYj`eC3j z_%G#XY~$OhBEyBc{f$$ZsgN$*Al>y3jHKGH1!xuZM9)Y*v#@>V>VUhnJlpA#%1B2% z{hR2Yq(ERM{K|9}_1Pa!p!`)w7W6b>RTt2}o)}UdY`=vu`o7l=3j=~+kx@^J$YW8v z%g~m-f5UPHcGOt`geD(LY~E|-?`9j^&>wWcvlAtIXzV2Q&QldME~O*YS)SGM$^#+} z0>Tg60TL;gMZLw`YUx)1o`8;xx>#r{z1{c+rcS^3S3{jxHjTe;x~mvFgON(PLZ&Ko zqXcI8qH)mB&{WtZzu^e(+QbVgiUS3!P{H%S%_gK9Q1;+1t1}v=OHTT*>zT^csC0bT zoX6(FV#_R){mDv~bo2M#eF8`xIP41Kz-RQ8$6`~!+GGg2Xj-yTr-8g3Ks1}xz5wtd z%`el0)SUWP!%@1a3R9B<1&zmVp&BkHoLW+qy-uj_|&c8VmZ z=mom~6ygDD4-Jo!Jg}<2~c^gM>v+(>ON(C$>oyW|=!orNPv9Vczq=S)Wm`s`D z=SUY1M{(|+lu{Qlk+V*p)A=@^gHW{dPq{wd@U1z90%yme@fvgWa?z%IjZfE4{>ULy zB(ef344d5dzTM3!)KS$K5MKebjC-0;0!O1-xnjKFwu%M|&WJEwL%U>0{_t4)#sAjh zzWY(?=uQ2W&cJ*?8DlcX6!{im013hTelPm{KZt~?swyAHeI!O`%f|yu+pH$9gRBJw zb8-Q-Dpd1xfc52uX5@ar(HDbAu*oW^l}-FRd%Zi|ck9SahL$MipLB^>e3|A!X-rH^ z5-fIT=hr9}@gv-MV)^ofctq*G0FN}T|2_K}5UP5x^_o}G@?ScWL&v|b54A`OvUkq& zM_DIID|88iJGZw(AfgBU1wH{)o2vjxO>(%Y|w~!#9(f5G~V3!Y0h1D2R=8)mm0zZ=}wIY z?uoZr4)*s?YwPMnoPTiO?cl+}0B0}Yo9`ye9EUjmTKY0oUOgG5vz)z9d-tpxOics% zP|wZHeUh^hH`zuw(59i7+C@Q5#0G!6vkt6!m|0)9I7pjZvVQ05?&tTa>ToJ7?(3hBk1dfHS#bALH>MS5l^EGhX9;3c zOMfn6`5A&_2^;Kl(dhvz@ueQSZpAow`ZUFgGGeJFG2*U_W98-&H^D>QUoDuVEbw=@cAe&<5) z7b56cBEB~?G|af&ZY+0$rlzKNC#R+&_@}PMlx{g{$2%=UPI z64x*#4&xohH=oHDI~Hpd9O*3gYRKR%)cBv>e~Y;5*gTQOmVyH$l|XghzO}oM^d>P~ zW=c-=Snb|t+a?nyK`R`C+Mq?1NN&N4m3aGcZB&tYV<9xE0RvWo0kngX&kS>%ikAp%)L@00pXPZQrBfSbqUvhK1@(=EB?(gqYs>Tor z!2@9^-OU(+JDaaS+OgTNGfNZEybSK8#YKBNJLW&W;uW2DZ&5mB8?zHBBNhzaU@;cV zgZ7(xUYAyVF;o1ABy)T|lVair&4XCm$HQi(3^uG`=?sQ#j^XSG5 zj_|Kr8vD+rK0ZE3i49Oo|C;NJ#drrlV2shqa@Z&H+*teXR2uS)@1!(3U`o!~J>Rc8467&_otZ v(7fzYUI9cF0qZ7q_^^~$|KFI1eT+z9U~GSd{;nOF6ADmM(o*~;Zyoi2E>Ga` diff --git a/src/ui/battle/ActionIcon.ts b/src/ui/battle/ActionIcon.ts index 362ce9c..9a4c823 100644 --- a/src/ui/battle/ActionIcon.ts +++ b/src/ui/battle/ActionIcon.ts @@ -73,8 +73,8 @@ module TS.SpaceTac.UI { // Cooldown layer this.cooldown = new Phaser.Image(this.game, this.width / 2, this.height / 2, "battle-actionbar-icon", 3); this.cooldown.anchor.set(0.5, 0.5); - this.cooldown_count = new Phaser.Text(this.game, 0, 0, "", { align: "center", font: "36pt Arial", fill: "#aaaaaa" }); - this.cooldown_count.anchor.set(0.5, 0.5); + this.cooldown_count = new Phaser.Text(this.game, 0, 0, "", { align: "center", font: "bold 34pt Arial", fill: "#aaaaaa" }); + this.cooldown_count.anchor.set(0.5, 0.45); this.cooldown.addChild(this.cooldown_count); this.addChild(this.cooldown); @@ -158,15 +158,22 @@ module TS.SpaceTac.UI { if (this.selected && remaining == 1) { // will overheat, hint at the cooldown time let cooldown = this.action.getCooldownDuration(true); + this.cooldown.frame = 3; this.cooldown.scale.set(0.7); this.cooldown_count.text = `${cooldown}`; this.battleview.animations.setVisible(this.cooldown, true, 300); } else if (remaining == 0) { // overheated, show cooldown time let cooldown = this.action.getCooldownDuration(false); + this.cooldown.frame = 3; this.cooldown.scale.set(1); this.cooldown_count.text = `${cooldown}`; this.battleview.animations.setVisible(this.cooldown, true, 300); + } else if (this.action instanceof ToggleAction && this.action.activated) { + this.cooldown.frame = 4; + this.cooldown.scale.set(1); + this.cooldown_count.text = ""; + this.battleview.animations.setVisible(this.cooldown, true, 300); } else { this.battleview.animations.setVisible(this.cooldown, false, 300); } diff --git a/src/ui/battle/ActionTooltip.ts b/src/ui/battle/ActionTooltip.ts index b0b3cd7..485fa45 100644 --- a/src/ui/battle/ActionTooltip.ts +++ b/src/ui/battle/ActionTooltip.ts @@ -45,6 +45,8 @@ module TS.SpaceTac.UI { filler.addText(150, 80, "Unavailable until next turn if used", "#c9604c", 20); } } + } else if (action instanceof ToggleAction && action.activated) { + filler.addText(150, 80, `Activated`, "#b1d549", 20); } let description = action.getEffectsDescription(); diff --git a/src/ui/battle/ArenaShip.ts b/src/ui/battle/ArenaShip.ts index 99dc119..af9655c 100644 --- a/src/ui/battle/ArenaShip.ts +++ b/src/ui/battle/ArenaShip.ts @@ -35,6 +35,7 @@ module TS.SpaceTac.UI { // Effects display active_effects: ActiveEffectsEvent active_effects_display: Phaser.Group + effects_radius: Phaser.Graphics effects_messages: Phaser.Group // Create a ship sprite usable in the Arena @@ -46,6 +47,10 @@ module TS.SpaceTac.UI { this.ship = ship; this.enemy = this.ship.getPlayer() != this.battleview.player; + // Add effects radius + this.effects_radius = new Phaser.Graphics(this.game); + this.add(this.effects_radius); + // Add ship sprite this.sprite = new Phaser.Button(this.game, 0, 0, "ship-" + ship.model.code + "-sprite"); this.sprite.rotation = ship.arena_angle; @@ -91,6 +96,7 @@ module TS.SpaceTac.UI { this.updateActiveEffects(); this.updatePowerIndicator(ship.getValue("power")); + this.updateEffectsRadius(); // Handle input on ship sprite UITools.setHoverClick(this.sprite, @@ -157,6 +163,17 @@ module TS.SpaceTac.UI { } else if (event instanceof DamageEvent) { this.displayEffect(`${event.hull + event.shield} damage`, false); return 0; + } else if (event instanceof ToggleEvent) { + if (event.action.equipment) { + let equname = event.action.equipment.name; + if (event.activated) { + this.displayEffect(`${equname} ON`, true); + } else { + this.displayEffect(`${equname} OFF`, false); + } + this.updateEffectsRadius(); + } + return 0; } else if (event instanceof MoveEvent && !event.initial) { this.moveTo(event.start.x, event.start.y, event.start.angle, false); let duration = this.moveTo(event.end.x, event.end.y, event.end.angle, true); @@ -252,7 +269,7 @@ module TS.SpaceTac.UI { let arena = this.battleview.arena.getBoundaries(); this.effects_messages.position.set( (this.ship.arena_x < 100) ? -35 : ((this.ship.arena_x > arena.width - 100) ? (35 - this.effects_messages.width) : (-this.effects_messages.width * 0.5)), - (this.ship.arena_y < arena.height * 0.9) ? 45 : (-45 - this.effects_messages.height) + (this.ship.arena_y < arena.height * 0.9) ? 50 : (-50 - this.effects_messages.height) ); this.game.tweens.removeFrom(this.effects_messages); @@ -303,5 +320,20 @@ module TS.SpaceTac.UI { }); } } + + /** + * Update the activated effects radius + */ + updateEffectsRadius(): void { + this.effects_radius.clear(); + this.ship.getAvailableActions().forEach(action => { + if (action instanceof ToggleAction && action.activated) { + this.effects_radius.lineStyle(2, 0xe9f2f9, 0.3); + this.effects_radius.beginFill(0xe9f2f9, 0.0); + this.effects_radius.drawCircle(0, 0, action.radius * 2); + this.effects_radius.endFill(); + } + }); + } } }