From ffd626fbc17955b83350eceda0dd60f464c9bdfe Mon Sep 17 00:00:00 2001 From: oz Date: Sat, 16 Jan 2021 17:45:29 +0300 Subject: [PATCH] TBlocker, TBumper, TFlagSpinner, TGate, THole, TKickback, TWall ready. --- Doc/FuncStats.xlsx | Bin 38552 -> 38666 bytes SpaceCadetPinball/TBlocker.cpp | 71 ++++++++++++++ SpaceCadetPinball/TBlocker.h | 13 ++- SpaceCadetPinball/TBumper.cpp | 150 +++++++++++++++++++++++++++++ SpaceCadetPinball/TBumper.h | 28 +++++- SpaceCadetPinball/TFlagSpinner.cpp | 146 ++++++++++++++++++++++++++++ SpaceCadetPinball/TFlagSpinner.h | 23 ++++- SpaceCadetPinball/TFlipperEdge.cpp | 2 +- SpaceCadetPinball/TGate.cpp | 40 ++++++++ SpaceCadetPinball/TGate.h | 8 +- SpaceCadetPinball/THole.cpp | 146 ++++++++++++++++++++++++++++ SpaceCadetPinball/THole.h | 24 ++++- SpaceCadetPinball/TKickback.cpp | 93 ++++++++++++++++++ SpaceCadetPinball/TKickback.h | 14 ++- SpaceCadetPinball/TWall.cpp | 57 +++++++++++ SpaceCadetPinball/TWall.h | 18 +++- SpaceCadetPinball/winmain.cpp | 2 +- 17 files changed, 812 insertions(+), 23 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 8a91eb6afe30a460023786e7acee0ed2bd972bae..92c39db9c6b06e5471eb49506b1d2a644f670ddd 100644 GIT binary patch delta 30225 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πdSW!d*H=4%Kk%Pu`HxFxmkw$CD%!LP{)O$fcGo(K_()k(AUeYo2;C= zqQ}in_Kh7t6ua$<736zC+zmTBSe9WNEeAE|Yn&Pf4OgS%rN!XR<#7^V_i`XGaprU8#PjK$vF#=y zpnyidv(aI2K3FFJtWUt2|B8keC4RBMJTHaeVQ@&L>YD=dVD0Ib{_4?UUkA~9Ceo3PqSlj(&0lOczdk{Qed(E;msmmV0JJW8^0kZ@mg zm&K>|8*Q&169(l85HggX<13Jy7l~aEXb_aiabKn}SjeXcfN&-5;ysyUJg;aWhor?W zy(?7t=p*@^e#W?I43R|p!B4MSI^n0Rgs>8vn?eccLL&u`jgbUILhIT z+d10r6;|sE)LTu9G86}`lz8%-IvrGH^^ebFA!0^?@iTW7@E2$)p0yJy89_3R9=~niREBO2NH^J{lLmoG9(!kEzeXGp3mO7U$ zcN1;>Ix|0cKVO(0R&{hvWzqU_dYQW;uQrzY++ubxJ5RxZ9oWh&6xOfH3r3F-w#`hu5pqk)9Fo7 z<-#+c&Gg*d^3Rn{As71C3D3d!_e~p~`k@6Ezf|=KoLbe(>7Ld!V)q!5=JhJg1Hn7i z_J2RJMTKnXt8Y=V*c>)Q`12Wzy{A?->T5bS$9_9F>)qalr#Ilaq+d$}QXPxryxtyb zKaVT3L_^7P!lW?UCTfrd<%SHn&7CCpmX#OmtR$FRE&RMlly~xxU68))t zF1ERezl>JqIXYvnbMM}Qcp62+Gf#7crtAtH+y`%+V@4ZaPKR`CW}Bf7VmDgaXxD>J zKk9QScSr6Rr)QfW-T zrs}@-IOc_vC|9jN+`|G~4f00XwY18xG}@J%{>eVK#zPQHG6ef0i)pwfmW?-itjO%{ zrq|Pw!C1&efUxee&iG>}Fp^4Rz@bkv{&-R_V8RrNGgII!=AjyYBDYkP$6%0!%mn&{ z0)7^QvJbO}`SV@`%dcuCiq4-6pZ$2-AjT5t``jDjs>xfpLv!dZO%D@eH`a?|7=-Z5ORw$1V`XHE=4FQNPWn!uq>p8#i9w5qu{JSpI*q=&USar2=+KL3wb3*4B7iAK?0Y*x7f7@_QS8vx@#K|Lu1Y ztC3Xecb?{>{q#W7K4T=mXm}rQ9I3JP6KNOFjvmPf>PA6oiXlJg=x&$4;Wh+a_I_{^ zHV}zsUh)z7=?)tW$s@or;?maoENKDQ=?VnKXz8o)@Pq`~Dy}`(pF}637{eI{s-KM; z=lyz;OF8j!e9Paon(VUzMLiLxq9riln4BS?up*Br)`)hA8&YLq?>A?Ud9)e3|Ay{` z^2AgVETh}J`D3E$8E72Y=di6cY<*bjfd!B-WG9C!ktPWdCZJj|IbAPQ)%467Pdkiy zY+cuj^oIy390R$n&R6Ddm_PM2P=N)Ff)~FFtipf2oqpJp;epGQLlGKYpeH*P8l4>c zpIE+N!3(Aw9#g&0X~{mkGrOCbVzlh3w*!+k4Y7(%7J=`N05#u`^Dqy@K;k(%O=~CO7t^gvG8??ka~4b3*;LbD^crToU=SAbxc^(UG4AO&Og-SPWf9I=*G+YpV5c zYgDV$YTiUu7pb&VzJE|60>szB*~@!vHHGozV4L$8^yKqu!u}I~zt-deW|z0oLn>B- ztL;{<7RUP!W3KZcwlAlR)GV`=dk~}h!iVcxFLWr{MWM$;CTQtO|L7;?f-*Z@_F!A-pfeXS7NH41@JKjFliy~%}nY67kiS(vOysq ze|uSP0Rn^*R`?;EWLZQIX6zZVk8ODhoUs2%cTq-dO&W$NNOq(^MpsC)!$j5FlAPBG z1M};fMj@->0|*gBrs%M9x2}7n)9Z63gee~nq3}vInktW*26p+mKhlc%i1E^5XhgD7 z%_$;`dCp~@G0h5aH_`0^k|j`;bHlArbqWC}ZBf)5o7;h$ z{C_G0G83>cQ@zBE8k}fPlW<=(x$LKS=(f8f*Y!~&pY;VI+F<4LT$9J1Md)FFHc zRbFNEE%apuDH@RoEkfCnraS|$tQ6kr=nEKEuA*Rwgi%9hX-xuc+Sn zT{PeQizM3DIZ$*snX3c=(CQ>^J@iA8%+5cfk63o+drGWos(9^Dh%jHU8_?f=$ z#f@(*WI=u6-*cf1F4_9QCUOolcZ2$-{OI?lesa40Q!eBWXPR;VJ{j^T2CB8TmXGU9 z72__N{#N)ee~UYx%%>=Zj8#RfxTt8p`$ap@za7Iu5zC6hl?rm+j3&>mj?&|wX31KF zr?xCJ!Hd^g5PyfQs{3ym0EGR#m;;k7TzK?4UqgKo~ZK) z5bt&R9-&^7HNP2^{qX}LVml2jsDugvs){v<%2AAf3p$dXN^KV{#gLSIXp6oAe?mZR zF~n|XiE}|CS;i%uIeX=|Qa(?2@C4OkGRhgm3|Q(Td0`c*AZe?naiz}@V=`WMFxjFJ zoHv#cl-bmABB*)RBno!a+q`Nk^d>+$fKN50Tt*7NrPrdWj*^%g1dh{Bc(YhgA*N?! zs~zt=Rm`-LqHJ&`mqN6)V#|_{7OglZiGG7w*I1d;iJR+bRLV5A3EBrzapx*TgP-`U zx)*R^->ePydDvnOMlUn7P9|q!d0qP5M=;Cwcv97sGJzl4#o}IIL8vOF>Mi_O;B)6 z@rE%XG6zX#2(I^TSbWUW^l{2#+Z6os6FH|lZdpLmK0L9H47^ZZl=CPxNB8-c5)8=g zZg#bnM$qh{i+4ATI_c-bQRA=L*IAD!FrS%_%9jp2QA>!~;C$ zf~e2MO8o?*dCqi7n%&Jn6~%iHeQrI+BKw*v_zYy1v6`IlvIckKNhr!mRtjV$~*f?26~Fx!gi^0rzmJJxfbqZ2zSzvO&$6xtP?A>IYtU6BBv!IM)@q zS>B?vH1!ufk<4OR%Jz@pK0T{Q-biZBN0y0^JZ^!T+AC)>O=NQp1ni zcttMM(!MwX1O&CI*zhwk1yfu>$q$p^^;`1mT7OtJ&(O}ICqjscc;OLWH+T_E#^17z z7A!)sjjC?lH1OqeoNT&#y-z0_7dzta==fwJrNWxJxF5IoKzfd{Slm8Hc8>JNTnLmk z{B0I^e6e3T|L!!fT#}ub*57@H9Y>_mKZo@aQ7a0Zni;E9jZx-|HmIF@XAA068eKIR zUbNee*k>%YcCVd{O*tUt8)M|2*FelBsO*@4WFa0a%>St zb1HlS!|N=?(`cLFcHkaea5-L$^$TQMfC{PQ0=04ko3PGx^GD$w!x==h;(5j2PwawE zXW0PoCe|U++hMu$!nn`pxDJ!q!Psr;3-AvUJ>c_M6!2!&A@bW{rSrnTm+yl^|GdI5 z=UXLVwu9>jvdbTx>kQI`Pk&d;5Fh^3`=ta8O2O5?a?2~4!cM!$zqE%ZzhEYabF6KE zWE}$OlF|t#mHUV3?oQL?;E8H+V?3SHL~J#1QcBqGbUH)`It0T^>e?3DgXikx`+0sBuyat5JhdJA&W}VYCA(JkYPomo z@7g%JbLWotH;9ysw*?w<+L}`ShN%Jcy!SzOo`=%U-zvd zj{5PH!3*}|0mia~OV-aoNvJY6KWz5isRkMJzM!$Lvr%x`esa~J39W`+zCFyH+W~K4WhhvJMdARdMTe{a|ebA!s zC_iL|hY!?hGp|awU9NNnWdu#28`5{xGs!38f4?Y<4e)mX#1^8la0kalCly!Mna}SI zvfsQ#FWMkxDN-vxZy!X1$8yiohtvj~@ZJ}CK~5wGchBYt^FBhGi%5!7gpLUhST+;Po>754BZMl8W zobD($BPjm>^d#dfUw2ZkZw55Ze`;+;*eDMwyKMZ>J;PCN3&Ekr5R13Cq;lBmN&<_n zClQ67zNyr3tk;?f;hB2qP3t0Bhj`204cnhOa^w(X>EbqbS6TAe!;tRHKkF-U@W}<2 z_Cb%9M1xlG?TG^ksf#~lywa1Ui@wuA`$^yk_7U7b{1^+X<;X(HL#MZ*R?Ds~?_C z4?g^xs0#Sg_gnh;i`X+@F8O-6^w9(5Hq!rkrSKEMTMM^M?>%=Jv@PKGkT_+2j<3+g z^GALqTxmLoEp=d=chbf3+*wQ8O4bi0Gw=KNS3Inv^u}om>27k!X}PVOs5d@`p0s`y zL8wkdsL04iW0;rC z=sn|U#^JwjaL)x$ga?5Yk%TM z`J${dcb2zKdhXt-A|;^R&f{`fq7KP4-Z4g9zbNU711#cz5>vQ$dCN7?8E}*Iq77*r8e|W;_BpEPZl34U08$k^}0cK<(IBj(v0_mPsM1%dMIl?jh)_2gI4s1M9g!?Hs`t z)JZn|%siLBl#|v<23QEl<+XDe2XYiT^)9Cc{QYF)bxapd!7>tL)H{*bC#nm~PQD}L zUtPdD7bZ+-a_q0{*}LjPmOQ^E4)Y2f_@8?}9c#RTKv!{qZB{Ku)|M~$fMIHz4Y1pt zDs+7u&XM~4R?z=@96Qz5LU^*LHJq6my+961vHxED@oZ0q*c2=DRferCzsgTaxVM409F_zVQ_kg*lho zm2lSa@PBaF*lpT<#F-%%QW*omuvPeNOE9S+3gBK@g?Vvor8B8(ILNzAb*zoobxCKlW@`)=2RAc;&0 z=l7SVfj9v6zvGIkL(vMEEX=4xKmuRcn|D-qkUolc@E0_7QZ5k+mroKCky>Ihaecup zk0+wd7E3|PP#Z{l5DCQ!%3-?V&eUa^fhYP9T}CBnbCX^;&2|-jq&=@#uSC1rT@`7) zL7Vu69p%5RT9L5*d%w(UP|Fg+yb>s_y;%?1FwP^<)w8Sj+p-(v!g`ubcc+M8Ov>Yd zI^9t#4KM9#C)tM9H!8Acg-N1SBh`baeRnIK^<0h3j7PFN*Ymt~5N#qmJ%;!w$<=d( zt}s}K{0=g51I~17sP2JvRj?CNGj&;TsH}0qO5}hvQLoJ?$hhvi;4d@8YPe%4kISw9 zMiPe;egWg(NIU=iBmBuW-fV5g%A|s2MV7rw*9YydGd}w1@dXPsIQ{YPYjphr4a$~7 z1F}!;Ezl+MO5(j)t|MaKi2tCa(k#Jrq=O=9n=muL@ZY@MG%_r+ey5k z@4xx!{jJ~*2l;=R$*(z+0_W9OOrYt(`mt0PcNXs?&6&5KPl+!6YYt|l#G-Jd58I0< zElqEd3E+v(+2#2h{Nz#;w@{-gf=eMH@Msg`H}668Kpps@16Me=C3k4j&G8b;-C10( zt@^RR0CW(-GDLf$41Tcmvma9n(XzDB!y5)_NbtvCrGHvc-{Auj3LnJaRn0)`jHgZc zcY3cI-_l^VtAuyjmpc1UxV*0mueQ=9Sa(Kp7eP# zd*<~+WG67jj*xf4%;{Ii!fBPx(HypSHq zX1stD{EXLGhuqi7cY7$TL%=Bb;GD?NWZ>`Fv~U||ESH+^D_Z?JRnl4`1IB=lnqAK7 zDm(+vLu|m!U-7ppx_DL$ugk7oH{_dOnEa=vSE+af-M@%3k@)+NDY!9L`&2ZR(Rnh^ z@Nct-3S2bgU+T-^rg9VKEjq2rqQ%E)(kT_!XOLt__oDV@qgMTAX_kRkLaeyC(_AiR zE#X+uN&U)b&=f(h zbM7YjGI(xKHAgsEE}R>=uev-XzC3r!)f`FLFk{*O_cgMw*9eDw_WFs%kkWr?1h)QB zMd@000H14SPHJJot^%LhGZG$2f;Z;BLqeZnoE%7E$j%33o`*@3%n$a3-mpfQ+9ed(37lnywgRAw{q3@Lx< z1IaxEOv_R*ld7$z1WuqeYew%Dqb-CZ@WWsK?cgrib$xb!8!TJCl_@Q7U z)j!>JBId%+!QY3@UNibe&=<0*yFAmCltF~zA89@X(Ye}+aDdE=W|aT(PAAt^s{!8a z$;$U31dMvbcxy5=8@;HSDC@>gUAA$tz?e-L2Kii-qa0omZcWQ@`zTA&j3r#`??=0W zMQ!`o)r^M39eDrVSYg0i^7OgypTh8jZxxAEc!SFgDOJ}!DHj0`GT2gZ4rW&hWxO}A zJ50s1TCCK|nia7WuQnukIyHX{hVKNyoMdrCMU>Hz*aQF6B#YuD^&U9trCcEBN68qs z*7t?R**bSEU%HkPp9{3ep_JQ(p&u*XIp(76e^{5;!n3ho?D!ukRIh%%suevT(Q`e6 zs!kfI@)7;gx(`3+W&NPyqSP?~!S#Z8_HDjYApv-yQR3N~-_=s1_^LTW`&N8>nd0X`j)f!rWC6`9;A5{Fk{H;d_{5 zCHZ^txC6*7V|e3nUSY&(^SHAsf!UdyiAq+NIMIsohKgTs?8_iXnWJXo&Cdu(KVpQV zaRomd`su&5eTkZ1OsFBjM_$*j7Eh$z$4rDs15BG#KkS6X`gLSNVCRWH@p$N&XT)872CgIVym}=-*|1PxaWM+5G{r#3Y`4^7w;w zn^b2UJm@HQQQ3fZvyv+Vk8{+*1biG5etgY~8>qO4_+Sq(V?Nk}#5lYZl5Y}TU}#>S z#k`JGP-6#oG}p@=4h=}*uZl~5$9_;ye+`X6+&g_yniZ&+TbwbRFD0ULJ+reA71=0e z&y1W_&jvNa1mE(L$$3m14x8UzH6M24wZzl!~d165Nb!E-3y zRYAyHIV;v-&^b11RwWu$@XH(VH2hEeoB6q*UxbPL4Kca9v*<=C0)qZQdHdUNL+=#s>WpAZ@0yj4TZn$ohz2dpDd_TDG40@999oA zj)3Qso(_GRo;JI{>LY@O36|=1^&8P`{Np>k$pWA*CrrpyL#Rb+5N`Z){dnn+ZmYrr z4V^aJN-;??<0m%@w7r_p3!h?y>gLbx3yaJ4l{qngcv1s67C>T)0{^pptRGT+tULnU zc5Y(U`LN|?Ybf$vxGHT6Bqw=cxiGibi zpe9kz0A8y`dmZ z`H}&$bqK;s%8L&cE@BRm>kbACD3`Ld@^&=PF^(Lb`FGn$t)b`KSSlNYPv!tau)FmN z(L2^nL|kK;v||RflTXY=)K+^FUpRULj~j57)16S3YT4`UQ60R&d9nbri2|Fk-kw!? zO~&}oBG`(4LO=^&ZldW?s1_xs^Rd*Zd~7qp_58ob%0GbsgMg*}9I{eNePzL9`EUVK zBC#d2mIDEMgzEq6>a4?}c)!07C`cozbT1)cES-|l(j_I~QcEb(j(~uGv~+iOcPxzv z(w!nDol^d0QNN$(dbs=poZWkN?)%*5ywB^LnZ1L@tjqprYyb_U{_aDHE4j=y-m(<4 zVil})rB6`6)Ovo4f;9`z=$Sw4VA5@P^??6ExAwT~&vlBMbaXu0*Y}pMd?arvNo=j| z96Du(`M%}g+Nvckc6LlpkHMqgj*T5g42%wSL58a%w?l_rX5|w!3L55B4=ifvJ@oay zTt6!52X&r7+DJ{2#2Wp(;4xk{E9WLs^QV*+3u}@@EKU!?YLVK9^(DJ@(`zz8E`gMLP*o{El{ark6-ML}M!Os45#@Av#J{4EaTd5KZ$x0U%xsFX z%hWH->e@!KyG`gDkX4%0FARgy$o3N`t~&0>eR>84V#w-xF?b)(Geo@cf8`ljv(F&a zm@f1=FXkKIc((FbA}cy<+J1QZ^@laJVMV#}7)0n`cqW5t4Rlrj4L>)L5pU-i3mC|k zd1L@&{icN39k07+g6X$_B}&0F>pfc#iu_?BOt#z&ADjHZs`_TQZq1~DU7M@BxLUWe zj&Pii8%P%{Z!r(|NDW8t9ouDYg*Lr-e{a@-#uip|c%Q^2UJ6y80@JQ#bv~T>hK#0Uw=&tt_dYvx{4d!HOEzLfoxGqNBtq4$BHf zk&sVGHwjH@JZzAhY9cdq)1P8iVC2BeBe&-t1>sR*X-_1JK+pnsNu}sJEig za0)4BJN^HV5pX-F%?XF<50{&8Zp_yoyd4I&DYw%@gSTyAd5bihQKxA!oU>x5q-;yaL+jNxoO7oi8H*>~E7aK&h@4kM7@LLtaYZ4I|M z>}%Zjh=-P#t{O&&(rGvU&Y7xUNXX!S$qBEM`BQj?gAS^$-tn9cOA&LcH}p#kCA=Yz z_B%ZFGgN-!(lW-z2J|8sw&Oi8ZEMT`dw`icq4EiTPHu-S5Sy-<0e?qdr!;))0YY2H zyh7egyJ38L&(_>U+QuV+)%5cLsCB2Fj!hKef&8-2IFIMUtkYRFui}#a^nEbS?Bo!9 z_}(lCl20%{C>=e2x|2(vK~Fu{gBw+gR{_>d^6x&U&=9ze^v$IIu9`OcbojCJ5?z~A zOBR?xOau3`X8j=8y+i46*(+8MFLtUF(SI*S)G!iRV^pC0;fprUrSdmpC5ceA5)w1N z+KQ(xS7Z2>;I|)yd?#YR!_P#lv@#mXq3{68ZO7$GW9(kw>dJWS3pns4jzf!g2JesDr>TH+nWGnlsP6kpLp0> zn#{vCe?0yXeLS`g@9$3gCRLbL7A01LX{ApG#h{e=W1VOx23b%LPQ^k=a{7a}2dSY6#EVT3}d|$U# z>6|`i%sFbClsy{5lI8!^hy`;e9+DxJ{WxTT+(Cnmuw7Xlkl%krZtWX>4>XSFhu*&l zRRvaVk|29bIWo>`!a`c93~`y3NJtzsM1R;Zd**CC=^D;5kaX+#yIfsFTZE&uv08B{ zUVqe{6wf8L=Yr0*PaxrSx90LduXSD#UFhSb=*HX8y*HAcb(aoKzozOe!J=ZUY}oIG z?)v#L*xy>JI1eDpy^OoPCVdC6Sr@w#*sq--NAsu2gVnDRpVA^?VD;qzZ%HmU!?@oI zhTH8N)pO?8CB2qchz1GZ+&=>Nt)mdJOZo)V6H&JQ(VU~p@NBt^03oQYv$O{9o_#d z5x4Na*-#x&2nG>UVRb>(<&0CUzLjEK#22rd6&yf1AkLZTPFaOm->9xjc3hJz(D=c6 zhs;PKatbRb@=og;lAu*xBbh!MXm~;f>qb*hfLV#V40Ovi4-Bm9YBJtA`$2!GJVHe- zK3Mco-@HEp1=r2$qaJM&wNsf73RS}8dP|W#8A*z3>aEuq%^5w^`+N5_Xmf_>CEKpG(0=BFe^YWjW{j=<# zl%ehLNDs3lAk7?Yx45;w?YLe-;~)Hd*_2!IW6w|u)VmKftf{Bpj;0M1 z@=$5YU?P1$Fyy7@C!~c`lE}QxbH7(H6B8ewY&qQaW(pmwhe=Tg68u6*o6s4r@U9qF zvXyQ6ifaw<+!&a8b_dRP=6Qd}d%&EtGeLhVx)j?w_}9SyTnp9seg*;P1(pfB>!a`I z9mkq%SI{Ak+7dCo*~cRE1_5~bLKz&ZpmbbxHOYDOmEs2!YcNi6Jqq02z@$e8=j@>n zCj}jF=d9k;EI@YtO^T36(C(m?UgSZdTWBfTtJpWd#Y-QG(6)V{h!+Rn`otZQF#GJ! zH=Ia<5rhH|Lz?VvMFl-{OHpobp+>CPC1efIgTGJyHSSWagMYo5^P^EmEiY&`f75Uo z&vwXkjHSj8f@FnXx0Jqzo()*U>s+kl<}0uinOA#56+e{wv>~gPdyu_5@nx`PcU#8xBUY;mD0FWvYl&B7fY^{2vs*hn7C zo%wQx0@Pqi3SU)Qvhpd6Y$f!nFl=|O2RqZ#8~tznJ^@-tV|1e=1_S%`Mk)+ouP`z_ z`)&>^k%cUvW;iIgX}thW49$F_PBuvY;$_kq3L);_^7_Kkc5eR6Bq7Q>Se{ZG39@5{^i2f?@GlV~dX%K2Cx6hbYYzJ7Raev6tg ziuw~M@fqXSjX$ljC>0WPtv*$&I+Rs#N4ErGnQJnoH6S;Tsg_l3yZMY&0<4TV>Gy}A z+v34@xl)K~q&2d^TAqBclLN_Re5xOmw``^zPZ^^X z`_o)?uBqmvOJ=%AT;K2Ibl zPJpeokXbuDF`Y_(iQ%bXXS4CAxrkfXU*NuuYowkzKu{|G61GPP1{<5ho93U-cTOAT zlElq$NlhqqhO-{TfG zf=xR5!KB|!iqh6Z=M)yzmn5$Gq3p!nui0!h`W9t3`&fPoQu&`zUBCg&oPxs_1%%kc zrI|ySPb>+e14M=TRB9$M8@Nr5_87{mYQ!V639oY zce@s4U3*WIs(}NP{IewxSTb1?@G+!Mn4uCscgYQ@s5|8<3I;CM2fCOvvydj7rk?X|UKOKM4*-OztMA=|4NTB6#>E+g~$`JC;y zuGGz(NC0^ofE-NnI?>)L6xGGpYMwtRN+nn(n!Q8M|V zxz{T7y&2`g_{!9uw8j#9^K7HUpK?x6JU(SprBsd6lVQ_N4;Yp@!#+$FoYA$cz@2n& zBh7Ru+Hb7<*!QQmkLA=Sk){$Sa@=XFFypkj<`eJ$wgM72Tf!(yWPt!OOtxG8+(&4u zdP<~x-ldo>I4F26>))JC+HNM){NzQ}z1=Emavs1C^%9~QBD?5eC~S{U6vfyQ_ptHtaY1ODS#l9Keb!1 zB)UP4td!+U-9gK12Ln-#=Uq^#AoWN_fNlXx+)bfv(8_!M@yv0*B%~T44%Z^+9FiZYr7wE95Dq6V7pEZ3r~jAB#a04V zGd+c10dMf@kzPxk$Z^7x!bhHgH-a#mDQL~GkyaU$KtD^1c_L=i83jySLclJYJhkWI z@#SluZ-kEZie6ByNEM7&5F9!__D13M1wGUA#EL}R>gKeRljO=p)xz4usPU&cHhq#Q zf(`aog%Su1#6m+5MnG@iW^p6qT!g9#%Q*?=1F)uvbl{*4)?A~6AmtYa+ewHe`mpHS zjZFG;3=w0BtcR|4%ySosQ#`r%@V=q&uZs_TWsIqRdT19AT&e35=~;xJY@f?=dc)*oJ%SS^hhQpf zcJ3O9gi6O}Eh&70YW|)XNgc<456;aVeb3Q+ta{@p`Q^vms=s%kHnGj(TM|4u8w^Z7 zoBQ(WY772Wb4aLRuK7V7Vd9Tiw(H-8N&0p#WJ9`J0+(`b>wKDvc|DCEfie<7mH_zA zp)UVIo0d}kaI9mf8JwEjB0L56jDvKSpUP zpnvyT*pjN9J!eVv$1HlK`5YPzv%|KtUrf*AMtXG@*vh)JFa@8Bzb?c2z#_KG=bf58 zB3(Z|Gi(CePb_usGh|oDRLr>CI3t03d+}6oHTV*9Ij&s~3C%R7-KjFW`42{~)kvbw z{i;l(#SDs0xeDis-CxCXjydZNS?pP!rM*WH z8EXfD!kx+Gu4#UtDJtlAr~TJ6yt7L7j1|+o#k2q%+o{7iJaDrv6c9iKDnYh9lso$V zC%cW+d@N_UxxHledXL{O;kHJ%c^9Ksa&41a_3D`(_47qUd0Qijll&QxZWo_fV5rSe zw0^Eo9bRf@B%M&B76!>)?kEavGM*7b|DK=XQh4yZV-Vm1h3`xK*b~=kvv%y+(sv2q zKu|vRmF3k-O2g|6*T?aOf7vsf6L9h)Fje~GruAKB7xR`!m#P?2-~00*Acp_Wz1Ln7NK;n< zq^%|xkRD&ZM{ibz^$d&sx)5JubY}h##rrkvlO2`Peq6b96eE==g}>!}|M>!ymAbvE z_O$nWo45il|5;nUbbCAULM$eJHq98LhUQ~aN8^IF;Uby6Hzeb-6zEmYI6Y&YFA$Dn zSb&E8MgwZ|4KxpU4+%g$9s6~{oln*(eErPgo=4L+W3SNsK+a~V=zYAnWl75Y&MG;? zTidVjm@z>{n!1D~GU_ohz36Xvap{sXACpJ*J$Axd4|*Bi77+7J_HEiY0%8nP0>n2f zKw#TZ6S|wImLXju$oyMKG+tn;qRBfYj4X`@$(a%);dKVvjFG zPw@R?Qd~1+)2S{pX=IL9Uw8RTlRum6D*G^Ss{eT|nGAx3o8Xpjxiap4pKQ{&%C6hC zQtdN&&*Yg-AlOw^BkdXOzx3Q>$!v+gHu?(3UWcPK;1QWLS#56LqE6Q0P=|e)PMT=2 zpKX#YYtw}Z;Dz_Vm$N#zZ&D{~a!AUi;P>SDKzKZlUiFm4usajkWa+2LmqGcTf;GX> zJII8}sq?Zj%o7Y+PqYHjc{v!WC)3$YO`~2)ju;=((q(pqlG#Qh+!38<6l9qCFx9BE zGWoQ$fN#r`&{5jq@?Q96bwuy~X#y zMhX5zyIM&G`2yr|oSJFl2T#4sBXOL&G0L&^BmL_YzM3n~2XJJ7w(8HD-|+U@RPDVi z+Os!|c-vz+W1L327_PtSGk=7i$TYa!@;ZC0+s^WMiIH;OH^fzzrpBcLcYa2OY_C)h zc#r-#dnYq_=!t=bxqYFU4T#gZDxZp|#VCASJiBnO+OHj|a!YOPBK4&bGW|CZjRxns z4FYQ1iv7Go+iszKXq4I{gB3Ry)M=3)Dcy%Z&6$^xEuCQCe<~V<4&`D^mJQ0s4c5dS zAYmCAYJFvIRbV+~A#H94IO`g(crUyDT>%>h2Ibe2_Ot17_H$F?eO_o3S_B8pTfd%B zKk9r#sx)D&Va1&P8`GUIAU;M9vd8`m`mt53QY@^e%M&`ra-? z9Z;qY*KC^FVHiGe@xmKvo|+;4x6&OpX~z?ftXqM+=IQaWHWH1=_}M58EPV}g8{{N_ z>ss`F+QnNw`uh=~@~*q9>!i#pC4sl)OvIYryc*sz5M}*$!|)KMQk#lOP3sZYOn5w{ z!edo)o3hzdBeUw#-`{Gb6S9i*o(!78MqER(3t;sY#M?lhG*!6Pcv>|Z;f@#K99ENTbce z{1>Xmjme($c(Y+8F2Rl~PEZ5s5uOD8pq~6L^!AnUjoxUW>IgsS9{1hPLOG8F3i3kO z?c?DD#za%T+Qz!ZP06DS3PqYMeMu88a(0a;kiB@W%WqpviRQv%{P3jcDm$%XwXK!_ z$F)k8uce}mSc$y9+_-m2M;;mMzFN4d7>&0|pA`ruAN^9v=QZ;AqpRn$?^D(!lX=mJ zKeFqys@wCs07X`=-&1610+UQaKDqBD7f)?!jnVRk?{1bOkPR-*?)3042zK zDa|jE=@hOXl@d)?d|qm`(y+Oo7rx$8+X4a(Z26T_mY-sPF6~vsPi4=q(YIpEbjPv> z(TkaD+8q%uFvYqXlOkIGY!N?5@x}L(M;S}CSinr7<=#QHc`F(PMDYw~FkM>HuZ!K+ z4OJKG&?>+{r5T#J?9o~x+>;#-={n_X_p3N9JO<0L15PJ%xpOv3weuDBb z2Vg!G%F*ZL#D z3p5?>BIZg_%&hD_SM4^!H%cA?V~HlKlPoFfCMOx}GnBenCo<4)^Y;z$mv3zq?We-k zges%2v0<^C1Jx<1|C^gbJPbN3&^W(G45oP%dXIlE?vfu$XO}dMl8_|M*uJ{sgMv@G zr_R|+P9@A!((3dJ@*-V+(NBJ{2Wk)jE&hhT$@z-1=7h$Q9)KG(2m9sS8y}3FMfxW^ zrB9H6&}y;sLo(ay@T2U2m=xPlQ&piP8>RquNd&aG9?o$T)W~E$XaT(>4X)N!Ie0Ou zC&QI$g0>)WP$!xXC#;3)( zMi(7$f)#?-YMy~RT0QLN=%KM;IBThmqe{Oo-fZEAqTVZam*(9K*QN2WX@3s;6&R>L z!w~292z--AJ!}qt`TGEF%|FjteZjbF)C!8%W_ooG7^CQzRsbkb!!TucgnwEnRGfM? zUKVEXhM({t?l&t&F9s;?^?<5^vV{x`CE$GpF?u=jpY3ErFVxxm zpvHL_>=48!^vkWJSK_EP_il~Kbx^@q9G=n-BkQ{SqS4p@bv$fPgIXMBKJ0Z|NNurQ z6*F&N{=Q4vmp=)d5i&mHm8Et(ptcIN{KiB(&6zb$^E!Dmg^~NqnA) zMq7`n!e-=L;me%?P8`*hc!|WX|1${A9(9iAx%YDLW`0r>pSE(8I;ido|Mm1hwm6oN zdc*T>*&cpwO?)KLzKu7^zQ4eziKZnxIa=yV5E#QW%ISwFSnR4{n`+| zx!Wu<2l4?bAMt>iP-fEY!K=Z8EKPL^b%fNyCmg`?{0)n?MTjQLR3tZax#w7!DyU^W(q@EB)58AD3;S$ z6qQ0-9D_M&j=)>~;#a4sqAfoqCcy70pnvm1r>DGUh)C1>#`DNy?PnrP6d(=pj3A2e z`m`0e)=Q)*(Zw$92Vn?`dEGRZd!<$FQ@`j4D`I6$bgB{=l_w{|1(beDzMz4-svnrG0W8gZ{XXwwf0Rmx>B2lMhb|=vm}+|2-Nx z?WD&mz&Pi9TbJ2N34b+U-c!?Yqr%-VHzixu`~q++ot$x{!fUzxVBGX_;>g*UdNgO9 z!`{x%)%9WB!jHq&ICfOBxDS!GN2ErNmdaWe^SZn638*+bB4-@oi&Z}Lxv!9-7&PB~ zX4#Y0MIbL76z2!2cSZ6a^6n97B6GA*n~(QOjNEHfV+9oW8uUknOvu)A6DLy@G|1<| z*aXY>r*ZZ1YS61(B4l6e=@C9}&4_q;i(BqPa%mwCZ&y+Zne@amp$vFRB`(t?2Vrp402qc@xH8nd>N9&(3L^L_P52DsFj%ZTHK%7WJ~SxVq! zWIBzy<6FTGaa>wggTi&Z9i5d#u(sH@a=0rBq`|4VMp2WfRXnI<`9fyQJmQQGd6Cat$AFNsd|)K!LF%h#;_niaoQzhp0@W)I#Z zF$=1Df88h@sW*^h%eir{-H*rnt)S4%-)I34bITp~n&VSqbIcTir3`Ky8*y}3;~-Eb z@oKU0Lh*QG1nGLyTFV3aI`Pb+YI*8BRT2apH$y+6j~q)t-l+(A#3!SdLdVNH1Vf+^-HeFWLyLV zKjotrBH=xN`2NFleZ3#8f-rw37JlMY^Y}t(hxga*51Nghw?6WrV#dQ{wS!am>GCssqY)5smlhWIHW2OZ#lJMyQNQrYKoO{^kcvKx6^ZI#Acd$B; z`++gG_}*i}?j4d6UpbR!qgrdv^tw30o_mko5&LxqbIn&!ES}FWat!iV21B%O^9WLY zejAUIpX|M|v{g0Bk!UcwsC=isM*znP<>O9&UbncHInC#Ozn&TYvXILi*KAYr4#l33nuSth!Ci1ih55|1tSXo;=+fO~)-_a1;kVzBS*ve~|jT zMb=>-yv0rvYEThSBDZ>dcYuewQ&2=-4rt;rZL`EoO|Y`sVWnEE)CT3>a$d-;b7ZTV zNW*2x@y8c0LwjIoC2S2X(dJ5!WUHE_g}oA;oL2?);|z{i1GFZd&(UaUyhrA5t1IQv za{rEu>vGsS;=ntJ4)Q&ID)80?^MB^<;@QEH$W&@LC|`2QsZG|HJ(>?R{WJFPi82Dr zV9;0v3dYAA(uxBe=i4+8w2xo0{Mjoms{M|uSGT&Ca%|i-34Lac^b8+-fo44w0ndy) z19-0l?WQl+2?cuBR%Bx7*RALfY(w>vVWchvHycm9OTIa=MUKNPe^K+@c>#m|z_d<= zLVzHJwGFKQ=6sV<_P6U8V8K-VROT6HSg{wW!@(?8?td8>q&aoer3pg1+X*0@Kl_T%zP!RtU@o&LGJU z-D$6kRjgvqFdutX=iyQxuxzpK=g&FC1mG1`K|)y1amyMSZf??V*2~UJ{w~Mbh1m6yM*ZMz1x#?CX1J6tu`B~%iOE^XD zrOR%-!}&{%z&Mtl#N;1(J6a|E=b5HG5dP5>(*O ze%6L(lQN8oqK6%()Epe0OLUWA5>Crizr&{tL8$0PRY3f$?N(fVt?iUWmW7>#u5m^^>dE^uh2*!6kkbv3l351z{)kad5E}xh z3;d#e0UhBP4p%Ze4&&Z7+sIg|K?ZAi()dTIF;Xt|MwkjyOt{=RHjo40=G7WTt=5jG zQ&s<5O^-|o!vBG=RryrJl8)G&F(_iGjiPvw=NJ0_=w!!CUiLdGQ6in@DRWd|)x15Y zx&e$FPySO-sPSo_$wH=eMrBlNp!gpc-^h*$&-fLKY_WeR?yvba{j}(Bo|KlSlKBJx z?-Q(?iq^HRtb=euD{>uH=_3=6&?@fyJDo!CHxR`PM7Zp}aQ*d8BA9C~Lw2p*b-;|A zDw@(BD(%m!<5nc0TH_HH(nbHyO0}Jcm-YQnhkJ?xVEzT;p*Ak$#c;;gM=+`gzrgvQ?2XQ49E+-HrM`cex|w9- zUf+PcE#H9B=M47f7f0Z;1pfcy?W6KZVw}n6o7(;p>^^8Tq(uMOd|>iV@advK4A&c2
h%Mh3oq`&9O5Bo1Ccnw++^GtqoNykmTAWP~iN?5-B zuaa<|dp0GND~ZdE$jpC2{v(=Uqcc&Z!1$K)CpHD?{(->xR~S zlEf}SiQQ-xCq(wHvAqPCeGzKqy-y9Ok#QFBK-?LB@G{Ah=~WTWqEuZI-M|ov=S6vx zp5^An=4>tT?x5eq%d#cD*I@VHa+aFH5 z&s~4%t@uT+5FIpP0DodqlNQd0#~jpMZXyLNA=~dH+N>L|=++)09XFDRflyNL&9({1 z!*=?nNQYwQ(L|>58MQKXAHuPjJk7JCo3AYll|z zO$xq6+3}MHyKthy?G&>-a6$?0-2CpgEjTnbIJC-JkFEE&=_1(;=03f7J$ImIQv3)n zzTz9G-@vnflQP^Lt8v{2Kbo7!1DMqnz4qoHtg*|6?XScG$|g2VFa8X#uh3-s(xljP z+~*1@|NgvP;lwz_Ve(wK|5MYwoG)zR&Hb&a(kab3eJZlX z69IyM(-KMUd_M5xEhXvrwyxFBCLA32Mdls2J8>;Isl4&9a%Vf0@*JRSCifwHP*18| z)6|k6jm*y?_)H2D`6^pS({)cIq|=4}Ov1oVi8qDzVf25*K zd_O5?^-<6Ou&4@1sNyk|s{&1-R1>hRpFWe;cGNl_DItiWTIT%QH%#V3v=m-9=k%Kq zE4I@2e&nxlI8~Wpg=#R^a;_ZvkKCo&rwKez9rqECqEQ`tqsRS?K#%lXK8thWKjrya zcg0 zD}0oVJ+?RWetm< zgyqWb@Zv`$ZdMxgZgwb~cMJ+;EPA%NK zn`I2tdi`y_xjesk^)$>?Z|Iku?j|0#g`^i=!q1hEBIYGD${g1z-SX0ZvGWoK!fSB*@x;9jN zB&~ztVdG;9xGsmsrwt7`TQfN`v@O5S_s))%HcmEn#<**Yc134BuibvX`F$$XGg@LK zGVgi0bes~p(1vkLW0++%T;M<0;=Q=^1b==ApmRC1pxWr(1x&`aa{$2Qa%OvE%{fx^_VNc@7X4iX6w1mMLx0X%kG>8ZI$1bXk4u($?#n<;A(45 zEZMN-{Fs&&I48YC>uwgF7X$xY5nrR%?JV`rt!$4VGJgBAoK?{p8i{!{``iL6ucb{ErI!_8#t% zrh~pU{QKb_2mKd{mDz{MGO$E)G#|GYL_ZQ1is->JfeTNl5eucGBuX;=I<5o zZLXmr8eCkI4_6ZvrthwjEHLOhYVg%51zui@}-hh14Ur>n3x7~lPT-mi8{s!F6hKuaoexCw}krBkgnNiEa+_l@C ztjQU%w$1aiy}gd#?}^H&PZ4t?v_^)Wb-wZ2h^v;=9_xVP{cC*oCM~V&y>lFmxX_x@ z=X+Q9CqNa^-pFyx1+5|NGPx1=RE9MBeuv}mT0TpkyKb^< z7{m7qi7bJ)^58CF>BOu-@ky zzPeJyQG7!K+ctD`(Ez5ExKi|Ke`E44!=F!Ir%3w;ELXpc_jhp;vZ*^;7HTDy_@M(x zE=Jr5(Koib!yrhXbwBK6Mw40`8Phwv9e`)h>bBvYYDcJpzP3X!{+8- zPuocGNomAvpfZT?Q2nyZ&2=j|o_%CT9)8S~+bE765ZK!IC zT4Z|AjHEc^5z5v|a@4@lhHI0Qc?06XXW`5@&5#dHYZcV4-xe@7an7MHSt8ht?+kbgl}h!nBT}I zmM0yHip|g1J~h zuA7GKm#0GS2$TME3_z$Z;Tx4nEjAEP+G<+v^A$UvQlB{sxKQK zpiWUm$#_n9KI4$LdK+eopF$qh9sIb90JxOS5qLb+YMnxlUb$L5nZltwEg)7YEFJR3 zw{TM13>R*?Vu)BSw;Hx5hb`naKHu8=!%$JNV}}EFi+EPmM>P1*Kvy-PU_@izKt8tp zCDcP$IeZy!zWXyP*Gvm`jTt$r=}UkfphloKGa5Ci!7DQk=clN*fvFpRy4(@dcDW=E zS|8P=r@H+fOhy~!G?#A7>XXEu*$`*&%LZGiRo5h;6uRd{K~5t*j+bGO1E~j5@oOIy z4dWcWRHbzI=eS&zYYHFS$#M8uGU}-lOJfSYOY{|CGngN!lHotf3_rJ%6Yq6Zt=M)+byIE95gSb-bxqPjq5uR|=ANGHzHDf9X#)Z2 znSgBx^$H=jZjR7c+!|8xH0}wd__F?5LH^5V%YF!~?!Mk=%LXuUmUlG;0vF<+D3kff zt>gUD84^aBw{GFrDj^>+64z~oHuffboD_SZm>_9&@*L zIZ$OOh8xrmz^vq16*iMX*!)BolSs~}worg!Xyy#j9Exi;o_!e_jQG`py~`g;(VR)$ z?_GJ^9Zrse*Wn8@aobL{jcr7E)83vqVKF@6=MR}7rj`E=iO%ZNOZplldE@a*@)q1j zQt1$8s=UL}@ha<*N-~Oz0qP~3-OA?Wi;DzGkGWJA0CTQ%E$dVB1DEppW`62^1mNTO zcuFx)+e7j*)HSwYy|#bZ2#E+;1B?6lnOZc|Sj5Q1Dtg*5mIk-Q@k}Cb?!<`vCCi6y zL9`HAc|gHf%?g{j({0-i27nxOfXWffBUrHh!~qy-6!DE?vU7Z_5lK+wYb6+Hf%+kQ zJE3j~U=DvJpwYPQ!Wl#rtzV^k8%F;T;cc`uA)y#S6n98R9~NgZK8i8u_Wdi54MdV@ zUQg;*5=(nCBXGDP)41BM6$$WCB=BjlHZ50EGbU0gGx>a zCb*;~ZMUKU5Lq*Q|jghs3m za7B2iux^k>@rhf;A|POmk;~%iI8Z1vRhlDAwF)rdn+MNy5~N<35^yOK!i`S+C5E&W z7ItNxp+Dx}^+Y~R+B1y0cJdsdGfuA8{tYAi~J4!qv2PMv)Kg z@&%N9v(kmxH{hu5RV)VitNAT>GP+6vG_Ao}Jy(<6Z7 z`~9bbIPAWQ^dMRJ4TauCnid$+CV(WeeT0wMnPe;XtJblPCkfTedYB(I=eyo6y-ut2 ziL(ew^F#S#t+%sb7Me_W995I!eXgsm!)-X4=sOyIcC9DnPEl5MIXp2M2$F48T;y|DuOz!}Np7$Cj%0p_q# zhBaG%AbLJ0W4$y@edwe(v=ftil1Mm`PQTrd{7(e6PJFrKFr8JPk+R{+4Tdc-_U*(0 z?&&l8xko$mTqT?^OMlo-d9)Bl&K_&8OPAdeQ6IGioUwoDyk{ro(18iz{BXW0`E@u! z=sHZU{PfP9*^ilseaME1M?ihosio}Ou@HyVi^iWwn*z4*DKE2+t1MOk=fNyj zk>>y6Vm<9Jr#9^;6;>-D^vV>@@hiv47}K)`Rx$4u{^fKGCq{T))af0}>D})zX^ne= z(5U{7F|3u-@l*9UodkDj`(tNz)GeKKPDIufGs@I6;v}PtrU~G75rWsuotLT&@xVKx zg1OjvHbko{x{yx`ov&lX=;YQuzJuREo+p2~gWu;FNivF@eo(iVIiJnz;5CU`FAqpCD+laoOgl(EdswZB@ z7lX2Z?9voz47!T`HOi`2y)6 z=g>p7d`7*4Z7e`U`*=!w8s8Xk_ z{3ZAp*NQz1{+x-N0i65}olRw!N-%}$XAkttp9Y@u#(ioZX_nfaFQV3^WTUL#F|r|B zc*R!i12ttx*7`MP`~KK^PIEBn;s zgzT)+k`G1l$?P8o<(bZ9U0GMT{D*ppLr6H}8)&RTDWQ*p(Lx)vPXG;76^9Y-o+>|N z;wuI~;!)Q83dINqgP+c3Ix&?bqNm2h{PX&`GvaKq8pq*%BcDo&<&%(D7RroAOc{rl zw%-E&99@0|QP+?vd50E0%JL^&)ODKIRV;!C{4hT zXUHd29jrNS=<{iww2A4%55K{-O_6I3u`x9+1m4y+#K{&Q0wu6~?sS-#@Qbd-#m)Ty z=XuF~Fv`O&_<8EWfDG!OC(@>AFQMoXAo#lC%Tx30qpQ9kaVUaullAd*tx1A^R{?hx zk2tTWk15yT|J>%D>rVePdV=I-@8{*LXpj*!>PbXOwEHERM5>J-R=P-_xABIPkDcIV zCWt^yfFh5UJx2i+!!6fS<*$2l8sPSMFV<`$TZe<)?h{o1@U}PkX4AAYG=c?q^9ef} zo9Cz(u+Y&AdtL*3IAD>UEuF`MP>%g0ie(^juZrsa^+8mR3~#|I8C9tiA&GzIXOjKm zc)VQ#N5u05(K~njKoG%M*=`HR3(Y3cjMJ0ewI=Qs zaE~-j4krGaO_1sP8h-5O=dFBzXOw3Ui?P$zcHntr#p_DB1b_BsBqobL-ZGjXx=k;l z+W@!T>gg!9_V4YGO2KtnWH}R)C&Bdx8KF@@ROzZfJH}!Tst*PjJmD2^R^TX{RsCyn~gqT@2>&zgtzk;n=2fP zg3jWZj>cPq^l-&<=nKhl?6qC9X01g|8geH|=)ox%>3Y@dBfoez2okAgBR80e z2aPpY>3=IaorQ_`Hd+EG?@Iex?O58+PrO2+0dUk&KUpLIW7}96fyQxO`FiOZ=HOU1 z%&%E$@T<%pA5Rydx&3ivGVohE_*e8Pf@bX_RiyFOFiPI3g?rq=rGu6rD+r6$S<Eql!UG}?M^Ot*uBmf?yfPK4f*Um(&W-=vKdxGyKW zM4>+zDyMO`cd$Fz+Nie>xUmW*n|4gEm(4i}Uk%Sonnf`OoFG4eI`!^S4J{#VfY2@% zl_JBGt1jkwu5L2>!j^6J&?8kl{&*htFzExC=m)tH&A)irE7Dijx`2#3YweWp=6xDqeSI3ZBpjqqRQJ&73x)^NL;-rm z%6)w+GFI#2@BD@r-?i@A0h{gZ&MPfXE6v%rQyBM(;DBr4-T)%2zC< zZ5x|#)BIlbL$KxPv!`E4Iy($8`j_jr1r$p(QPzi0$SY+D?%mXC3j6caK5)Tz!<0b} zQ82M8k;SL%yI4FnQ&xD0+aCv>r*YztfOT=9#lWM*x zjf|_E6_d(WxTy(-wKto;5_amb2Eg=V@>p+j0CYK+byos>ui)HDno*7OcZBXsl>=W{ z%qcOJRdx=~1u;VQSP5_ie>HcyLVVq^TU=7~xT#iguV#aI*V<2=OeKnc-Ilq6uQT1T{e*Gj#7hztWLjBb3#%U+G$P#WlK@Mba>=vuwl0q zPud`a2ShQj)%p<4__V<;QG>2w+2K`_L}}76`NZ$s%jZzf@KbG~eMPR2GucY#w{vpF zbt!4=HBR+{KbR!d*7$u}2okUA-V;ns;*(0I-cM=+WIXwX9;~H)@}eSiH9CGC4<~ zZv_T~fwrOASx%SbMI4f>(U9Ike7)*)K`B|y&GEgOb=z}ShOhy6cCC*L9YNRpqcsdr z;_NtQWi++@2If!SljYave0^*cA^~Td1U7AFphAWRii2?h^7QtLA;&zk#w`k8W(QQqr^#e+EIhb?qFIN!2Izb*F~|NAWvLGDUM*K(#1mDvq|j3FJ~aGf?mP$IOOTq zaxo)07tdeSTp9~HSS{e<3NytJI!Q+94*$743zvmcC$4CJgOV&l#D@5+t_AqU-@M@1 zx(<=%M!UEarz%m5H^3AA5R}gDhOHN8hXKkSi&|DxqpA@@j8d_<{YdHZC!;=*zrNVq z?K9d6sh4JF*VDONKGIo!Eb?-cFx1ZMi*7H&`LgX#m96J07r#=N1EI!c+|gpRo5sm6 zYEaTrj1>%UhEn=LsOI-r9pQl1)5Z6kM>RMNakw>S#A)FbfhY|)Y1XZKb*O+m!CcDC zd1L|+wkqyXD|ct#fE@{AM#sV}}lZbV&BRKHCl z_PS*kS%i!;?W=xa6Oq5*AyDzBxRu!*Ut2wefvDvb7npkY;#DqV)=YI-XHQ9cw=7Z$ zsdhs8-Df zqH%n)PooSqu5Q}YelQKKWB$%x823b_2raJl`N$bMU1Awwl?FsiQuSnk_$@?jyL~p5i(d)=h$DU| zCf0sJ==K>#G1au=^P2Z)D+R431qpP%y)>b z^e2o=SCv*amjwdgAJFu1!jyg=z4XhSX7hX5d@J2dcX2+G@q~`N7uV}F{N}Elak>hC zFLc|vTapS@8wBKj$+0PLRb!tQX;{}r8uSkpv40{9Z?4Pjp`CN ztSQ*z68*yR=S|$>rT*L9;a+JAk>Asy{qxPo#ZV@ZKH%x%92xL&co7G9nqnln(D!+H zI|;kg?|Qu&$aJ{)06ZVgZ}j-Q8hlPH13s^=YjQts4yTT=nFf$^yW3tTj;00t?r#oC zmjRx)AB&}o0&h=;&|jWE21Xuh_y<1y-fkxp1pIt%PdYvdfEH9gK8~ba8g#wyAXz+} z?9sdUJbk>j)NJVrbbhS8atiniOYwJmKAx~%ecq+D2>9&+RyKRO&Dw#BecU?;eB9iJ zJqq+=0K8r=&W`{OQkVLjfcHg*&$ofFxSEeUB-c-ql^(Atm&Z@o`5wUQ%U+lQQTOK? zh3q3*g!oh(BauPB?3UmAhK}M)>if_L=N7=_@${ggbnp85;-JOg5%a~sVe9QZ>E#kT z*Wms5(E+g8<@x?R<*{AXf&FkH8FxA#M6<7+SNeS>M3-ar!h+eGSX0cBbZI z_VfL*Wy|+tBB`B?_}jzrZP?>yz*Pw4(6OLMF4BkGJpJQ}>$EJW!&0d~;1*+qkq9a5 z{d(svH@~s;d3%d(YY!m&rPIX%^0Oofo1G1e$RJ6MoeK0L$(@~=bH3%Ne((C}ej*oF zz$?z>g;0a5^$-0^a?ktJ^z>`ZuXDNXR+}J?o;)jF=f~QH2K_lL!0SL<(h@rZKp~l= zeR<;@wzGNd@?nJRtg*kQ?s27c?~c5wuFN1kC}$o}139i86y$McyAML)Z6u3qjx zDhyg4KUX@YdtO#@1wKzME}{-77|D?Rt^+?$u?;#~KOq^vDzpmtJ(qprKo|()#~22_ zyL&USJI3{tz@}c8IxN33+r_m2T)?#G_5)F106&I0XoTgXG7n*y8+)^(9huQ~vhCA; z_in8Vy%6ljB41=r!yZ0ui&CbK1P$q;0+k!ZqkZI8{7@5_vS`?7LCv5wNRF%2UI=su z%5-8BW^zZZL4j}TIgXm}dYjoDLE1UNZP!Hm zacc+cSE-#4==&7u5+31tsH_QLz_H5Mgk|fM%v&{ZhcOu@A^kwuO_51aLL_U?I8R5g zeRog9P72082v1nb(SN@0-*Rd#JGWYI5lr#!=#AY}P7eqiM7aAC2_ZS>EA*ArYN0H7 zVEv~p?CT+w9#fYHT6FY5loctsSjw1eoU{C0(2aCb3MVz7V=O0_n}(+@`S+DMSR@bn zOra>gC%RCPOG1_ekCWzUa#_o!EoT4urmS?L;wl|1)lXSLC5k}F10j4d8Yj()SbL=tyBDAokakIlob%u2Y)^hoRNeB!x%Di}KEQkbF z-+Ylm?c!uW`%+q!Wvd?fB9UWvxyh2)oadOL(xG5e2g&)|(>UY$%5X58{GIZEmvq#|p_4MFsOelSN7#qu6=5--I zeKf`7A!4NvtjNCX%=-v)$QjMKcl{zfC7bf1<3IEOB^;`7+&q#kOEuk$xU2rk)dK z_o=j6+x`xZ-0mNfg+^T1YOPYT+U@j(Tk_bqJte2~X^T45rX=mJwXIKJG8*!HGA+f2 zYsbof9KZ*i4y!6cQ9vT1FlBUxSxR_bS-ukiyEnxajm`0syIFc?6ItiMoWpAW#;qT3 zrv+wxJlWDK3Q)g24AN}YyXq`;W!sCqnn=sLMZQ5`Z1fUegK7Ushod-+9C%6B{)*YV zT7Pn$!2~^Vlk<9dA7~JGAdR)zUa@Z*iIWAul#J`@h|H{n*RJl&W-wQmTh?KyXwe<( z*I7;hRbaFI9Z5RTTs*qA!qJHQ1y&3$9RdTK67-uS$lZ@>+CZvM`TFgB4E)fZ0qWPT zNh8;0rkJj5rt+g+WI+lYDY5{fwohjf)F67a^4KZ~0S6&pkucRoOOROy-QnMOXn;Nyp z@vcY=avsVSk1;TY)6hAHtdU*0GCBd4w%$9V@=UnEpe^@h>t{S$F5Uwq_8xlC-{5@e53UIYrpUK9ccvXHl zwUk*t8j$G)V(%IPTQ@|Fpu=qOuiuw{cER7s2q$=#O-#W_$5| z%VYTkK3$q25STyw{H?dw5yR{oD=}%lGJKqujj_$8x7R`(Vg{8iP;jNUATjel=zMry zt#U2#-HT}?D5@&~=+fNIm;XD=NVF(pi0ov%^|W^Lc3B`Y?y7iei|)f;aO=K7G(Uko z(MIu>3p^B0F3&O;%U8c}TjYIVP8T8C@6XX6Ms;E2P1N|)j_nv9 zr=s1GkRSfXmnVnwq*xj-d{P-K+uzf_u{B2ha6HfOPfXwWL2f=H%)CeRV^Vfd>6!6d6B%)mMa2dl1`PIW!@X`^_C}=MK!iMBHCfi8lq&(oR{GG5D zJjCD15}S#H{*juV3ieBm6c`je2Ggk!X_n{?*Bd6btaYIYHHAmx0iMDy2n;dA85A)r zwBie{d`eu7jKLq2m9fRi>$4??|3L{l;SmH8a9W#zi87)rd|^3(HD6}C``7=3Z6DFL z8=JX8jA$Q;&sLk?++3Wz_TQ)izWdxQC*x2hJA#v68?&4<_^3Xo5@sX5S#6H@vs@88XGY$ZB zcLiubuEvG+1d`}*m$0!;P6l3(Nn22o5xc5rg(%vgq+RnPs?+<=OUMxM^qhS(^@?r% z5LWp94Zfq1!ZYt1k;GqW{dGPv&u?FDJpV=R@U&<2PIRw!oa~Wcf3VJ#q#oXAeum*O z1P-Np{g05;43nfW6n*CiVBk4=;7WrHcG!|9<;GJY(-!UDXwt2%RMs{eooRInFr?d1 z{>jhYxYZVAoAdE-gn*e%T($$ra@~dWw7K(y1O_|s*uu$cKI=wva38yw8XB>RKNis# zfM#X6D{@T5$tsBxbE;wmNFUNHhvFK-B{olhNdB|?Lo~G<6p$J(YN_4j^l;j6=6HlU###4-Q@jF9|H%r?^*?DTKtI%bqJ_UEenfw<&Sq6CGhkKxjus)9wbnlb9dr84D{JAnG!@!ms{qlia8!rE zS3Cx|L7}8HbR=n(aK`~xc{7o8d26Ab=Z?c&4!R;ACA1}ek|_yx8I`ac8^XA_;Mw8> zbN+*(^lySLYPg1<5hEzpCX}cljC-wso7e(uO(o}TZ6*5G4SWscbXxW;l{-}kikyE! z(Odcf)DteOiV9RqshIBF|A*>9!@m*NsAX)pQ)J#SDrB;fTJKtrp| zrmW7@)0=HU=h{sFn~AuDBnbrb;H; zE?LQG$i-)Cv#Hh7BmbnFKQ9gne6zJiylsJ=mMeD;4TbsiIu31jIP8bgSjHW}-i2)T zKtBGhY59EW-i}yRo<-F8Pa;ET-?fN@%o3UZHU=4y|Ef8jPhj`wU;6(sSL`I>kqD3^ zlv$}Oq}Q9Ya)vViJCsi4*2@~0$u0^XNtL%p3XN@cWhSs{-*hh4m^$92Mc9xMy4M`H zB(OVv!S{eor`0-iHIe2W)3PvWNuDDVk%s?=0fk+c)zpz%aAPtTv-cZEl;uw?byf%l z8U%2tRNcYZB8lrKBZ+ZCMNEqTiSLzA0EmMS7>7S{e?#|Q0#uGWODJ^w9hm{CPA$Z5 z%(HM{y;~0C6bj-`xft3mg5zidl0qkX)s4Oeys~6%BIX49KR{h*0aTEvqC5k3e#R!I z^5YE>AehFD`J5(fpkhA|62FMSTWO1+F8}azfu?G@r5u4}TLAnV6@E&s#=s0NF54Cq zuY)$>4XExNS2Gx9&2L{%V-e_YSv02MB*`v|q54B_>7XZaiY0p8t!j|o2ObW(+E)51 zwNtyEMgtw}FfpWTD8o=F{`=;xNDj_TJ+x+KJTGcpllW*{bduMa6fGwC#5Z+vojEjB(ikOa+zc*aUk6^x_;8Raxo?7dMJbVK z2ZW3{EkzV%qPT_0Y-|aQ?7B7AuQpaQUM^S(Rcx(o(gqi8ckv=Thp!mLU+%8jVWh2C z-DGW9M{4R;DK!cwe9M!Co*uXp7pNmR#HsBpcU?p!Z|wmCPGolO2kq-3u4?N`+iU+b z;Co9sa-Sw1SY`8=8G{dt_B?QK6-~8(UWlTNK#81F)q<+G_+jPa)OX5$3!wG2DIJwX z6@yoCSCXZU?4a_iz#P|~G~9DGnZ2$>Eg{?`6z490ewkKAI>Rgk!D87{?*n1j)x8h^ zs&|D&v%S<_nbUF&Ul*WI|-_J!L8 zxCf){@q}SS_ut9GJI4&ZIan8^=J#V`$8XDtKETBh{w`kN(3{L(U-v2gV{}JqPkoau zvx(0jUczl4wG$zA6px7_&X!K$t^Wna@Lmdo_pxcxU`8UOKeZbn^$!4#sW{HIjM0bL z(F*wEi=dTJ6@%BNn{C+Y$WElkQa@QgYPxas^idPMarihB20r_PDY%Kv)HC->C+r5q z%i>y5LfIf{MyJ=)dchI4T+Z zHuGe&Kalcs^{z<)h4d_(`>y|A%mEycQ{NkBT2nYHbi7QO1NrE1w`+7ULc;KOX7BxW z@l;6}ghEE}JsH}W04M}!a#@h|?}m*U1{NN_Y{i6x=$BB$B?>r%D6G*{3$T=mIM@Vr z%0BV)M9=s3N#Z`{5!U7(%;HxO1if#vM{ZQz@xm(IAHafv%QwV?*Th3&xs@V zftPA3_NSAZh!^e_q3$lkkQFGtX%y+z(YVOqPqu=Lv!_lO*_2%rx&f@Iu)-)@-t!b0 z{;Z4G-z_9J%63zRod&d;Q+19~&)~D_IGD1!V7a`}9mUbBT-J}-?71e6kGNVO^tYp* zHys}+x6kByapVR)OS`2;-~llpa@uy(672^YU{c_I?YLXVWcB4qq|(;c`amRYKme^(80k(4Qhv`hDl5$S}* z-<8`&VROP56W=H9ciM|vDOPl#*4WOXFj`T|2EpfnrMZSKOct0C{QzjHj)0|xf@IF@ zJNG{qnvDcS;do7SHL|kaAYEOS4+p&2+iHE*ew{>tlY@ zR@J={qF8mh*^hV!XkM52p*z6h3tn=U5L2My`yR$Yq*D80-X!CYpaG*GeU$P2um>Xb z_}@5j_||T6YPC}WP|wA$v43q+)tiwh2gn$JP23@-&q;7Bc-(D8Lis|>yp(Vzc-?jd z^3k9*?^6H``0L_@=cRY2T8V z`Q9z3!-^=}TjF!Vf8%xX9_U;H z6b8MV!uH*w{kwmm2$JNkY{QpdVD+c#nTMEMCP+{UaZ}DW$fJSL;nGMy0uot6WqkxF zO1^{ns|>#qEeM@9HU(?Xgg!4n4P^EbZ9;qqqCcA;dd3XL2te#}wUBFVM{_U!&+R6) zgfmQFM%a&zV=6WYYI*@U^LerP``wsL>#Swp5m^;!La8Qp71sL$7$J#mM1qkDj`b=w zt!wfSUGlEOI0FPaVc&$t(5Lekx2%1P{hdb73hE!nY2!nsHX;-@9z>zzAE=09D3J=D zg1>?ySW&O(?YAVW6Q4Iw;`44o6m`K$7Dh;hxg+t}b4~NZp4tKK;j)-T#(#oYIDq}y zgvgp5%-T!xfnX}4NNWqRr>+vjWz8e`FS_BbZ-!yRh!!gqsVgHz>n=Ye{-SUz-GWA7Tz;m=}E{t9fGqf4ILsrjz(C@lX z2WN8jVbvY8Z+a8^$F>B~2y6^PX_}dEwssZl0zN$UydX8bF>1xpbMxvgxMLmhKYlW0 z9Q@qetws?~rzE+KZi_qN?al_ZeSk;_MlDqRqJ%X}bFLJtm>Rmr5owN7<YiWsC|vak!qI;S z$g3~gkmwTIJohV%^{VwUxgaNJRbAjvEQpbP+X;IK5sj1r)3mFn&TdXkhF@h0bFh+8 z{EvW0j~@Es_TI2c?hG891`fXe-yo^oPd%az#E}@b`*Vn|RmF#aY?J%{kGvr_*~o2t z;H3jJ2p4cJ(OO1@h&FEkJDV1gKl02nr{`YJXf}w zr-O3MySSh-W1Xq@%FX zXl^}GO(eb6nV1w^g#ZH~JT6;aCyOp9bUVJZxlqcv5^er^HvE=3b9SjJ@EzePh#i8Q zskN(3KhS>+m>CQ+eLB|j160V-$m1n;A#R`BjmwV*U<|dUo$W4RH4S4THftX!4bSCzGiV?>9S{_}W7SNTU}`HZtQsGo=xT>C>@~g7 z|2`tuma8R`KURqfoQr09i3*&%vhv@#b3AnqTP=RZ{$}4Me7iIZ1K1}|>`8+^071P# zQe)4cs@Av%$M0N%@$a$b{8g|0&(=8emH)Mibm{epM1C#{C4(XQkB5ciggxX^Is)Qf zn>QgUX9p|ynk456QC7JpHCqPN4P!h}s1O7wIX}wi^TjE0r;w7R#kjtel5#(BMFSl? zwq;p>+lFAS0~WB!5R-|1@}J=oqs}|YCErR9ERcsu1lP8UFcmh+GIo7FrZ1H;E2Li0%C~}vQqA6NE|A-4TR;= zjFf2}{%PtCT%|7>uE?3IN7X{7qqw%cmY14>lXOJ z%}C}^)ubTW`dRQ9gb&~9=Awy`HL#F|`D(iiI^giVx*bkz3_QPQuYB#3YpQtFs5mwB zr+avb3>&D!i@K~ogN5q#WFsnwMchqtmRzix%nB#;;i}HpjA_wASk1820J-F8;q2kP z)Vm^AP4BIKFe?L$EGMWca7k|rx+ZFZeleanow-D(b?KI1J>qj4Fd*qBc_@$rq8c4n zSp*xFdKAty!7KaQ``nm7{_8NJl>vKHZk|=Bzz%_Wu)aF@fo98{mZr^Q^C9s4;$OUR zmle?!}(0F&hJMX(o}@I9#CL-5qFgVEVshwGfCPQls4j44nF z2Y>%37-A^30jJs0>65sisZF|?T1#EuHqR@|Gjq%dWYgHwt8Gb_X7(*a>FP?BHJ2JN z=3kF6HN&D#nx^xDp#HKkM+EbmDmw674Hzn?^DWBY{0$5IuwegaGh7)0b=(nptLw0+ zxYQar+L&X+hbgY?-Rx3K>3+qi;R2hy;Vv9M07**n&IA)55}sk_yO3|&yp)Yr1#wJb zUd~(NX!nVekG?mj02LoQ-KM89Q!&z303nv{0As{$ly($Fv4it{i!ey?ol^J0AgeDd z-8`qEG|{T0!P5sOTIe^cgDGd7s>{uBxy$DLzGnZyu47<{ax=q`CIKuz=wKP>i?Ip- zNi2Wg^Q3wLs}sJ)IzA_OqHUlIpQ=BYQ??NzG&lCG##h*}u2wjyc1m&yIr^I#j>do4 zos_0fE=74OQh8K^RFYQp5gdzZ2TB()OG}BMOTqWRv@3Uf6D%h)OZDh`#8x@`Ff1gYlu4>eBzwkY^2OvvYyR@Lj6A$LCx%iYNn#%>(8}2sPdR_D z8rziKxNR;n!ZcEhU=yddQq9@^)-xj$zO^Z-LV$3le|mlbr!NB+*ScH=y_w3EBLmzY z+Vl=LR>vyPdCvL(wyBx52;EB4_>1Z;J8-@wsnt$-e#+*ibfy|*)36u7Cd`3|OjFNR z$|N~ayciD3^a=M%Pge@%@w8_Z#j~)WGC_XQA@gR*S=Gzi#^j*GitWe9TQ%);XbZJS z{hpCaobtELBZ!tp0~Fbmq10`JRG43e5r%Z_IC%h@+|$^k%p7-USHk}C3;(-O@i)3W2utpHs1Mdfjo*~{A8idVSU z_>rz?2|(fhPy3*5c^}Qcc&9amgI3?myDN~5fh#BNKN(i`x`2qu%nqh@)qGLrvR`9n z7<1(IZ|VOxH<#=8r+rmF!Lcl!`kAJ!(93@MkS0p5PGK%X`B!@=aR-I`_$m0?hRePf zFm+LSr|t_`VexawC~F8bfJJcR$XKyLN}at8vFg|*t^<|J z9{g%8`AqJf;wwM1-jX4(3g92n+6$rXf|Bn;wY$1S+XL&Zvp??W&G-qb*~aX7BZb6y zGGAMih?edQ*9G1rqA?Bc*o)e$n_8ahBpBH}!#DgHrN3ds?4McGG4JLq){0u41A^sEUYMH1-kp(Sn0j=;_m zq~jcjdcyzP*3ryhG|N%9)`qEdk|r`2IDj{JqP8kL4EU@3_QNL?mDU6!H~=gO98Zwr z39VG*u!c=zX65%f4$$AdC1YcQrfv3=h4cRvl7p+ezJZnA`57x#6`1(z!87}&i+ZUK zI&doZJZJTAvSR~@P=s!ldNIcCd&|Ek>5<%TtW#hgY1b3eFqovwNE@gaD`;xGfJO2hGruCs+{?n4V(?9F(RHhwz5MBEH41KSaIKO=3D@2rn{C|Cy z{BAw89EjQ%auROeDk`c!g}BBt22e8p7KAss3q<%iK-z4kU0z&d1idc~-7MfQ*{&$&TF>@h6awp6^_sh-2uM#=McXl8 zsoM!;+R@M(q>qNl(v(agZQlkw!LEtj^OrJe6K{JLe7%wMS7ptGuS~Nez z8Q70nr0*g#5h8*K@^Vr6pLuZ8GjVnYgh}dKXX1*No0>BcDUk8s0ZRa&6+k0$%k}y- zI5q4gfP`K8)l_rH9v z(@{nQvb!MxQsMBxtaf>?8U72{4kF6_cU__t$H(WOQ>%lE6!pzY*JC|0_#5%M>(2kQ zs{nDf$@p)WL>_I8C*~$xrE~G-&{2s+Sev6 z)_-HU?xkR;uJ3^A*}-Se-Ijo(teFh>%9Jp|kz7hhLE`zh<8_j{Nl{N6_cQYUu1<0D z*C*S?ytFU@W~X}vE+v)Vxb7`m@* zAvkjpD`CqGggK{LRqlbb-q)7(v_2M3DfWIwipLN@?kFBcWw#dd3Z6XHI_C*=M91X6 z8f5%0s&$W0Ei;Wb`}?jJHe+4H$TpxZn-wMbuC0m!vN7X>*SgYpDY)sAshUwUleM5D zW1foBZQOSB4cLuFBzan2<2DqRfzLJmeJ$=wBTUESA_%PklS*6+rxBxU|jBbC$F_WZT zI#{fA46|icCF%Z65`R|)oId#w#jHK0XXkg(9-J4IM-(&h)%3YW0Q(H#cS`T-sPyb| zCR!6!OdShd)Mf$fCE8aHznRC5C9@gWX}AfXrR619u8+Sc_<{Lv4ZofmJi4uF$I@92 zBwO$X+J=dbO zsoHF1h5)^Qh_w&~^luqM4Is5~`wWoUYo(yKC?ngrF)}JQc|mw*322l6wPL$IF7um= z1kSF{(Sv(H00*Qmkbi2dpx2D-Zh2&0|2Gcsce8{Jzgsxykqe4WOMu-HoCM z{{eu&yo5$f=CQmA@tG;hgsemaeaQPUtTX|vwGl6JwUTM$e*J$Mp8ngL%O@AL_qS=p>#?L(y(-Q3Id|Az|sv$ryv5tdl%#P`k$Y>;og~f<~-kX z=8E*69I0QcI>{SacR8(b-ZmeK10m$IfbQ@J^Oc5MNjBz*U{4J%*rTdhBt!z%e@*!D za5a_I)k>cwFFw;4VJymtQp$5+nx)P^1l35>V&yg^1K{LN-rbP@VTby-`BQ%0D2b5o zEXzx(l}R0kgmk=?h1b>Dcs2XSv=Ir-B(igTuFMXJzc%5e2Hz`Z5xd^}9$oeNTp+LF z=zqZB0bLK1knmQ%ZNAdhs^Pw=Zft0TkHUYtHfYhojhcjh-f0h7F9(pcZI^L?Kx6(t zps^BkU*_qfjI4v;=INtuS7zIS z`_n_q{oiDt#TDs8_9&1sG(N|ndw|0AuNI4&jBg8Fh1XXgSix2Ji{qmJ|Ny_36h z@a1&JA&}E>=qK{4$8KD;tqG(}pDUf_jlrM!bU7JFi|qd!oCSyFA6`p^W*5nz;v>OQ zREGhf3_%8ZSsuRVzUqgFx^y^EaLuwojJo7cJ=(rwweIAEqIZC)h58p;Xvi$>hWD6H zUEivN7P^cRxd!lkb?N!LQb+ar#R_r3E4N`U90S~fww?Vk|MqyjLR59U_zy^EYV2y^ z^RAQ2(Y#;H0bO6PhkTq?Erb>hrG3XEST09BLBQAOTChIQEpM(z5?To^=ie|<%j=PB zD>tIme{+rtt8!$n>}>9ufA$-RL@}CC&I})eYlIvgzgNcU#H5tTaqkN-CM=*9ul4M9t%0rR; zB2%zd+$^-wXQf}>r1D0CjUr1e{Kt!wm$i}a(k+VCt_I&KJQGV5Tn`(fgM{JHJzX_Y z{Y=eXNOHMcL-!BWj=k)FHJ#TEwkyenfc4^2! z5X9|Q=CBq$!#~)KV*idg08u#;L{zrSV(9P7Wo_9yH^AA8N#GDyn%16!)lqRyEJ-4b zR-l&bf!pULoXre54y=UG*rz9axTR$tI<1DYHY;b)dR&q^yhIy%Vq0}>(lvfa7)flt z=3-kw#TPwncr^K29)eK9b1c%s7Kcfp-Js9V~nC^`t%; zhB?{y+-c7T+Y$10zw^hkd!;ouybevFjCw5^!VQ5PMt)M2du&!OfGkIXA|J%k4^+qU z28*yH3d`z!<)FC#cBA1>`I;S(roE>(zFS0{?=}lPE9MKHb2|gvrOk#-NNM8w9xz0` z#(OQRN$Dy}2NJ_1*}CXh;VsPRJ(I{aA{Gq6`x2z%0D7_k4W{BiZpumw3)4OSzTxg- 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 + break; + case 59: + break; + default: + return 0; + } + if (Timer) + timer::kill(Timer); + + float timerTime; + if (value <= 0.0) + timerTime = 0.0; + else + timerTime = value; + Timer = timer::set(timerTime, this, TimerExpired); + return 0; +} + +void TBlocker::TimerExpired(int timerId, void* caller) +{ + auto blocker = static_cast(caller); + blocker->Timer = 0; + control::handler(60, blocker); +} diff --git a/SpaceCadetPinball/TBlocker.h b/SpaceCadetPinball/TBlocker.h index a8f97ec..1882263 100644 --- a/SpaceCadetPinball/TBlocker.h +++ b/SpaceCadetPinball/TBlocker.h @@ -5,7 +5,14 @@ class TBlocker : public TCollisionComponent { public: - TBlocker(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TBlocker(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + + static void TimerExpired(int timerId, void* caller); + + int Unknown0; + int Unknown1; + int Timer; + int SoundIndex4; + int SoundIndex3; }; diff --git a/SpaceCadetPinball/TBumper.cpp b/SpaceCadetPinball/TBumper.cpp index a1fbd91..9e1e6ce 100644 --- a/SpaceCadetPinball/TBumper.cpp +++ b/SpaceCadetPinball/TBumper.cpp @@ -1,2 +1,152 @@ #include "pch.h" #include "TBumper.h" + + +#include "control.h" +#include "loader.h" +#include "render.h" +#include "timer.h" +#include "TPinballTable.h" +#include "TZmapList.h" + +TBumper::TBumper(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) +{ + visualStruct visual{}; + + BmpIndex = 0; + Timer = 0; + TimerTime = *loader::query_float_attribute(groupIndex, 0, 407); + loader::query_visual(groupIndex, 0, &visual); + SoundIndex4 = visual.SoundIndex4; + SoundIndex3 = visual.SoundIndex3; + MaxCollisionSpeed2 = MaxCollisionSpeed; +} + +int TBumper::Message(int code, float value) +{ + switch (code) + { + case 11: + { + auto nextBmp = static_cast(floor(value)); + if (2 * nextBmp > ListBitmap->Count() - 1) + nextBmp = (ListBitmap->Count() - 1) / 2; + if (nextBmp < 0) + nextBmp = 0; + if (nextBmp != BmpIndex) + { + if (nextBmp >= BmpIndex) + loader::play_sound(SoundIndex4); + if (nextBmp < BmpIndex) + loader::play_sound(SoundIndex3); + BmpIndex = nextBmp; + Fire(); + control::handler(11, this); + } + break; + } + case 12: + { + auto nextBmp = BmpIndex + 1; + auto maxBmp = ListBitmap->Count() - 1; + if (2 * nextBmp > maxBmp) + nextBmp = maxBmp / 2; + TBumper::Message(11, static_cast(nextBmp)); + break; + } + case 13: + { + auto nextBmp = BmpIndex - 1; + if (nextBmp < 0) + nextBmp = 0; + TBumper::Message(11, static_cast(nextBmp)); + break; + } + case 1020: + { + auto playerPtr = &PlayerData[PinballTable->CurrentPlayer]; + playerPtr->BmpIndex = BmpIndex; + playerPtr->MessageField = MessageField; + + playerPtr = &PlayerData[static_cast(floor(value))]; + BmpIndex = playerPtr->BmpIndex; + MessageField = playerPtr->MessageField; + TBumper::Message(11, static_cast(BmpIndex)); + break; + } + case 1024: + { + if (Timer) + { + timer::kill(Timer); + TimerExpired(Timer, this); + } + BmpIndex = 0; + MessageField = 0; + auto playerPtr = PlayerData; + for (auto index = 0; index < PinballTable->PlayerCount; ++index) + { + playerPtr->BmpIndex = 0; + playerPtr->MessageField = 0; + ++playerPtr; + } + TimerExpired(0, this); + break; + } + default: + break; + } + + return 0; +} + +void TBumper::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + if (DefaultCollision(ball, nextPosition, direction)) + { + Fire(); + control::handler(63, this); + } +} + +void TBumper::put_scoring(int index, int score) +{ + if (index < 4) + Scores[index] = score; +} + + +int TBumper::get_scoring(int index) +{ + return index < 4 ? Scores[index] : 0; +} + +void TBumper::TimerExpired(int timerId, void* caller) +{ + auto bump = static_cast(caller); + auto bmp = static_cast(bump->ListBitmap->Get(bump->BmpIndex * 2)); + auto zMap = static_cast(bump->ListZMap->Get(bump->BmpIndex * 2)); + bump->Timer = 0; + render::sprite_set( + bump->RenderSprite, + bmp, + zMap, + bmp->XPosition - bump->PinballTable->XOffset, + bmp->YPosition - bump->PinballTable->YOffset); + bump->MaxCollisionSpeed = bump->MaxCollisionSpeed2; +} + +void TBumper::Fire() +{ + int bmpIndex = 2 * BmpIndex + 1; + auto bmp = static_cast(ListBitmap->Get(bmpIndex)); + auto zMap = static_cast(ListZMap->Get(bmpIndex)); + render::sprite_set( + RenderSprite, + bmp, + zMap, + bmp->XPosition - PinballTable->XOffset, + bmp->YPosition - PinballTable->YOffset); + Timer = timer::set(TimerTime, this, TimerExpired); + MaxCollisionSpeed = 1000000000.0; +} diff --git a/SpaceCadetPinball/TBumper.h b/SpaceCadetPinball/TBumper.h index ecda7f7..7309c50 100644 --- a/SpaceCadetPinball/TBumper.h +++ b/SpaceCadetPinball/TBumper.h @@ -1,11 +1,33 @@ #pragma once #include "TCollisionComponent.h" +struct TBumper_player_backup +{ + int MessageField; + int BmpIndex; +}; + class TBumper : public TCollisionComponent { public: - TBumper(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TBumper(TPinballTable* table, int groupIndex); + ~TBumper() override = default; + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + void put_scoring(int index, int score) override; + int get_scoring(int index) override; + void Fire(); + + static void TimerExpired(int timerId, void* caller); + + int BmpIndex; + int Timer; + float TimerTime; + float MaxCollisionSpeed2; + int SoundIndex4; + int SoundIndex3; + int Scores[4]; + TBumper_player_backup PlayerData[4]; }; diff --git a/SpaceCadetPinball/TFlagSpinner.cpp b/SpaceCadetPinball/TFlagSpinner.cpp index 880c15c..1b51261 100644 --- a/SpaceCadetPinball/TFlagSpinner.cpp +++ b/SpaceCadetPinball/TFlagSpinner.cpp @@ -1,2 +1,148 @@ #include "pch.h" #include "TFlagSpinner.h" + + +#include "control.h" +#include "loader.h" +#include "objlist_class.h" +#include "render.h" +#include "TBall.h" +#include "timer.h" +#include "TLine.h" +#include "TPinballTable.h" +#include "TZmapList.h" + +TFlagSpinner::TFlagSpinner(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) +{ + visualStruct visual{}; + vector_type end{}, start{}; + + Timer = 0; + loader::query_visual(groupIndex, 0, &visual); + end.X = *visual.FloatArr; + end.Y = visual.FloatArr[1]; + start.X = visual.FloatArr[2]; + start.Y = visual.FloatArr[3]; + auto line = new TLine(this, &UnknownBaseFlag2, visual.Flag, &start, &end); + if (line) + { + line->place_in_grid(); + EdgeList->Add(line); + } + + line = new TLine(this, &UnknownBaseFlag2, visual.Flag, &end, &start); + PrevCollider = line; + if (line) + { + line->place_in_grid(); + EdgeList->Add(line); + } + + SpeedDecrement = 0.64999998f; + MaxSpeed = 50000.0f; + MinSpeed = 5.0f; + auto speedDec = loader::query_float_attribute(groupIndex, 0, 1202); + if (speedDec) + SpeedDecrement = *speedDec; + auto maxSpeed = loader::query_float_attribute(groupIndex, 0, 1200); + if (maxSpeed) + MaxSpeed = *maxSpeed; + auto minSpeed = loader::query_float_attribute(groupIndex, 0, 1201); + if (minSpeed) + MinSpeed = *minSpeed; +} + +int TFlagSpinner::Message(int code, float value) +{ + if (code == 1024) + { + if (Timer) + { + timer::kill(Timer); + Timer = 0; + } + BmpIndex = 0; + auto bmp = static_cast(ListBitmap->Get(0)); + auto zMap = static_cast(ListZMap->Get(0)); + render::sprite_set( + RenderSprite, + bmp, + zMap, + bmp->XPosition - PinballTable->XOffset, + bmp->YPosition - PinballTable->YOffset); + } + return 0; +} + +void TFlagSpinner::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) +{ + ball->Position.X = nextPosition->X; + ball->Position.Y = nextPosition->Y; + ball->RayMaxDistance = ball->RayMaxDistance - coef; + ball->not_again(edge); + + SpinDirection = 2 * (PrevCollider != edge) - 1; + if (ball->Speed == 0.0) + Speed = MinSpeed; + else + Speed = ball->Speed * 20.0f; + if (Speed < MinSpeed) + Speed = MinSpeed; + if (Speed > MaxSpeed) + Speed = MaxSpeed; + NextFrame(); +} + +void TFlagSpinner::put_scoring(int index, int score) +{ + if (index < 2) + Scores[index] = score; +} + +int TFlagSpinner::get_scoring(int index) +{ + return index < 2 ? Scores[index] : 0; +} + +void TFlagSpinner::NextFrame() +{ + BmpIndex += SpinDirection; + int bmpIndex = BmpIndex; + int bmpCount = ListBitmap->Count(); + if (bmpIndex >= bmpCount) + BmpIndex = 0; + else if (bmpIndex < 0) + BmpIndex = bmpCount - 1; + + if (!PinballTable->TiltLockFlag) + { + control::handler(63, this); + if (SoundIndex2) + loader::play_sound(SoundIndex2); + if (!BmpIndex) + control::handler(62, this); + } + + auto bmp = static_cast(ListBitmap->Get(BmpIndex)); + auto zMap = static_cast(ListZMap->Get(BmpIndex)); + render::sprite_set( + RenderSprite, + bmp, + zMap, + bmp->XPosition - PinballTable->XOffset, + bmp->YPosition - PinballTable->YOffset); + + Speed *= SpeedDecrement; + if (Speed >= MinSpeed) + { + timer::set(1.0f / Speed, this, SpinTimer); + } +} + +void TFlagSpinner::SpinTimer(int timerId, void* caller) +{ + auto spinner = static_cast(caller); + spinner->Timer = 0; + spinner->NextFrame(); +} diff --git a/SpaceCadetPinball/TFlagSpinner.h b/SpaceCadetPinball/TFlagSpinner.h index 06f98ba..b47632e 100644 --- a/SpaceCadetPinball/TFlagSpinner.h +++ b/SpaceCadetPinball/TFlagSpinner.h @@ -5,7 +5,24 @@ class TFlagSpinner : public TCollisionComponent { public: - TFlagSpinner(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) - { - } + TFlagSpinner(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + void put_scoring(int index, int score) override; + int get_scoring(int index) override; + void NextFrame(); + + static void SpinTimer(int timerId, void* caller); + + float Speed; + float MaxSpeed; + float MinSpeed; + float SpeedDecrement; + int SpinDirection; + int BmpIndex; + int Timer; + TEdgeSegment* PrevCollider; + int Scores[2]; }; + diff --git a/SpaceCadetPinball/TFlipperEdge.cpp b/SpaceCadetPinball/TFlipperEdge.cpp index 2187f5f..f15fc1f 100644 --- a/SpaceCadetPinball/TFlipperEdge.cpp +++ b/SpaceCadetPinball/TFlipperEdge.cpp @@ -446,7 +446,7 @@ int TFlipperEdge::is_ball_inside(float x, float y) dy * dy + dx * dx <= CirclebaseRadiusSq || (T1.Y - y) * (T1.Y - y) + (T1.X - x) * (T1.X - x) < CircleT1RadiusSq) { - float flipperLR = AngleMax < 0.0 ? -1 : 1; + float flipperLR = AngleMax < 0.0 ? -1.0f : 1.0f; if (FlipperFlag == 1) testPoint = AngleMax < 0.0 ? B1 : B2; else if (FlipperFlag == 2) diff --git a/SpaceCadetPinball/TGate.cpp b/SpaceCadetPinball/TGate.cpp index 658a405..b166c0b 100644 --- a/SpaceCadetPinball/TGate.cpp +++ b/SpaceCadetPinball/TGate.cpp @@ -1,2 +1,42 @@ #include "pch.h" #include "TGate.h" + + +#include "control.h" +#include "loader.h" +#include "render.h" +#include "TZmapList.h" + +TGate::TGate(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) +{ + visualStruct visual{}; + + loader::query_visual(groupIndex, 0, &visual); + SoundIndex4 = visual.SoundIndex4; + SoundIndex3 = visual.SoundIndex3; + UnknownBaseFlag2 = 1; + render::sprite_set_bitmap(RenderSprite, static_cast(ListBitmap->Get(0))); + control::handler(1024, this); +} + +int TGate::Message(int code, float value) +{ + if (code != 1020) + { + if (code == 53) + { + UnknownBaseFlag2 = 0; + render::sprite_set_bitmap(RenderSprite, nullptr); + loader::play_sound(SoundIndex3); + } + else if (code == 54 || code == 1024) + { + UnknownBaseFlag2 = 1; + render::sprite_set_bitmap(RenderSprite, static_cast(ListBitmap->Get(0))); + if (code == 54) + loader::play_sound(SoundIndex4); + } + control::handler(code, this); + } + return 0; +} diff --git a/SpaceCadetPinball/TGate.h b/SpaceCadetPinball/TGate.h index ac762f2..687df72 100644 --- a/SpaceCadetPinball/TGate.h +++ b/SpaceCadetPinball/TGate.h @@ -5,7 +5,9 @@ class TGate : public TCollisionComponent { public: - TGate(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TGate(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + + int SoundIndex4; + int SoundIndex3; }; diff --git a/SpaceCadetPinball/THole.cpp b/SpaceCadetPinball/THole.cpp index c3a5722..c2b7c7e 100644 --- a/SpaceCadetPinball/THole.cpp +++ b/SpaceCadetPinball/THole.cpp @@ -1,2 +1,148 @@ #include "pch.h" #include "THole.h" + + +#include "control.h" +#include "loader.h" +#include "objlist_class.h" +#include "TBall.h" +#include "timer.h" +#include "TPinballTable.h" +#include "TTableLayer.h" + +THole::THole(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) +{ + visualStruct visual{}; + circle_type circle{}; + + Unknown4 = 0.050000001f; + MessageField = 0; + Timer = 0; + BallCapturedFlag = 0; + auto floatArr1 = loader::query_float_attribute(groupIndex, 0, 407); + if (floatArr1) + Unknown3 = *floatArr1; + else + Unknown3 = 0.25; + auto floatArr2 = loader::query_float_attribute(groupIndex, 0, 701); + if (floatArr2) + GravityMult = *floatArr2; + else + GravityMult = 0.5; + GravityPull = *loader::query_float_attribute(groupIndex, 0, 305); + + loader::query_visual(groupIndex, 0, &visual); + Circle.Center.X = visual.FloatArr[0]; + Circle.Center.Y = visual.FloatArr[1]; + Circle.RadiusSq = *loader::query_float_attribute(groupIndex, 0, 306) * visual.FloatArr[2]; + if (Circle.RadiusSq == 0.0) + Circle.RadiusSq = 0.001f; + + auto tCircle = new TCircle(this, &UnknownBaseFlag2, visual.Flag, reinterpret_cast(visual.FloatArr), + Circle.RadiusSq); + if (tCircle) + { + tCircle->place_in_grid(); + EdgeList->Add(tCircle); + } + + ZSetValue = loader::query_float_attribute(groupIndex, 0, 408)[2]; + FieldFlag = static_cast(floor(*loader::query_float_attribute(groupIndex, 0, 1304))); + + Circle.RadiusSq = visual.FloatArr[2] * visual.FloatArr[2]; + circle.RadiusSq = Circle.RadiusSq; + circle.Center.X = Circle.Center.X; + circle.Center.Y = Circle.Center.Y; + circle.Center.Z = Circle.Center.Z; + + Field.Flag2Ptr = &UnknownBaseFlag2; + Field.CollisionComp = this; + Field.Mask = visual.Flag; + TTableLayer::edges_insert_circle(&circle, nullptr, &Field); +} + +int THole::Message(int code, float value) +{ + if (code == 1024 && BallCapturedFlag) + { + if (Timer) + timer::kill(Timer); + Timer = 0; + BallCapturedSecondStage = 1; + } + return 0; +} + +void THole::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + if (!BallCapturedFlag) + { + BallCapturedSecondStage = 0; + MaxCollisionSpeed = 1000000000.0; + BallCapturedFlag = 1; + ball->CollisionComp = this; + ball->Position.X = Circle.Center.X; + ball->Position.Y = Circle.Center.Y; + ball->Acceleration.Z = 0.0; + Timer = timer::set(0.5f, this, TimerExpired); + if (!PinballTable->TiltLockFlag) + { + loader::play_sound(SoundIndex1); + control::handler(57, this); + } + } +} + +int THole::FieldEffect(TBall* ball, vector_type* vecDst) +{ + int result; + vector_type direction{}; + + if (BallCapturedFlag) + { + if (BallCapturedSecondStage) + { + ball->Acceleration.Z -= PinballTable->GravityDirVectMult * ball->TimeDelta * GravityMult; + ball->Position.Z += ball->Acceleration.Z; + if (ball->Position.Z <= ZSetValue) + { + BallCapturedFlag = 0; + BallCapturedSecondStage = 0; + ball->Position.Z = ZSetValue; + ball->Acceleration.Z = 0.0; + ball->FieldFlag = FieldFlag; + ball->Acceleration.Y = 0.0; + ball->CollisionComp = nullptr; + ball->Acceleration.X = 0.0; + ball->Speed = 0.0; + loader::play_sound(SoundIndex2); + control::handler(58, this); + } + } + result = 0; + } + else + { + direction.X = Circle.Center.X - ball->Position.X; + direction.Y = Circle.Center.Y - ball->Position.Y; + if (direction.X * direction.X + direction.Y * direction.Y <= Circle.RadiusSq) + { + maths::normalize_2d(&direction); + vecDst->X = direction.X * GravityPull - ball->Acceleration.X * ball->Speed; + vecDst->Y = direction.Y * GravityPull - ball->Acceleration.Y * ball->Speed; + result = 1; + } + else + { + result = 0; + } + } + return result; +} + +void THole::TimerExpired(int timerId, void* caller) +{ + auto hole = static_cast(caller); + hole->Timer = 0; + hole->BallCapturedSecondStage = 1; +} diff --git a/SpaceCadetPinball/THole.h b/SpaceCadetPinball/THole.h index abfe91a..7171238 100644 --- a/SpaceCadetPinball/THole.h +++ b/SpaceCadetPinball/THole.h @@ -1,11 +1,29 @@ #pragma once +#include "TCircle.h" #include "TCollisionComponent.h" +#include "TEdgeManager.h" class THole : public TCollisionComponent { public: - THole(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) - { - } + THole(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + int FieldEffect(TBall* ball, vector_type* vecDst) override; + + static void TimerExpired(int timerId, void* caller); + + int BallCapturedFlag; + int BallCapturedSecondStage; + int Timer; + float Unknown3; + float Unknown4; + float GravityMult; + float ZSetValue; + int FieldFlag; + float GravityPull; + circle_type Circle; + field_effect_type Field; }; diff --git a/SpaceCadetPinball/TKickback.cpp b/SpaceCadetPinball/TKickback.cpp index c8d7c6d..d422244 100644 --- a/SpaceCadetPinball/TKickback.cpp +++ b/SpaceCadetPinball/TKickback.cpp @@ -1,2 +1,95 @@ #include "pch.h" #include "TKickback.h" + + +#include "control.h" +#include "loader.h" +#include "maths.h" +#include "render.h" +#include "timer.h" +#include "TPinballTable.h" +#include "TZmapList.h" + +TKickback::TKickback(TPinballTable* table, int groupIndex): TCollisionComponent(table, groupIndex, true) +{ + MessageField = 0; + Timer = 0; + ActiveFlag = 0; + TimerTime = 0.69999999f; + TimerTime2 = 0.1f; + MaxCollisionSpeed = 1000000000.0f; +} + +int TKickback::Message(int code, float value) +{ + if ((code == 1011 || code == 1024) && Timer) + { + timer::kill(Timer); + if (ListBitmap) + render::sprite_set_bitmap(RenderSprite, nullptr); + Timer = 0; + ActiveFlag = 0; + MaxCollisionSpeed = 1000000000.0; + } + return 0; +} + +void TKickback::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) +{ + if (PinballTable->TiltLockFlag) + { + maths::basic_collision(ball, nextPosition, direction, UnknownC4F, UnknownC5F, 0.0, + CollisionMultiplier); + } + else + { + if (!ActiveFlag) + { + MaxCollisionSpeed = 1000000000.0; + ActiveFlag = 1; + Timer = timer::set(TimerTime, this, TimerExpired); + } + if (DefaultCollision(ball, nextPosition, direction)) + ActiveFlag = 0; + } +} + +void TKickback::TimerExpired(int timerId, void* caller) +{ + auto kick = static_cast(caller); + + if (kick->ActiveFlag) + { + kick->MaxCollisionSpeed = 0.0; + kick->Timer = timer::set(kick->TimerTime2, kick, TimerExpired); + loader::play_sound(kick->SoundIndex1); + if (kick->ListBitmap) + { + auto bmp = static_cast(kick->ListBitmap->Get(1)); + auto zMap = static_cast(kick->ListZMap->Get(1)); + render::sprite_set( + kick->RenderSprite, + bmp, + zMap, + bmp->XPosition - kick->PinballTable->XOffset, + bmp->YPosition - kick->PinballTable->YOffset); + } + } + else + { + if (kick->ListBitmap) + { + auto bmp = static_cast(kick->ListBitmap->Get(0)); + auto zMap = static_cast(kick->ListZMap->Get(0)); + render::sprite_set( + kick->RenderSprite, + bmp, + zMap, + bmp->XPosition - kick->PinballTable->XOffset, + bmp->YPosition - kick->PinballTable->YOffset); + } + kick->Timer = 0; + control::handler(60, kick); + } +} diff --git a/SpaceCadetPinball/TKickback.h b/SpaceCadetPinball/TKickback.h index 4e72835..4c610cf 100644 --- a/SpaceCadetPinball/TKickback.h +++ b/SpaceCadetPinball/TKickback.h @@ -5,7 +5,15 @@ class TKickback : public TCollisionComponent { public: - TKickback(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TKickback(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + + static void TimerExpired(int timerId, void* caller); + + float TimerTime; + float TimerTime2; + int Timer; + int ActiveFlag; }; diff --git a/SpaceCadetPinball/TWall.cpp b/SpaceCadetPinball/TWall.cpp index 0d082dd..4cf139f 100644 --- a/SpaceCadetPinball/TWall.cpp +++ b/SpaceCadetPinball/TWall.cpp @@ -1,2 +1,59 @@ #include "pch.h" #include "TWall.h" + + +#include "control.h" +#include "render.h" +#include "timer.h" +#include "TZmapList.h" + +TWall::TWall(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) +{ + if (RenderSprite) + render::sprite_set_bitmap(RenderSprite, nullptr); + if (ListBitmap) + BmpPtr = static_cast(ListBitmap->Get(0)); + Timer = 0; +} + +int TWall::Message(int code, float value) +{ + if (code == 1024 && Timer) + { + timer::kill(Timer); + TimerExpired(Timer, this); + } + return 0; +} + +void TWall::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + if (DefaultCollision(ball, nextPosition, direction)) + { + if (BmpPtr) + { + render::sprite_set_bitmap(RenderSprite, BmpPtr); + Timer = timer::set(0.1f, this, TimerExpired); + } + control::handler(63, this); + } +} + +void TWall::put_scoring(int index, int score) +{ + if (index < 1) + Scores[index] = score; +} + +int TWall::get_scoring(int index) +{ + return index < 1 ? Scores[index] : 0; +} + +void TWall::TimerExpired(int timerId, void* caller) +{ + auto wall = static_cast(caller); + render::sprite_set_bitmap(wall->RenderSprite, nullptr); + wall->Timer = 0; + wall->MessageField = 0; +} diff --git a/SpaceCadetPinball/TWall.h b/SpaceCadetPinball/TWall.h index 8913f1b..01c0ba7 100644 --- a/SpaceCadetPinball/TWall.h +++ b/SpaceCadetPinball/TWall.h @@ -1,11 +1,23 @@ #pragma once + #include "TCollisionComponent.h" +struct gdrv_bitmap8; + class TWall : public TCollisionComponent { public: - TWall(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TWall(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + void put_scoring(int index, int score) override; + int get_scoring(int index) override; + + static void TimerExpired(int timerId, void* caller); + + int Timer; + gdrv_bitmap8* BmpPtr; + int Scores[1]; }; diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index d9bcc59..caa09ef 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -17,7 +17,7 @@ HCURSOR winmain::mouse_hsave; int winmain::return_value = 0; int winmain::bQuit = 0; int winmain::activated; -int winmain::DispFrameRate = 1; +int winmain::DispFrameRate = 0; int winmain::DispGRhistory = 0; int winmain::single_step = 0; int winmain::has_focus = 1;