From 65c5a742accae285e41963edec00ef4c255e00d1 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 12 Apr 2023 22:42:22 -0500 Subject: [PATCH] Lighting math formula updated. Moved rendering order so bullets are rendered last. --- Faceball2030/assets/enemies/bullet.png | Bin 26472 -> 26093 bytes Faceball2030/main.cpp | 73 ++++++++++++++++++++++--- Faceball2030/main.h | 13 ++++- 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/Faceball2030/assets/enemies/bullet.png b/Faceball2030/assets/enemies/bullet.png index 80784fff8ae4b3e56494b2f16aa4f2621674f7c6..5396b21d542376403ef72bdeca3d925c74030b74 100644 GIT binary patch delta 22472 zcmYhh1yCJL6E?c%;O_1o+}+*X-Q5WmBztgo$eR!}KyVB0u1RnS1cwCo;P&(V_g3Az zQnl0D-80kM+w=5p?@d6Cze7^#pj^Fa3{;@$2Xnz1x0j`O7w9^D_P{Q23sTFSBVvFG z!*3sov8&*tZ#r3RZ`soUC=Rt!!1K#X$BE_3y&-b7!hfoV^DbA98SJLyk0lS2lG{%t zA@9NW4@~bvZ?M(_)&1wpLuuys@3Ffnxg=&U=7S!*Q7=QfPdxFC^IvkFm5zD4JhARBUnZ00 ze@A(KCDue8yL41J=Y8pRfr2{!qK>P(eu0pQ%Tm*fi)*!@Yf))l@P1RvTE~_3G;V=$l}Uq#gYDTwUj|Z- z_-!vS?*!i^o5#YEL%zUBf2e_l{rtRvW%F>dsQa1i;;R38^9Tx(At-W}sjDga^oxYZ zuw!gB3?>igs5Q-cSdL(AtUjLIm^${|PQ(7MnT(slRa-*n*{#iI_yiEOxaff*=~ zZr?tg((JzZKIX6n>(Qf)VEeX&`Hh(H2h*U>fZ*@8+xjxL8_T7iO^-+&L!gT=)9lmN zKhG{L`Nr<77}bvTn)slLb|~%r?cF}zb)ntOf3+v4@6S3cUrwca&ZrZpHHZIorG&~P z3v$@t*||(HZ9zEE{1zzA8g=U5uR8w}{y`|z(a!U z^lsb(=^rirE+Kl8sNz!aD(@$GMCI6vuD6x%q}i3|3KufQ1jNz{a$T)=lkRvkvP(WC zB2EmM)mkPBV0i&ka7#WI;+UyOB1XEyB>qDS-hzfU0^L31;7W#=|9HOvbsy}S?QbiU zA^w0++t)$9*&M>ZHWUXHyMT0~o|EO1{GmY-_FYPo zJW-xPp$U;y*jjei{>G{b)ZvGm)g`whfPctp?qXPBE&q2dm#HIa~jyM7nJ&Dxa?V_la@| zIy;mU`;M?F;G>H$kW#`&vAOz5l(PNzYEvn{7}w@acGqA%(_p;z;M6&;L2$}90WAjW zmPO;wZl3J8PhPs=IfKNOHs+la$(?5!-E_xtbDL+p_3g~>u-Vz&Mxi{JIZ2c0i9fBw zxc`NREQ0&ab;yw3Poo9(jolx4A(~?IH#q^U7d{{AWuqM+u|%AJ@EI-k$h$g**ydwF}-fSa)PbtZi<+bsu3QoI1|Wy`?hW{vVSBU zv`mEg<;PCYAB~(y-Z@E~X~sj@9Eo(rZI440jzcJIpL&t;q{s!VZJR%1V^br#!jY4! z5&!k3{_ZTqSqP%#qh1w9Ckn$o(#8GL5aMbfu1nEVA>c5~{rsU2WCC8jo6{=wnDw!`DnXa^$2FdC**qd@>l6jgX`awHyCF7&{??`N$HjeEc$pk zvE>Un7p3=&N!a^(-#xhM~@#6Dfqe*cQJIqD>;fK#)JA zGa(A`sGTV4XL)_M6;?MS!}3~ z+X?Po9X;E%feLSd9@V8#Be6W(ZyXV^sWiKHv~rYcBUJBr)jl_-j4;~pg>ee=WE*g> zp(;uK__+UpD4D%)cRSX(6&`^JZvdQQ%}E%7q*y^0kS+VC7tznsitdf_5e~IauuOwT zC4$)`G_Y|8bDSs|28smuPWG2%*|;f)Wsa(*N6EaQf;L9q1&}d~cPqlFe7ZB zm)KGTaRKD4(A2^4!Y+|V90Y?;+zIlexetXYOpUiXvxJ!`i0zUpYxX)bM2}6&E*+#U+KfEVAQ~{859aqD9RNr?RPR0_ zJ3Y>=<61WtV>oS*^1_{)W_z1|!97!JEx-*;NnR@GzgTi-aZzuG$otz=3*}1{N)P|gwA--tMpUM*7@$-?fa(vbZlaMqZ zT>Wp|D9ICH$yXSx3Dc40yqQNSwJLQh`e^Qq=F8i%eqZHn(IEMfz8EjxkH3FKm2T}I zg(DY5$Zw55BAom&uiOFsB`lC{CPdQy>tpy3fZgi~S5W|=tmLGSa<$4*W{t(b=|n-0 z&NLG&a0|0P=YNw_pJzA2Vx%$^l#ZMsAp8JO6pEljcQk(>IRkDe+NWpv3|TH9`rrIvp5aQ631tPWtzBO{PWL?;%9B@$Ke6U< z$1QOV3U84s3j;aF7opZZr~6(;b!2(CH6u+QU=_k@Nf?GWyee__@&plh$WGq!X-;28 zFbAo3SgxGQ_E9RW+BWdWhC%X@YeN^fFX5lN|rA9TL>M$2(hETlh5Ez>k^(>Qo< zy@MDz5rGg&`Mp&4UFum506}Q3&X)@+#OEhc>rq14 zb91?Qq4Lp)9KZmOI zk8>rXw_!iX;e7M(BuTlOSUOYLY9|p+>;of;*)q~`>ib)6pfqTGo00<@ZC&DQ_1(Ji z3tvZtq!D2ddZqaP%(K(8ZkKbo?B~hbS#@H1GyL(qxnSn-RwF^O+lymD5Ea_?jFW7X z5yp!agZaxGVCXyC591mdWC6WsetKrN3nc5PTnTzjO?#y$6*DS*SLB`?ZzKXH>%nw1eQ1B zJqv!>f1l9)oK>iS^C8jBN8iR@6?_D+D=-{0w@D%pAa031t52?YAi02ZsRe70TK^rmT|1@t(td=8Z zcd1cL4}WOs7uaQ+zk6F;kavN(3KQ3;ulvIe=gcy6!6WJGv&@%grnu%ZtB-4 zR$6?KIk`EqQJG6AihMXI!uB7u3z|2`gt3)Kn)nd9K@3hK5`Ma@Tq_rEu`WnseTWcF zS<#F}P}5=g1v2yJszvK|`mNsD^wZ_AjRaJ~yxuuv6y-a2CevFa%)FWg_K?x`k>d=?&8?zvd$uF z=u|JvIGmZHJ|<*9+>NHHgX!#|M>C^!SXbX?X0%s^F$^h@fTuAAh>b7rv&em!(k+c# zbWTDdD>9T29;y(Kjd}1_ZAWgEQeqw`=e4l2;kD;6!RTMnl_YC1tGM2fx3sLi0)%3{ z@pJ4U9|`odr9Ru+1rg99)^eRY1)@p#Z_=;+p#k`J?mq)*BTf`B{sz@zE>R4L^$WR%%l67g8$^?#l z8ph+e&P{7s%9Ow5A0aHK+63*YFBYsIm$dw$2HA02mOV!85jY!!#@tgy^f+6`OekgT zodcSA8F4*{2J|Im>`0o~P?(v2Ej#CvH1BfuU}c+PEB!}*w~vvO}X&jM^f|x zO^YY91dWj}{oxWxgd0oojmFZ?14aJQvo!e;d(A1wvT1cz*)C7MCGpG?{vv?p6~$U| z7vB!K)P!e1F2ThP=RfxB^i2;R6%wuZ_#e1YNlaAfE{8-fldJcxnp>~DI*@-f$M`&X zROVoSMWCJPG^ZHxebx~CSI!OZPZ@0q65`#)NK)wI(>t`df|Y7;0gd|1}$GijU{`r6_z zF_y4vB^)s|UCE=`A8x)DzYE*zT;G22c|HnD7f0c=fD5;FLgK&`-6TLfqjQgNV0>F| z3SWn<6R4o8O`(mYq(}{gw+{7MHZTT-8qveQi?7?3R1Yr+SQW5MnII?|Gfg+MZSlHkyhE{yZi%m*{DL%6rVTv19HQudy9eNj=k4 zU?PL*<9x%Ec6FI!f&LlSk#}e4of$I~It@io>@RkwMP>hr$WcJpFnTM?P*iPA<8nr0 zR>zg)7=kdWqwdK{RW={N;3hUHOW<*8heh-hea8I7LawA@}0wZkQ{cSn#raPO= zwQjPIV14u`tKBRWDU%$xm;VL%Iie6wCqJeYppG~8( z;KT>ejAY$Rn$l)Pr{LP)1C_ZesMP1{;sq1MMsMM9xd|$S=qa57i8vNPOJOYx{|GZD zy8{lc0feC5PteAKiSSh#k7B-5k54ZB6|tZ2I6+qKBly(NqXbi5BQ7P`KvGKp(ab>} znW9m9&OA4-BtoT}cTsdxku_xAyWrol_3w1V`Z!w&=ZLNIUzjI8c;E6{hNL|ZpCnE7 zjFMp7W$QHisX8?E8A94%9%5t(abYNny`fZGv+UjUhr-u76DXFZ>yS&C=rK$gFMe2(K497L(v7h(hoG%7V^it9&&LNKsa zN3B2B%)}NW%~hXue|djiet^BN))j-)UaNB9q><1}t) zoQ>u^W9NK2m*jC5av9YLU_7t*T2n4o;$U7zuC;p}QzB2#UupV#8!^ggX5lJEhlxH` zV91)|b7Q5_uftRjc}@rga!|Fay^ltXd$+>&5@vNlT`47z*+pA zV2t?EGyqMxOgoh!8@BFplpIOofd(XTM& zQ7Ai+$I;0zjlW?$GH2fl=aeI}{=voCN6b>%2>2yu#>qp5;_qrmZtAbwm42pDtJW}Y zWl~YR^y6oV?0bRZkrKY_>z(PG+9$5((5T#L@-lp@lI0EdKh7o}uutjMV8mB?1>M$o zsXu~@0`tCUfo}SyDqepW%;=IBQOvGrwmu+P&e~|&Z2d)*r#9`ZP}8A9(2+|(wb!Cj zi^^oXI*?MGK8%!5Wg_7-KvFREwxi=g^Ti<;wMxz&XOc;kl7luU(H~4EjdCq>;CR-@ z$I+e?=Ee`fj%^3%<9JR+T)jr>{(!OVwLGXHn(k zsct`rn;s1KC#t^DgU@5gkG?<@G{z#}M6-k<6Sg_a3i1`STVYt1@NA^I5QqLrD7zR! zbY5V!?ETWk=c2}9X>~g@ClJZYg(KHb-tYZh2gkWJo=lg8=)NOf=E9f~f%6)8leO-p_5mG}8^_b`Nh_uOz+v6`5-xDH(XRePO<4w3l)a_j? z4SqytlZxR=j(PD*-+aJ(7dZgAOw*?t!3j1pl=s)BpTh3v>XdFl)swx-SS&?Puo+Y& zOG#lR-?4Fpuake+ZinQirT##i41%1G3WUO_0YhYTrLdrCnj%11Ch-J zp}UK7gZamW+6mmSOy2U)|5{TH?k~jM`7hGGuzg8ZQqf9Aa}Cclg;^`8p-DQsq=LB= zEY`Z>8Qx`02wMrJJa6LyC~QB5NHe!C`nR*R2P_~PI@`y^l~aUo7^jpiR}tRQQ&FA(hjXY`|)J6gifxN1MS>ucTY2t#cc5pZ@B9ef-4MD=@Ac4!&fGo^(4_N@sgJv`ftC|(v6kBo29Fq+HuE-8u4x5 zmBC^fISgabVGX<7l*Dr=pdbLrbwydI*~9J8uE5?9{ejBvj@&A)w0vcDk59;OLH!0} z@+WAgCbeml0!SB2A9Pnjy6d0eh4YY0{a5kL*4?jBV^FBE&!~>^;vJz8i9d=xH)XB3 z-dr>*3c!gVmsMf#buM;^Q*VSZ*oX1WF zBQaaL%Hm$A8_A}5G4)tck$(^S+I~V50?3f7jmTKhr5r{Cad){#d#x#~yJ{qekcHn; zY|*P+J-d$yI!q&AMwo#g8_^`g{TG!xiJ1{DBqg2bYyM%PVTuu;%DRlQbWw%j(=%@K z4>;y-ltm?u-|yoi9ymcL)I(?BXVF<0G(Ti~Vz@H&OY0)oNfEF}Ksn6WiDzuXNEo3W zRog|wIr+miNvoNO8+_0<>GF4Shj{EK4oH3!LW-%5uxg${AS4F5D27Pvsnz*g(J2H| zEEcc|6;2>wEBCLUQyE_#Q$m^Px47q;>7K)6W%_8SsU#m$kK^7wRf;?f=XC^s{ymih zntuQ9#fn`Q>+LY!t=|k9abd2l=PJSnl8^eo^|T?{zcCF9P$?YnZAwLMt_3dwF^{V= zO0DTcZb}D~u^TzSCFG-uv3zozl7EG1;faC9#DjK2So8ihA|fG8sW7hn#v{EhT6s?` zvZr4-=@M&>+wo{gek$^@h*>n>n&3hzMFbjWhgmFqj~xk=Q`MyS?^+VA>6M-m{EzqJ zy_H8}vsdHsr-nZz=N2!g9NdWHvR6=jCQDCe+3HPs$P+mMnezUz;GDb15e+lcX$+c8 zQfWR6aCG`($tet>f(vVD@o`FGN`@IkcBV1oy|WuM_-v`y=x{75Vv{&_*zbM`i=e|* zKENmRNpeTy?#=^5>BQhlt54LkAlq##hvbN#bU4o1QdOf8#0gy)*t(}o2~iYyOqz~i z*^YZlNquv$9QXqSraRLLgu`Dd@zV3wg>jE2Ms7(9eMpX}Bn`3hvX5wvS~Bv9T#}FufGd;76Xraaz_c4^DeomkDJJuoj7=q9r zb=<28?16%isI4kmPs87>=#BSN!X(E{opkTco)X9H)9GkEi#=kApbIS_R`vwsHzqE zrmkp4;NdO4rb1Y@X!Kiqouetv;^$NG7JS`F}H zZ`BJ3*Y#v=XCx}jc=^uE#FIoWN^?2Df|H6)NL;_ITr)BCokV6420FnNUsF6{|Gd%n z0NRHB+sXJ^d##R47M}tA!S0d?IjrURwX=;-?Idy?{l~nBzJNY{ABtZj2bXr# z3Tj+_Z@~5I@}HDtB%TiFo$S1&<9F}(!~Vv@`ow6(kX~JV9ZionhN+!fN+BQt`Wck( zu#K8{IxQQjyQIp+C>x@txFnF~v^O2+&bC`188CkO9v*npYhD!z)1!&&8(PO;eFHcY zQH)p7$?ZK~-lpGk_|l>b2J_3}G8u(X{(K=A-=1QVeiGdp7Re(|y|uOe_H{r@`^ID= zvw~G#RU|kfaY(z5)h5Q+nXy0}^j;&{m(5;rQ3(Ers{3r-d&Xi2Vu~EdHml1e&lu!Mrr#8gBH7a2>I*~@z)Ln-%e5L z9;HDRs@uuv;LlWF=Y2Cd13q!?!C(Bu`8;xoCsD;XX5IZ%wg8$~DKGg=ZnVqV*yBV8>mAO+zJ(D26Jg z0(Y0NWlBrF&6@cn!Mm~!6q!P7oq4k-%Kub(fZRm$_V@I=dg*pHLn|HL<;wBEAh}d*vyM{*ryC>jiHmYQeTys%x3#=L%F1Kk710<|_516vdJikBVjaw5e)* z&rnVMkFx^AcgyR?IQEXn#@h-L^U*|eb;Z0Dgd~ove*~#&`6fTM!Bj~aCB+eu*q>8d zo$4_z^D5{5#J&}$as3c~RU0~gZ9a&EBYxr>}4a?N}#7m!E=PyAlUM5#LY!^81Zb(1bGY^;fGnMn5niLy{r8n#ko*-?Ub+!-r6+AyteyW_ zggXhc^271TtzwFBC0<}X9h&tfhSy~z+hXq1r=E`@r9YU_G6>)}!&yM|!+(1j7V65zFln{V>(hmhC1N8?6*7T6|?#UHS7~&H?;> z7IcaLz8)0~9@mXcqlwXRl#^T>GxwwGY}W-NAcO@3vL*)TeNo7m62|kQKp!|uXS28= zq=zptp;+68mzf!0w+htgTAok1iYYOuhV#LpZ<=HV?@{{*g%MWgv%u-AApCR{dvr|yWS@Kr$L+g37iUQ~#Zqz= zj)?S&cjjAsoyn21Y;mkIE)}c*&lfyZ>bs78+y55nHKMJ2Tr#X>F5Lc77Pe`dZ$H!% z`cUpQfpc=-ALRBt#UILPbA?*G<|G#9`7;Zz@V+7>4vrpf*dF-Ola+(0GG7O74qUON z_SJ-9zh-pG8fIq-WioyUiM^GhB|QD+FF!|be~L;_mclf&C&$pqS2{SJ4q9Jz3iNoy z7pP*Y#EWQR(VeD$q-hU;sV#3_q2MT~Cw1VwfPI|v9heA8~taMI6VmS;2$vU^WTuS;CucQsKAsPP&gf zwd13q9_r&5ywDka(H5yS$oy^H#5A-SNHxmcMe=^q4X)O$zVK**SzuPkHeR>853Td$@e$t8!5iYGy;G8NKkWu`(5kt1v5n^N2cR z!7DNO*&!7fu1C0H_KDlsW;=`&(j@vakUApTNmLri^Je;;_L-Dp>2B}x@rIA`&>BmF zLDNPMlaVJuS})k9%1=%BEod!hMnb=)9c{-2%R;U_tEEIanX6o9FZ*A{49;>c74&qQ zf!RH+yT5>x%=c4FbV@`rlzHKqHd2RaIeytiIwmS%k22#A;y12+HT*IH-+7n`7~2(E zfw(7TjnIs!JMZyxE3>z>CAQR3q@t>MIYcXUxp^*(&i)5$RhUOCj%x-o(xbx3??%rR z3k=a>LuhmcOInBMXfBaGYl%4oK9PJgB`6`E#5@_kxhSuDD((7dGO<-zo@OYSI zmtMAiTgLYiWZx7pSr)eaj;S%A9E?)qN2rzXwr^h)JTpl#QZ*7{V=bHZI#@|%MF#ae zb?F!XHP6p8m%3k#tNE74XuLU)kXro|zAd{D7RRxbXj}Ff<2x6vL(>NDvgaa$3T@1k z?(K4&ZsMSX?6f)|v$fIHj(Tn#lE5dIZru)3!8(OV>M3kr_Cf^y17CvEOfXqo?O5qZ z)s!j&F+30o5vlx`=_oa!q@J4ZH^KkK(WABo1Jy>IgD zZdwdPr2j)PcR<~x`l#3SZ8I0uK&7?)gnobOO6lN@G&=^xy9FjGj`06(cPU(c9ekwR zB0=vOwzGQM?pwq%c7#F9BL)`pzgF56xJu!`+r`Kc&U{KKkWlPLh?KDDInAap^qs?( z|4(0VrY79iOslQpF|h^Xce|fFdl!Kg?QyT(=+P>TQmsf9{vHZmrpM);2dsT1lkfz=VmE+@eX;9*;rU9LJyE)9OsMC41(jBI-Zi z8WkLB@eA2wvj>|WTZnfPr{@%qawt45SHXNX+y%_CzRmJq9tVdLFs#DqgW9sUI zN27G}hJ|d@=|wi^)Kz0;dkkD)!qO_QVRE;o#z$(I`$2rnhm2n;Wi&5X_sO$2;oXa? zRK1aHg{rvCbk#}gXuwTk`cVnr1E4>WO61 zj8y2|Xl5H+=nfn4&HO8UiTs`pDx~E-%)b!$Q6dn_X$yeiCS;3?O?ckH{K8n`GEeK+ zF(xD}$z}u?NSLLVHa?^@1<{D}fArq!g>)tIz0;aC#t|N6fF_VfmfHA`MJ*P zzZfG*%3<;ww|jvRi+J4+hB#(SO7lJoe&QNEB7T0ptVE5? zG2sQt6$@aG?4AaNLcd6Ex&2iWNP{msvzRwcA?HuM%uYd1iJRrt>{}ljG&cAcEih(e z*q>X zMRppqJ3RLm6OR7VaFEUQ3nMGziFKj)JZH~}y$KQoj)=Pi_<9kTyZu?;l+FEk1&Lk_ z4IYB>j}A19!WB0Ui}~@VdKgXr6sc`WiY!3Hj?+yz1vQKBmXki<({2}u92Q^}lHB}Q_ENmFQAY0Zk#@e|^6{!^ zm(~FnjUWb*%*vc8e~Xzr?_+(tblWX{EY7Wz1PQgmPme$I=j|CNyXP62#aKJ8(iMI^ zF2@)?_}5Ssfg(0lgVcxG&TLg){Gc$fd%&~$Sa5w$?_NV`oI5q%ezuFt-(J(VKg<>0 zJDJrtQ_NVMdwM8GKY8#C-<++u#&B#~@S6ol97nN&y9Eaeg0rXS(-70gk~dgl={m-p ze=SHtpP%`IA>zYVbn?&KSR~^-ry%@ZZ8Yo21*d|tl0JY>Y1Tj9zh^v-Cu(9kTnB@q za}FT}n<_uoVbv7z`h(PuvsT`k1ea2Xu6ElSDRTjIibW0tnz}3|6rT$yrUiD8NrO9h z0s=aL)4w)DiPixC66Gu_tEDU}OYP<3>EP^U4*-EVp=shu16ue|nzQk=?3n)8-lJL+ zgW-BOisd#qY?;k6m6(j2PZ5k5%JB(B8zx?7j`ar{TUC`2mDI@3u-0}V=60pH8-^%C zZi~Rql*<$0&HyTEzDhNIxC~f@F{mJdL-h7ezy5{*61g!TWP{6lW#_<+HhJG(s!`GL zX7b|Xp+QEa&km+ZpJ&@{jpK1HCb8@k2Cs)~9pd>$!HME`!L{pf;hH+=v)iB7ik zPt5zH5u0EA%21VC+2HITj{N)^%h9$fueGfzgTty&&F6kAY11*U+y!J@BTxpHIW|>W z5kcQ5cBUrHhE{#o8|$TRTQg0S(GVe#9IZ?`YUj4^W#h)}=a$|Nb=2XoJfh#v#0WtF zVFm-uJt^)Te$d9d(y!^&f zVmC7u`Wp1f^<-svS11(tM#oqAhiqd5o0wJmx_zYMp?&w-Q#1IzWU;hQ#|nE75&&T8 zH{kNeL+J%=cx}0O9E92V__^)a`5c7!*sZw*Y}p-zxEvhpg$4NR`M5KB1uM{b`31Q7 z`Gxs-1$c!r{Dr(xdGvUAL|zYGzKnAr`u|_Efl3$ylA$haM$a$A&(Ftg!_UrT>%ha# zXJakME^O@}$ZpSTYa?i5Yr|{LW0&z$SpEMK=5L@EaY6=L1HGvM06?@+Rg?o>{A08fVj$AEj7fWT~V4@H2O}t+&cPGIQFAuxByZKij9xi|la2Whs9O@jL zo(x2a{&Pxz_(~EXda|#7zPr0CU34^hUh_l7L4Ku@5^nS+ko~3dCqnFFM-%{j#RAHQUOW)QTXa(|ul^zc zTztDQ71(R{BxG-ScD*V= z0lqIimqdkt3nPyXL1dfv4ag7x9Sy*lyp?p8vm|{}^JroRcn|{DCwKov!z$UXXFEQ7 z{R?de0ACEi5$`!D5=J5;bC~vSe3A$X>@7oDx8H<*EztU=0b|FIY5-C%TP?r)y_g~; zmQ9BqZgIi`Q({1-*x~y9A4x;f`IhH4835RXfCUbP`34A2N4v?GxLriZP}tOK*)thz{yi?AFUO$!n*PegG}%MXpTms7Bwy4JR0l4M_O`M$OOb2yI{AC=y)}($IXN zZm}SDdV2Dp0H%uJ>eyPFcD?@Qv?({9u;_*Ix9i%&d-AMxQZ&_onY~{C2@j#2JtJN3fp!Ggs0;}O^n+!?)#Jm$O-tZEFA{hY zf|s(92QeI=*BK}yc~bO+(@F4~++Dvxy?y;vp?B^neDG@iU+4fks+_Xm#@^v%yzS)3 z^9LHc!+;MQNaV(ks|o;hIUIKVvgP39DoX|P@w3H(yx-G1A0qg8jv4TKe)%n2-M>)1 zkac;xr*#)uDGhJ4iTm~Yyp@+c)48{3cRcX_OfbBj8j`R7V}b%g=zytw@n7MWY?*fk zKjlzq1(P{sZ19y4CLe<^hla{i56K@J4=@iLRFQqK#b+<`97x>p`b=F#vcb z16=Z-Qrg8+8?d!b==)c;DBGIB+`=v5(ZDV!tU(E%C%jsR&kpRxd!w{JABdPdPN)s*()*314a- z4`6Rju)&fFM51mHQY8FZGzL1#`&GJPUm0}gl!WLyUhYcZmi>a`k_U+AnT0yU>nQ7M zUv3s&%wHZB7W1Pr_pY7@f&mUZz(q#d9oy&ythsvi$-R6(hz{i9nDEHgzmMYyjzD@6=jSqHDLcq0J_ zu<@ze@!5-^aKowJV%!~ebsRpY3^JIby^4g(_ATr^?YS<#yq~)_Jc3{Yj2H+Y^U!mm za?tDJCz`QYeK2s{pR7~p`2&OG?Oxv8+?=jHm&GParQq}^!vOSS;Kx0_)W1=YD`r^H zX}~Dp^%?L&QcPKQXYYI~a6kDjF2(9KymJ-&Iwja#839@-pHx2~mzloOv^JdVJF|yi zK19&vV8`CINp%z|83+IcrKU!okAiP3HZt1r&lWo17C4DS9zv?uA^-pU6m;&`^`u+-p{fGTD$bXAdk>TwKu{559l6{_nz#T;ehT2w;i=Y349+#=u`id$s+>;-bSP zT>3<=Z$+cG%mWF)!T{2Wo(b0jt_iz8fV%FZZ%`nIXWF=BiO&!vRG`EhmQ72-KQ3<4 z(6i&IOp&xJ_F_p2^@Rgsy@XhPU;zA4%m?S)MOjeQaJe1F*fk60!r?tCSQVy}1`+kv zA3pYk7j0?ITyTl1uo16-43MgxE&ZQ|IgXp&nGn5v%Ip?sy>?CM1`i#HpWw8}fn?MG z_w!`4LC0q5X;JvOXLJA_Hp?M(TqfCmo3h7KjK7jcW3`IGb&o_{1&7Ujkni32eyFC; zSg>~io|^s@FlBTlfcx!$II52?5j6|^t5)n~2q^R!Tjnq> z2j4{PU&1rG!VBPw1~}3b{P_*!FCYlrOS}r5K&&|7|GjxO#6;Dmkvd1RG6IZZU|=c7 z#q6QQlTVZ6D^DSW+D31UR_F)0f(u;47FI7lWWzjFC4Tt`4ZbO8ZnEJSSos2X7Stu- zYKSIxjrpb$!Hc{2@)V}s+FAA8h!kB7sv~d4t3lE%ErVaC>8lL;w z*LMbw{MBnbh=316>Vi_6NLD$u+C8`8oCQM}(CT)C>6BY`$6MCd0k*@{En)-`{m4TI z{a0o=jkJ*lp%z45DLLbOaR36{03lRpwc<-PIC3ul>j$x5Kq@hOO%U3vN-3ZW8Ty^; zj8Z@4Ud@pLPM!*Y6vz@AA%(B4hF`IP|8M&jD!e#q_gKhl9MAAW(#e}&4;I$;xCLOW z;~Wl$)7ScFTLz08D&TkXYdC;t4{&2&51yCtZ3=%UaN1Xh{)!jt{;**a=MED+R)e8u zuj#;|KVpF?AcO`lDJl7Kq&^cI)F+bNxhJm-n6Usm_zew94*|%?4DuGLR4`|#RKns- zUe{yk&UyDjVc`z%74gpw44~JS0=5UkrXV!|IbuivXm4a8&1*hE_%HoGjH^HtTwwA# z>q5Td7?iI9Z};0+XaT|33#&|4$KD9uL*}|DTz$WG8D`ONE3aWj9xrimN7d zk!@~uqh#NWaRwztwB5+X$W(O8QW)zXCEdi(VjV_VGZPGu#AyJDq*qDXt{%^D+wwFP#($~l;j<1 zAHAkgTKY&7|D@SHPLcKMSBwYsqNF^#sudNc59HOw7KOgV}sLn##7Qp3WU=ou3|Kp3$<_})FSML8?5CCUIfc~0KdNn|j?0=$!+)W~g z03$RSsQ<5{oky4QW&~w{nR3rB6)Lj-n*FbJ(6T}t66&ik{XwT(1^3roe8fFoZVRMk z?eu-Uv9z>AXRWMPMWHkXQAhRWo!XvKRlX*`ip_`rCP5hN8E`TUjC#7Dh5j}0zcBz5 zN<D=3EG;*Ek(Um575)hOid`g_zrObh0fhw-b#1j>7Nyh5;Iz#2GcZ)#W<|3s$?| ziT?l4f!1E&fdm9uLu1eG$BY0GUPQ&Z0JFWhNDe=>EAZx}A6&=u$=eJtXn%$rlt#k1{Q5N?0(UW_IPl+Y%NHPI1NmUEok65e zH%PtcG#QzB81wHlffl&3aIhr`$)^AQq3t-f+hole1zIN1So$`8fd(Lr0=!1cN-ZqY zQXvhH9=kqwiIR??Nkf4D5Nz2zQ5~1gC#UdWASw0lT6GzNT7kqq~_I&qTlM z-;2H3Wya$7ocC*liXpxY)3`gH+|P|b3JxhqW}BeF6D2SLhs!acF0Y{z6|*!xys@^V z`Fm)=c|6gTGs5NY`j?mw9>szF`sr!OWy^sYDsM5_YNyc0?mMB9%e;MTCNWwt#149+ zfq1>Ut)=bTcIEXiJGE4(!?1h(Xz^?euc=d@X$r6qFtgrYQ{ZnKKReeY8a6YQ7;_eb zXQ{-_2g8~2Iu{qKLif=f}YktnTju~7>7UVZC`i*m*nI%Dy1(9?>GGze5pb)exXH2>R2pKf7u3=jgO^wiY5 zS~?rXmF(hzkM7${eb+og-(?DEXQH4vsBBNYMEF$Tj~WS(nZ$X0g~QzaJ|g=ZIiB%E zgA(K0xjZBc+5tm5z~&LAcHevJ-%c{t)nnqgZ8dIE^PX6S`1g4SXnd`jyH*z2MI;AB zYS)Hc8fhc^|SZ{>n zdPZQA3~y_J^>@D}nQ_CuSDq=PC=hHTe)9d)faY%Hs@$pfftg9UT_=7tHM5M*8<3XH z&k-99xNtsoh!;YDOFzc|M{khBep{va`;|~#bJ6lpRlN0g=z~rEGi^MwJ=~N8p1rMU zi4o%mwq!`6+=kJ$klhs4Ql{|5LP+&GIf1A_^lDKfNvLVLH;8^rP*&j;^t8cx?WgCl z(c>E=BV~}E(xU^o=Fzjf!0XMuZA^(jGwFYg@LZ70w`#Ho;X@^4fFp23(X!Or^CS-S znLjA&6@FjWbl*Fj+Em;Ze2$z|f|eT?2UsuJP2L;jVOt4{B+CYZ z@|50GD9clD!ZOwCg!C8Ge(}&9?n1K!-u@S>HG>aghB(iroICzWLW46p##}us4z0U~ z*I(z1%ktGN>BG*m{#KP$A^Z#-u3$6U;IiKXsAKx^eu)m5ATI;ZUp7wpRpLD(apbzn zlWvd>lc}nRW}v6@MjZ2ZT}-|gzN2QhuJy%uALd2<`BF`J#`;JJs}3y4>gl-5p;qoo zcb{Q}b7e6Z#%nWPRV%j4tK)$WI{ zZaFEBemcC`xj5OJcfP)TYM7@kSDql~(u20TE(9v9r^(lH*}EpuanXXO1E>gbCS5(el+0+er1a#|kU6yX|Nn*USSW}+}44rR%EVb|J!C*e!9VV$(c zhdO?uMx3Bn3HH1h$zqZ}-?=n^doG4z_9$P=yP@Vf+c@V&*zZ)8k!i!~nQ~tH3nEwD zc9{tvyo;Ec?*Hi1-?m0>B07>acgs6C-(2u%00x+_AJzPZm1~c74O2I0IGxLL85`T= z=hEhX`4x3+K(lnpz&;^lF3#k8s|Hajht^OlNYL(r?_AEjgMioIw#La2L&QGikjv?M zKBC>~%-H1({nX_*YF_nK3$%b_v<=74j=&>{)s+;le3-zi=PcPo`7wVK5YxqywW)M& zzTqyzw-FiW^6)FQw`~s}w1Ah&rQ~X~BG^G>BHztY*q^6gErC}Dr0YUYa@%RlHYzo+ zcS#s)(7QWLgYTpOa})m|hTTRGqS%ADbU;_*8)cCPZZ5jHi+DqD#$B>DkgNrPnwUyI z%gkVj-e^o&<1%|+%F~IG=7ZA^^YO%gSMulFWt$NwZ#k_VxsJFj~~(6eE_;y_s)HMn(jBS=mp z(4A+w-VjLUYxeL5dHEf7>OVaL=U0j&<*AeCT4B%vXIyb+dOTc=h#(^};tlq&VgEY2 zG$g;&c1+R;ef**34geIqXW5CY3#^ChC0e)Fm%6A?EMnN9^>Q(@o}ubpRm2*`QL7Y) zFGHUZx8KLO7e40^4dShECkcMGQ%jD%hut_Gy%(_Rr0WGAW6nx$;gKz#-TQ?SBJ(&J zlX-JypZdcIf3tNL+>X8HG!X!=EFNN_(C~f;Ll`FI@m39}&NGXzal?BV7RVFUmQ6Fh~AE@SQ8wI+=J$s2(0P~f}e z>08us6rwu7@7;6ThN6E`UMSoG^@Jk0+qW^6Sdj>ZqSKd#g$(kK}ba z=!!``+p+5pRRkiOW<^QVPI6jshw*QVZ2hxPPZPUFDEtZkI3{{45P5R!T{7gZQgR6bq|9(->*&Cgfs`(8Xnh!^1WH^BO?4XUB*zRVE1R+l zY2zDNd#;%8lG4-Z^uB3{)qIH-Mb5VY?O&Glj=NjI{&hiz zoRu#HR^<~Qt1F5VrA3Jck0kO}^n9*=I%nI#N^jQQn#OCn9rLpONNmLX=fK-BoG7Pj z786Y{PE>1xQE=%3`HdQ=RdKkdqux>X2>(2`IC}DwFG5<+8G-IyFZGZ1H7*Q_b6__M zVRI!L{Ir|jGg&sHfWh1~npX3Ck%0c9y)MhUL_FvZc4eynhn!9soJ>u6T z1weNZY;p&QqyiQV4m7l{t_fwJi~e|N^bk{FW#}*AVgYi5rFA(vZEKq~u)ESNJ#HXI zLYOH>0YKM)dWYVh{Q^_LjidS=Jk47}h^badPH&k|EjLO}0_|h2a8-zOhx-#^91*IG zeq=((eVX#>c#~0Km0R}#g)KnK zYO&(HZV^V|Oi5Sp*i!`o1uARxR35#u+^n`1!Y|7`ERrcL>?Q=bKT(s?QZ&aW=9HPz z`j=-m0+9-sZ0K?Xy&nA}s_cwzH!9XFD`^ns*lMQ}y8_@@*4cf>t5=xx5fznT#WZPQ zw&87rGmORt)DUFd!+g$&|dk;QCufv z|BL#3F+jf^z-rY`XJ_`(Z-%88qmDNq04V*2^8w*0acXq$T8WqntYo7H^S3<=2I6k;u|T; zgoqLEGvVLr+;GqIzCWQ0aT(k?2k62BiT*PZYagc)JI?d}=G9(UW8S}!RGN))H5fN# zD+LTodBnsbqA=s$T9WpU-dQPzO_ErgxV5W4U|BD}U8` zVczTSan#_l&B@L|*nBATbdIlJWKdc1mQ`7^_945snKgM=2Cwb%U*5J>;@Sb->38E2 zyWSSj_;S^q;YJ%y`36&=4P)N|9BOgxc3E8?M*1ELCB1jYgaomAcN9i5HKf*?0$n*c z`TY+puW|tps@SZwAGQ49?Dg4Qm1y&aCcE0oO9?Y2usYS-t~ucFx885K=gZYOf61?y zI3K|Vl~~NICWh>`br@~>RtSA{uoErjI~dluDc~07=>F0o$1UtiEk(@fedX}vT^(6Y zy`*Vh^C#AY=l^6eDW8gVg1OAU7zkyr%J%v!DXa=T8?}yvWDW-t2gz_j5uU) z1UrAoa){ZBlGV7m)wa(v`UMI*Zu*E5|Anys{?fTezDX}Geh;+A!%+R3q?t2sZvtcG zjohV@NvlX{KbFO(%2niDy+FHnJuhRU^CoSC-6ERQh|o;6K!1HFXw`h18S6A`;oXc`JLP2dmaZkSbJMw2%fa#~AD8u^;-*iK_aRSv;*v-cP8-6^yWa_njn)PGLJ zUy-YTCsobu-nNWF#6+%DroZ*PTUkV1Uu#;R|3CEA@K{VoI!)GTIV>#uJM)#6lT=~2 zNW7mR+A+!9%Cn5B={VOsG6(q-nr989oiD61tg_$)?h)dZlb=we*jV?VJJb*Mc!L35UnEPSq*LUP}-}#C|dU zL|M&lJQSPSs-ceFi56tr;T5**-#hNT76;?VyJzYJrbF*c;=yaWDW%DbV{1jL8A)Xc&1U{s5gk)U6P_QlY6qiW9F4X+5yTsV&5bc5}|s8gTB0-}7atP^NX zf;&F>M#@P%&HX1_YeyMuW%R`oW$k1;)*q19+zE9+aq`}{hHY&?#nhHnTV=XI(H%=` zEJNj_0V6YU^B7u=gml?9^Y%`kY|-GbSt=yG4s_orOVA3vZ9tXk0!iMmE6bz0>t;gDhY6!cz?P zRC3L3HH@9song}R3;{vCUEAU?GH*+Nd!Ai77BpI*Q^MKZ#m@M~@U}K$K8$%)!;Z%nqOYe}|FMc%0t7RbgYlf+K`+1WgL*JYCbP2G zRsGitMtFp|xhWJ7d4oWp?)>lnb=`mb$A4IeA-I%lE4>uYf2pS)27hV(`)|BI&8PS0 zum8f&tABXi{q~K(OOdbf`$j9@SNrw)uMhh9YJ-W98-FMI2 z#YlyzEsH?1c;Dm_x^#04t@z6C%tzGstMjW7)r(Nre)-9-W!(bHbuHPpVb{+4 zx@{Mi+ovrie>t217O^W7RBXE9Pqm)r^U3EYM)+A*L`{ z0n0gT1{qR}g|%rxmw)C*s=c>{9C+FBI$*|15ZF(FmR!W)psi_e|BgdR_&L!8} za?hj0l1eV6)FMzEHP+;6uBF!6YOkZkmRfG5)z(^XqlX>=&D=|`z4hM5;F^O^9{lv+ z4P(qO<4iNVS!SJW_Bj^ev(n0|th(CjYwWP&20wP$b+_I3IDd8srISuR<x+5J^K;2qAkU<^NC#wDX+VGilx{b`R;A;Oz4A=63sc@ zTt+L25KgDr9WxbouJy=U^RW&at~BqNr{^`!gs!>o)^{aWGOylUF3rtFq8B8k;n zx$vkXL4Uc+SZ)ttwlF&)u(TC=j_ag$Zr+32sVCgZJM#^#-MIQFTxw4<(yNRxT?DB> zl)#4{{^zAr8k5uQ=3IR|rOa*`^;wAD5-*}~G_JuKRPvoATimGw7+Q<_Mt;r0+=X`Y z@=RCsW5+b>J!5OqQ8tXNjn=~^fB8nAOe+f0q<=X)1`QvtcrJl7+HG8_v~YpH z%R5sTE3xXEcl)+(J@K~0oQ2p~7y=T!szQ-c{oZ@5)nlG(HPia}gWzCITg)sX_YKnY z(}=J!nD(?&wv++MVeb7^s`$V8_0Jzv36xa>F=0C%0Ft}ih3V|$R4trkR&DQFQb=_i zB7X)8(2sY!wzLwnluw%F?wdlch$+AMDNjtbd#*oyFF#JZtL!oJI#aj43yHGNMf5@0 zeJymv+NiNbtY&8RBD|Jg8rITC_6Q|sB-}2Q86?E|ooUY&r(!)0JJpS{gRgPr%3^jB zbH32d_oUj5Y2|yJ_p{)eEFpdg!v(@0E`J0SCMXgph_1w*H7jGE-bww#SXd|H2CDfz zXR?}zr*(`~nlbeQ-&qTbs46p@#IR3Zm>PuFmTgt#2!dgetUY8jHIM~rZqR8@CV6M(m4!?$^pp0& zGZ6zRb!K)+9+R^*10syN-ErX74oHkfqV^n86Fl%y9- z{wi=;J|>e-WiL%@Fv5yAu(suZaDN4rKNadfe>6m41_@>+{ zVcUgs1o~M%KUnbp{;T`1zVZ7Cdw_4AYr}Quz)5BuKgoP2_Ndtt@>(~tq_7Go=Y{%0 zGD10>2%E9-o@u1Csvk$xn1AL0G{Vr&rR1)GTesjD+t_2Tb%>pT@Jy{?_-|i+V@jh^ zIU>&C-(Inby`1FNf&w7@4P}QhmA6DgF@1JjCjxSC4Y^wx^wg_FF-en0T!h8i@3p{? zZj`VM7ZCw%2c#}xOeP~3N+ED=z(%FANM3|NxQfaU;|tNDY#A-B2=#EN3RxKQTYS>O5k>&_0q(2Q{mupGQuliNaa0DTDq zMWW%d88adp2p$kP)PLNdv;uwxWdk_hwws6o2$2i|@GfrPO*xv1q0YpQa<754to12; zTWF8Q4H!6b?)Ed_=La7I%0(2$5Omf}6agL`AqePf#7zvE0_DycounxkCopGM>mJ-6 zMxq9j74=H_Gyv*3L!VoV!5p1s6|n<(L6$%OvqZ!KWC#;ow11GFjC@^4PSp<(^6CZn z5!OPKg1H#3+CkjIl6XU{VN}i|fyDd{@EM^*BoIXyG`J+K9lK*LktStEE<4t!DvglZ zxkU5{R7fb|*jOU49#9?iGFCnn3uDAOgW-LokULXS4#il&pS)WX+0I|ZF)bi-)B!!9 zbT!hCg_=J(41Y!cCLP@Wj2Nli5p5(bLW-e{ywHk%lJ!O~`i_J%gF`T)TI339Cn6J} zQRb=Bg0OWy0CY?asew7H%w4%@^%F^$i0t<#GQ0YjO(aG@eMK(Br2%FbV^6ZhZ?q!$ z>sTSUG|NfjIZJK)JTd|`dk||PsWtQHNQ)Ry9?)OLX@9f)Q_)|AwEWCij`&MrQ{z?$ z!aRXF7+}tRp=v0L*uzjD;mNv|Bom{pO&~^VXsLNdz|3GBG8U>L({zx)u=6i z1s(+ikpyuCurZ<%iUK-&nP@M~#-wu1>pCox0YZceppnQc1SxVasYnaS!)L5Ol^4J< ziGHr`sDE>J)zATGR|NDN?jA9sfNowC2(!+IB1lFCKOq<9mw!RaQqw9XK>e(rP#!7I z5KB)aJ#z%nA`XCFf*Q;QP?_JNu@D}tG=no~5~6zp@7s5j_dXG12LO*$+9l@Q;w$vR zTv*qzK(Y-XhD4?>P%!6!q(xt;c8jRO6|7o;wts}i!2>}12<{xwkl(*{P+D^L&8&6L z`F<^b6P zX>-ROf#+oj@uge|wCDpe$vZn7T4W65?EoXnf>buN;=ylh98z%NNfUuOm_^YYMsW zsKT8AY^*7XXo1PGMf8nA4gzGyE7<~TisJx2(dc$aJRkvnWg><&yFcd9Ni#UW9bixy zvch@kBX<>TOrkf!ju700P?;+5mZ5-;g?|9Ej3z@JjxFicagZZ*m8MHNWFqb#<|-&{ z)SeU`{KCKoSB2rxYM`Sog zf7=m%aw{eNC}<7aq*jQS*SAe(Sxz`N#Rs|rUVDj#<^Pf`umDr>zWme9j15FZ4!@U*wU z)`pVf?$F@DBj!>pin&>$C;2Xv3BruTpowT4Gm(!gPlNR0;{ZvPpS%K$RMxC~Q@R$Y zmUt#OrM>Jva>T$cqu`|fTIdCYO$vYS(7x9yTBXa|Cl2SqS7m&-8=rJFRicMnn6_A(%00f6z z36PyoXajQ!BaI06AC=093kYtjXaiDW^Kb{O|6_cF#gM?Sl9+j@V9^*nW`7dM!gmNG zlHzzY{7ONRz<=>KI)Ueq^W0&^hudVpLB#^6njV!{7;?gzGLkSc!wEe~ z%=btzgQpd#w}4vyRojLoa@f!aE?7FT8!{8x*^(ZFNG=s6US(KVhfX@+*$TtQ+a2!c zI9w@&qTyyVNajv-aaG6-EuDzJp8Q2ZqRKwKi$Ou1JkCLyb=FvhLw{vx`3n4QV7RLx z-nf+0^M#IQrU=GQ%RC# zC}S3R8@b!hM4$Cc8NfOSbxo?dH^kYnlXt*|SniQ=)o|v*OF&!wPF~)C;ec;&KV$8t zf(c+q>hLYY{a=TmXMYAjDXble2Fb_Y4(?^z7vEhs>s}D zgeZG(1O^}9I*Hup5{@71uj2N6P7us#10^CcS1Eie)*Yt;wj;y*gwF`>iO@o?-4+pt z=S%pX3cwh^bbmuP!5JN)ep)nKGNy|3<6Dn&UWD_^3=+2D@E|5I54;)n3_0a-pXj2+dYtu2|1acs%96!6c*J=f62wu#K z03_n@nI4iOtgN9I11k=ey$TaV2#X>hSpgN{gMYdknCwCNWxo(T%zC>Le^*;nJt(8_ zbfjTcBM_OFM|m~RIfe2=$v;~T+{VM~otAP~8j`q=`OCFl5Yo7uqokM|p zyMHhDn&5U0=z|!Dn+4d0IpXRT%28`ih89=_(h`PxnJ-T;c8N;RyvP@{cVlvOI zcGT5|l&ck^O%q*7|kYN6JUV_ zOzpx;%(E~eSb6l3syk($gSlx5eF=`J3@&{$2-z(k#c&ujxm6G`m`OxBascB9%mS?e z$L)^lj>v)WJ~*Y3j_x3c)sO?=bjI5QQ7X@tmymqQZwdJuu{rx6A~yGr3J{_O2Y-zc z8Ts(M94J4{%3#;7ngdd8g}K>~ zA7MIUG8xpSPf@%lfGy;7g`A*4Lw}4fRX4s=t=eC}-PQhH(AFwii{L;PJx_oM&_X8o z)`cQyBH^GGtfOiK=rL8Zcy9tPwrNyo8gNvbYGgfc8Tgk1j|=SxKtn`e#PZ>$>cMRk zlnkXtMtf-M?dju;}jajLE@kfvCJ5taXf$P8f`hy2b#Db1ZATU%tUO& zrV-BKsJ#z0;G_gv8tbw#kCMzsmf`VvqhX^&6bEuC7MOTD*zJyeL zR5c}+rus5uoA8UE2%b7IHl~4S2Xj_NVc;O``sOFsIw?1hq2i9)Fx3PB6s!m?j5S2N zFn6!NCQeDJxql11Zz>ogeoJ&!`?R5H2X0$Lfer0|A2sU)r4K5v!**Y6kXuzux3tfi z0^tFuf$7_4ho43_fr%_YP4Yn4Kg4?+#Ijmh)EbGSxu|Yt{I}p>iXO{6P&|xilF_;e zuZ3!ALjg*c5f1}pNmPxH!T)kmbf-c`s0_kh*a!d}`G0mv%;eV2H85-}L5K@J63{AA zQ1ny#%r91w2_h;i?;h<4;gASADqKY7FIz$OS~{{eYK5%0FFSns(|M! zc^veq167C0g7`$W?yKeHkXQ1sd>$jb+VR7c!2OVaUf`FwaG`lDtK$lZcJFjw(d(KB znST%k(L36VKe3^$%9hLWRQ*g3nD@?lsltq_Kx}fIKsEt}?kmjvp@xKjfhzD7cTwB0!CWf!ec?{2Xut20sl;*b!b;X zYHCu4P$v4PE*siHC-Ym!0tr=P3?@j-h+oafiZ<2hR#S0s4(XIJBtwP5`P%tP$A1|C zSnq}YOcmC?pd3omjn)(rm`kXyL6WPT$JP5WJnS|_su9_X2wg>#>N?tLzy`<+ z!M2EqjS|DY?9303jtfJXaN8`JW`B5Gk4Ioyy_%O=#JP24pRm|J8Ix50sE6#=TT;bD%T`^JuDX8m|g#oFM{fPP9f$iQMfqy}^;{<>! zRR|hyPJzL*%;mK{smJ>(N5Nl=lCVwVSMZmgL_i+D#Av8+l2^^7Q?)_t1HLN-Z9|eK zm@e4|naB=MGO|j_V=r+~al9=OH@kYIv?oWNb=eVho`f*E~i>2)SRWR#DP2K5?!r{ z+bN26#MEc?!E9_q6SqSigHSnKHynqYL8zv-G;!qE z-6%rD;FKNBD9ZJ!BV$baLW|&ZXQ>vTFxGCL>VF$3V6=)_B1u(P zq)qMr!APjnua48S?-fY0u9l~OCO|~69_n{h8FKKyj-O!fQ-?ZKy2EeMOzKg;I z?X^{<55z3b`@wBH4kI@wjm(9|GJ>GU91Lw)mNt-xWo{7iQ*jF0pazl|JCT`BBvyMJGOMzr)zEDugiCKbo_{4COT7p>rFPVHqut*{wgG;u zyk6(>Vaw=YPSiE>-uIT@W2>QThzj+HSkUA&(JePyuKM!0$)?R`4AP#ylUaL9igT;l z#MkGns{SGnl9wK9EU(Q7Xd516Im;Q^B#MwF1ddyhKEa40V40!xHnqugnQ}7V03)g} zZ8bUg1Aj=X2Ej7%PHQY86StUH3^#*&wQSZ8J#y6E2y+%(&5dR8^R6jPqk8#Xn~Sar zj&`+mUip9_ZnJ0Ib6ucxb>{=I~?zxJJ__|4P}Z z1O}q>!u~emvUc}eBK&c0sn@*4mmgy8r@`oEyUrD;8 zya<4Zo=gRRhCCnXy@?<{{#6LnQZPnG3(oDn0d@cyL!picW-}^sB@Cqte^jCO(tm{{ zz=~)w!dVTY3A4f2Jt^eST}k>hn(XUy>#u#{4T@FgRg?$XhsbLhl8zqyjHtfTF&L0r zwkun6jOIkDRLnd{jTmVm}a#JUm zz$Qh)YM>e#b}pUAU>#%7Sv~lH3_^dN=GCEhfK7T-+JF2N*A)Zkh zX0Hk2A1x4kBN4&K@utp@33Xzyr*)FmY(?#YmWV20;lN9$nlU#cZQn033V6fiQVrPE zdY|?r{pN?R?JM+zDn6Jx4fz#*W|FC4d0!`XA4p=-$#ZEGz|Frk7yYSW2lI#+`m#uy z9Lgf6LnFPt2L-@wUw;C(X@c6BV);TEk3tCh|O7xg^pZN5~ z-I3?kO$W`n%M4oC(gw@dB$aUjI&WIlc3QS7Xn4X!sCj7q1|1S1xm1W-=xpvy<`OFu zATXlBHMMGkaDD}ygwa9PDD5ytjVcR&T>4H566v7BV+ZZV0Dt@1r#{*_-`ODpRDH)E zAuNvMftnJLtmTp@1UBE)se$38WV3edidaM2+(tSvTVCZSWKGk4i;5;#l@j@ZFzUnc zs(vkK;p)71Q||)uWT-d{LLE|wFxX4&jD8Qd(0B*qx77<$inQ}Uw4pJG(FW9Cz*crG1v=3k`2_EvES` z{2;1rj1Y0_12NikL`3I~GE*sa23wl8?UkYEWT{UU`q~hufPd;~vB(-Nb*qN6WfX{P zwKP|qmh|%UIsiW>Q@S-{_)fLK5A>!WUxtK9QFo7Ynt%3ivsweR9qgW(HB&cKnCnRv z3EKNqEg<%S3*uhdD3aJoNqVy3u2pA?1i#wlw9MR;iHF&j>5tExR<=&1NX z1H91egr*LI>6BDe!MwcCWJ2IU9TrwOLluL}@_&xxn;Y_uD$gj7)waI8j`U#zRIx>D z2Nm+aUi$_560X^PdVsqccJFzGEa@XXMB&p%tnwr=v^`c>LlW-~`Uv8G+jQ^AB#eMz z5s^(Nqq~El5PQrsSH`;u2!Z|Z8gdEt%nWv&{3h2C9)P7zl;}_=eqzBz9kbWt*-nkl z_>W(e4IE8r@WsFAZ6i~%urt=R{1E*H86h1cZP^a z!Wbr%zWVRjNs0@Ao#P$#?HC6|2+~_8gS4xO0|?vc)Kl3IC~D#$D3%^WGMZPJfqyWT z3pN4_4oEs>6`D@Nv@WLCvq03#L2yTNs1Kp8PT^egGO4}*mK@+ZWyoyd|Is2K9E{Sk zNd#%GlO`Dw*eLWCW%^x~PH}vR+@VZ-7 zF3qeQ8P^gDr>wrX4S-I?YJc@U5|*fua}WbjZ|0a!bUmw;Fh2SGy! zj-fVKHIaQ?b0~fUj_W}Dc}ME!IwY-5Cr>?5BHPS-OjapOsRan(Sej1j&o>%MkvybyYPFMpkWQg<|%JwZ}z zlWE5wtHDUSAx)t&!P%|70~8_14Q4Mr1|bcQQM+;S+-i4`nQ=dECjacYAb7KSE19Sl z)p7z`wPMv1bS4QRK$+`cp4^eC>KfGf`I=AF)Aw7U#{cJ~no@o?2LO-syXbbmnTh>H z_wTx?UoZ7{TKfgHOn=x5YVUuAwFN}?1&hsnaorm6C?BEPf!OIoaGjC(FW|K_xr5oi zLc!Z9Q$Cn@uB5!)b_h~<)@OgUHn1V(XQ@+!Ks`Q`}i9eTz9E0Dx{(eb)E`e-PC-pr#g_fe#T-j=-vD&J(-H<-&M-DS+BP0Wu5xxVFNaW?{y(dI660thbMdPK<9 z;W|c-JPOJiTtyo`1f8CL-JVP7qC=|j^k;C{5#HEgURjwxKJ&S7+@)4^>xCDr#fOBo+jzb7#Dw6K8L)pQ{t`m}H%_&<`h_lh4|5 z)MF-OOTv14{;UJ8SUL>r<}e=XsJl_mQkyadAAdGRudW&*So=~@*{?3`sOMcUkzm_* zdYgPw-$dySC9`VDk<^9gjX{A@I;8V%mr2ux5T+=yIB zmbRsp--A$)DE{gMySDxN+m?oHU_gv9l8~EIp+v_r)SsHfR!=CV=suiQ%b7M6^hA<6 z34geuR#C_k`DF-baBlB+$~b{luQ$O+CCt0X2}yh$dP5YNalU%&Q!jn!Y_3PuWA?jx zU?GO0S)j;DieWrfvXbPP{}hSL6PfG>Xb zlYh>!0Wm7*K!;9e@|Ar@Wp!4$CiU1e?0*av5$8(V^&Wep&5NbZu2XgNXsEWTohS?u zIOzEPJ1ncpIka(T65aA+T09S3KJ-zcfuyk5EOSI{<999sU)a(Qoh#es3pj=_h z=QEJ4&u8d#mU`aMTCcxr5?Tlj)ehHwEwel8EWUN^ui1EyJ?Yxmo!Y(Wki-S9yniSO z`%k8U3&b=NkTn5FfTj)O^$POnQ9bSws9ioz5rn#2#qoN=-jVo)_GSom_k{z`>8iki z_5rA+ks1EM5vXUXkcZg?J@z7~xk1}+poCfjn0qx=0JkyoAp{XC>V>|x5$p)(1$xUd z==`oYbU8#k$pML+;9%0EEP7MK+7EbCC z-b;w6lVR|#HbnT$cjozOgO(t%QuQ2Bb&u=W5rdTS4kM22P#X+G<-?<@n187*i9d{k zNfI2*Y|>-lYS1ZJJvwHspogSjsmMtZ)E(9q+RuWSL!J-;mw zFsK$tBJJ0(bZWZt7y#|ITC^nV1Sqw|M)xQYjkGK|1|qrTD9y>;e=D1~)$b%B>vf07vj zBy=>P5(3q>P-soXBLJuBpSrVuS5W?AqoI?h*-*Nk+tl=&$)kgDymd5-pn~JJuIw@Oav*25`X-J9N%Gy8GuIZ6Jok8h%)UJF`Vt=V~Efl97@(_{5 z*d{zhkf*RN4T&3n-bg!kRp;bBc!24ny4CK5MHEFL7C!1JNaP-K&zfjgTZx&Iie^0oIKu5Lwy^gU5M z&SN(;C{a_I9s?AU=6}di05;XbtH*7O+4Wd3h|!szk2yf<@y;5l;15BMhvVeH>Uv(D z;6+bth|mD09yyH(@j5E4<{=$0X$~4wy$79jbn^d39S2DbbvU$ntpjzcj_V+(j?~Ba z`uo&Wrx?(Q4)sL#=z zdg4Y0ZpiMc4uAgA^<*YPxy05bEcDoK`&oeHG!acS?dD&7$6K>D{Gs zSWc&KR2kRd7lxo=LVtSli<)W0nw6Ya#Ti8C?{v(2HmlD4H??l);0FZd8aGdWMi`qXJyOXyqxB zeMu|{_SlT%;BoJw>zXU8NEI330^MEKTo-zyr=)PbyL+ToFp){TXWs@x)k$sNAE$6^me@v=v%)FuC*#nlvOWE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yan9G%GLxXnNI5#-dUtyDD|RB7j~DKtxbxmJv@arr|lh?&0I> zU4&(0X~U%ju~c^c!PLmvubeOCl*;zR*BDv$4$B*@gvt2m)|%S92R({ zXr`0%#3Hd&=wPLTS<%#pr-{R=rc=IRA0fwFo*_0j0PgBU} zf%h}|rYtac3-qkHy|wmn`T(S-w!2Ta)`T8N>Km+ z4R&c%Saevkhcbl%Br!E(IAJ+BVl6l}Wiu@_G%;i?IW;pdEihwcF*Rf|W;HfpGm|hi zsthtSFfcYYGB-FhG&GauHE{|tR539+GBG+ZHIrdBBnmN9F)=zaF*-0cvyV0n0keBJ zUaS;f-UXxKl%73u- z^|-(I*X#G`&-^^_dja54-j6Hp|9SoQAOHK$*B}4-Z$bh90>H(J{<@f#IC_syU|9ZM zVE_ODpmWh*7VAG>e{}l{%ip^WAp!va0zl)Uzb?vKE&ZNhVEtKz0RRMm21UQ8)NrxY z9S{Tn5CAS#_#-+5f&c&lz)9g>Uw_xXY6w_<_Rs$n1ON~K4hsKW2?792;CqVV|DV@? zPbc=}6xg131Eh@p_de(6(m=|(0|0P~4#3q${jDxV=m-Gthz`JK#CtUAf1-5|0D#*B zfKTBsDULI=^;>oeKCfA?G6(>d4gjUa|Eb*oa{~albO2bk{A)(^Ij zTL+A&(S7UUF9ZP4JOGs3>)-m}KUW&nw|-wC0D$lSP_xiatAc*^zJH^GMDGQH03b8~ zM2sqPi}B1|fRsW#qWFK_Ll*#muns^(LB3N67}+VFZy#vY18uj=g`c?NqcF{rC93mOuZKu&n_Q0J4hzy3n?K*iC8y zUKah&|K1A+NB=$beR>rC((hLQ0AS@E`fi`XRJw{?>bm!5BmKzh>dW_uc>fVk1N_Vd z5CQ=B%Xir5f2&CMT>WpaXh&O4fLwmo7V83hUgKIn0NnyWWPhQI4gt%b*}DII>-8;e zJzNHXR>eQ+_C9w60B{-rYDWJN-GJ0$-ShtUy#l_x>=9M`TaNmL001@vK#KxV(hWHJ z`Lp8K^R~Zb2-*6brON?F7Jru!07&WpM6C7~@xEI{HKpC(%ettpKTqz0K+#2d`JReD z01NNK;`=Eg>wo`N8v=5Q<8s#j)@ySAdu~zBE#%7(&}%io^?My{FLwk0@JhK2aO*a> zs34H~erLrz;ugZ%(SJ>`j`}=N?*+ia0>Ihizv!+&YB%7h1JGJ-M_~DH5sL;X`~VE; z0QBez9CZV>uKDk^w)d{d_bQGlzdz#pioPrZfB;Z6iX*QnNL!=k+-v(i3V!aA!e?_B zMvV5&0{{>J{{H`J@BNRuJd;626MqDXUkUJY%UR8>ggJ#hH$X%!H=J77Yu5gE8y^78 zI{+<|b_Ld#0rp;(dJAAl`#q%_kW>6qKSQt4zRLgr0zl}}zh@)*+yZwtqkg8l14{o! zlllO-RR^G?D{xlmw~A!+9RO#e|I*w0)}P6>eE^0BfZn6%lCD7R-2u!0c7GNKQfK!c z{ak7>A5r*6E}0C#!~x)FQeE$^K+eN{N=E&W%LJ!}r}cN+`g=|NedYlGJUjsG6^Y)V zAhkWd*9|zD0GLwv_tqiUn*@0FeQfT zwD?{WdjP^a0J+6EvM?P@{(n0ws#{%ysHgJfEajUzn?LuKK*b(_DFVQ#PQlsbf%S-e z{lB;V@A}`je*P?^M6d6!*aL8x08kSOYJY!@b`#%lGas0004CSP_c4gs@eh&wmPkY7of%{bxTv zLkJK603PW*^`|Qd1xFM1QZ56mFBhav`YY*L0Du4x916BZ??*qo{`aHSzhV!705EAN zNGbMbOwt2D0JxAA>)y9oOMiwn`Yi_x@HqdQ1b8|z0{{eo0mXi=2{t!D?UA1-wE`C2^(0RRGwTM9U8 zgq-@Io~?quF62iYfaoUy9$k*;xjozk0H6afwAkm2j?YHmdw-Ad-7C5&9f7@xfw|8L zsOc2AgaE*_0iflG_N>V6&D`I+o}bbMSpWZf-GH3S10|uL^>+(^08mx%Yl>b?n|3u+jcm@l6Q~DI@I`0U#(KUY%NOOK11DcC_U1RuQjVD%j-#0ETn` zA`AcC`{X>8uSF3oo&1-2D`Cy|=T?(}N*w_ilb=cze{D0@{{cwq0JJLnIqzAro_~+| z0B6_yb3;IjFthFo0KjelXxT>2EpTTK-zgcHw+aEJcL%iU1{`$-01yEFq1CE@k=O8B zjFwAA`>ElgBm}hh`?UW7_{(>f-%_$5P)@6VJ*urOoT-cUEEhY9de5!bM2y-Me*g|U z0FhmQf6`WVN>Saq_FnS4YJx%TM8Vunz^HBq01piSk)!?=uRD7RU(3I#He{59fOYsN z2~D)0}vhndXD^`77`*tfZ`88vj9-i1t=-fQH8zNz5Fc-dd_PUe*l_y z0CGaW$l`y8QN7#y0GK8Kq=tajg}g^lXfe?*`ZE~)1JEr1oP~gvPXl~f7vSi1ia!9| z1HfJg=u!Ny92BBLfZ`9pumG?Q0Z(1zf2Y^A`sHeWia!8D13<*6yhU)BIgHc>2E`wM zDFVQ!Ae9ug*%t_Eb*rCy{Y`s!Kod*X_ap=Yf*>MADNFt10#YLZ zLf>HJih>GP)JqfWNRtkR1Qh{MiXs65B+>$ejwF!!t@nAK?|uK;ot@d)-#K&UoHM_f zMby}%8O-HVBzH}?y|OfD)9eh)CiXE^DyEQnLU4352tPpip?(7>2tfd2@b@6(?Nj1Y zLWh)Va|%{519$W0#c;K^em5 z)xPq)G>zpQTwu8ij7lWcZxD{rWkA|m;Aoq-JV9QbJL4nayaHz_>!E9uQ^p9mOG%(; z>$_3Hx?sws-9qBFH9%r-nUu<+NcG~Zv%>$D6(wUg#HX*qmcNZ9`)r_)%)#Xk%p-tu zhR@fYf|)|4PesLze+wVh2cv;eC!*KAf%E3ZM4Kkiz*X~sFhgKLo9Gw8D@d5!?ARb+QNkYgpl`kEQge&vJ0DvJmEW&s50ncanPw32D z05l=;ILi>gq8SUZ1X;KTqo#N<(1~DN)BxZHB5#~amNy3zU|_phjS(ERDBVdPF9Lu9 zfMEt|L{Ra4OSl$*C2>FiUz;oecz`6bMOpUHz?c|#F$-5AfdX#hzra@f!7Gx`#}v^y zY72j(=K1~fRZj_k1@QccuBt9!j9-@kvSO5%R__f|id%iioyOHqO#tN*+ShA7ZOu)b zN!U{~@h!OLdXl~7zU=?9La)(7GmO%e1=}(ul8-b;y zB#3}-;cnLf$#dpDe-wxX3{N|BqaPea{!ga>WOCSwo}YT2*;KDbI#29~(f4h-^mcjg z?P%0eZi$VzO^LCO5yce)^qT~)db^bho=|-jDqY0Yz#AlSKMJJzt=EKMLU7Un{=ogu z#q;)_KY)zRydSKS!kz*vF$rhKs z=>88t7X-x*`^SD%oU-F5%>R}1|BHzt>L@M!(Gx5f052dJ&;!2)t8MJi)&Jty65}M2 za%FDq{_3Nb5Hd5@{RPd~iD0}62o-o7zW-ML#q*N8E7`ROZEcfiSpbe9DQ8_U+x?tW z6`8`K+_|VZOpgo5y9~^>FWz>hQE(d`1S^C6NNnrDAC)s@h^JdB5cBh3eu*0^fMNxE z1A_xjV!8a|wtzS&OZ;GL32;F@h-h~r4h=xH6wt7j0e>U%*iW&ycm79C%Fe-SQJx|+ zV>jsbmdHDXApB`L4GW|!3kYFjs&~cUaZkYE1e=MYz!#n)e~cdqtRCY5mI|El8}lNx z^D4pcN9Y<$^k3ac0@Z=FIIsTyc|b|-if%ocNB{s=3p()*d=iY0{a1HjmYg|-1Cu1}WO#ec+LaR0dT|Cq}NsXUR(TwdlbbFIcACp#|Qe9*Sm z$OX2@qi4EZp^t~0U{6$@*x(ir4x@#axc=IVI!O)1mA;fSvrNny8INBSc(it(JbeLg zEH7f-gSFP}m(-ImI@|O3O%`gYpRcLtG(H10v+FV2>)G!Pq@2cprZy%2*>R^#SFzk2~ z?xShaObDl}*=DyK@X%GyPD(`cdN>W1T4|C9(}*q8Vgl|W|7dWnk=hJb**CJkDT4-GT(($a=dU|#b=

CIdua3 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 #include #include "main.h" +#include using namespace olc; @@ -18,6 +19,18 @@ Enemy::Enemy(EnemyID id,vec3d pos,float rot,float radius) } } +EnemyID Enemy::GetID() { + return id; +} + +void Enemy::Hurt() { + health--; +} + +bool Enemy::isDead() { + return health <= 0; +} + void FaceBall::InitializeEnemyData() { enemyData[EnemyID::NONE] = { "VOID",undefined,BLACK }; enemyData[EXIT] = { "EXIT",undefined,GREEN }; @@ -33,6 +46,15 @@ void FaceBall::InitializeEnemyData() { enemyData[AREA_MAP] = { "Map",undefined,GREEN }; } +void FaceBall::InitializeBulletColors() { + green_bullet = bullet; + for (Triangle& t : green_bullet.tris) { + t.col[0] = GREEN; + t.col[1] = GREEN; + t.col[2] = GREEN; + } +} + void FaceBall::LoadLevel(int level) { this->level = level; @@ -540,9 +562,10 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRas float colorMult = (dist < 2 ? std::sinf(0.75 * dist + PI / 2) * 4 :1); float colorMult2 = (dist2 < 2 ? std::sinf(0.75 * dist2 + PI / 2) * 4 : 1); float colorMult3 = (dist3 < 2 ? std::sinf(0.75 * dist3 + PI / 2) * 4 : 1); - if (dist < 2) {triViewed.col[0] = Pixel(std::min(255, std::max((int)originalCol[0].r, (int)(originalCol[0].r * colorMult / 2))), std::min(255, std::max((int)originalCol[0].g, (int)(originalCol[0].g * colorMult))), std::min(255, std::max((int)originalCol[0].b, (int)(originalCol[0].b * colorMult / 2))));} - if (dist2 < 2) {triViewed.col[1] = Pixel(std::min(255, std::max((int)originalCol[1].r, (int)(originalCol[1].r * colorMult2 / 2))), std::min(255, std::max((int)originalCol[1].g, (int)(originalCol[1].g * colorMult2))), std::min(255, std::max((int)originalCol[1].b, (int)(originalCol[1].b * colorMult2 / 2))));} - if (dist3 < 2) {triViewed.col[2] = Pixel(std::min(255, std::max((int)originalCol[2].r, (int)(originalCol[2].r * colorMult3 / 2))), std::min(255, std::max((int)originalCol[2].g, (int)(originalCol[2].g * colorMult3))), std::min(255, std::max((int)originalCol[2].b, (int)(originalCol[2].b * colorMult3 / 2))));} + Pixel lightCol = b.col / 2 + Pixel{ 128, 128, 128 }; + if (dist < 2) {triViewed.col[0] = Pixel(std::min(255, std::max((int)originalCol[0].r, (int)(originalCol[0].r * colorMult / float(255.f/lightCol.r)))), std::min(255, std::max((int)originalCol[0].g, (int)(originalCol[0].g * colorMult / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[0].b, (int)(originalCol[0].b * colorMult / float(255.f / lightCol.b)))));} + if (dist2 < 2) {triViewed.col[1] = Pixel(std::min(255, std::max((int)originalCol[1].r, (int)(originalCol[1].r * colorMult2 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[1].g, (int)(originalCol[1].g * colorMult2 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[1].b, (int)(originalCol[1].b * colorMult2 / float(255.f / lightCol.b)))));} + if (dist3 < 2) {triViewed.col[2] = Pixel(std::min(255, std::max((int)originalCol[2].r, (int)(originalCol[2].r * colorMult3 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[2].g, (int)(originalCol[2].g * colorMult3 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[2].b, (int)(originalCol[2].b * colorMult3 / float(255.f / lightCol.b)))));} } //triViewed.col = triTransformed.col; @@ -631,12 +654,12 @@ void FaceBall::RenderWorld() { for (auto& obj : objects) { RenderMesh(matView,vecTrianglesToRaster,obj); } - for (auto& bullet : bullets) { - RenderMesh(matView, vecTrianglesToRaster, bullet); - } for (auto& enemy : enemies) { RenderMesh(matView, vecTrianglesToRaster, enemy); } + for (auto& bullet : bullets) { + RenderMesh(matView, vecTrianglesToRaster, bullet); + } //std::sort(vecTrianglesToRaster.begin(),vecTrianglesToRaster.end(),[](triangle&t1,triangle&t2){return (t1.p[0].z+t1.p[1].z+t1.p[2].z)/3.0f>(t2.p[0].z+t2.p[1].z+t2.p[2].z)/3.0f;}); ClearBuffer(BLACK, true); @@ -726,7 +749,7 @@ void FaceBall::HandleKeys(float fElapsedTime) { else { pitch = 0; if (GetMouse(0).bPressed) { - bullets.push_back({ bullet,{player.GetPos().x,player.GetPos().y - 0.15f, player.GetPos().z},fYaw,0.125f,{shotSpd * std::cosf(fYaw),shotSpd * std::sinf(fYaw)} }); + bullets.push_back({ green_bullet,{player.GetPos().x,player.GetPos().y - 0.15f, player.GetPos().z},fYaw,0.125f,{shotSpd * std::cosf(fYaw),shotSpd * std::sinf(fYaw)},GREEN,true }); } } if (GetKey(W).bHeld) { @@ -828,14 +851,38 @@ bool FaceBall::OnUserCreate() mapFloor.texture = floor_tex; InitializeEnemyData(); + InitializeBulletColors(); LoadLevel(1); return true; } +int FaceBall::CheckEnemyCollision(vec3d movementVector, vf2d pos, float radius) { + vf2d newpos = { pos.x + movementVector.x,pos.y + movementVector.z }; + for (int i = 0; i < game->enemies.size();i++) { + Enemy& e = game->enemies[i]; + float dist = std::sqrtf(std::powf(newpos.x - e.pos.x, 2) + std::powf(newpos.y - e.pos.z, 2)); + if (dist < radius + e.radius) { + return i; + } + } + return -1; +} + bool Bullet::Update(float fElapsedTime) { vec3d adjustedSpd = { spd.x * fElapsedTime,0,spd.y * fElapsedTime }; + if (friendly) { + int collided_enemy = FaceBall::CheckEnemyCollision(adjustedSpd, { pos.x,pos.z }, 0.1); + if (collided_enemy!=-1) { + Enemy& enemy = game->enemies[collided_enemy]; + enemy.Hurt(); + if (enemy.isDead()) { + game->enemies.erase(game->enemies.begin() + collided_enemy); + } + return false; + } + } if (!FaceBall::CheckCollision(adjustedSpd, {pos.x,pos.z}, 0.05)) { pos.x += adjustedSpd.x; pos.z += adjustedSpd.z; @@ -846,6 +893,14 @@ bool Bullet::Update(float fElapsedTime) { return true; } +void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime) { + switch (e.GetID()) { + case SHOOTME: { + e.rot += 0.5 * fElapsedTime; + }break; + } +} + bool FaceBall::OnUserUpdate(float fElapsedTime) { for (std::vector::iterator it = bullets.begin(); it != bullets.end(); ++it) { @@ -857,6 +912,10 @@ bool FaceBall::OnUserUpdate(float fElapsedTime) } } } + for (std::vector::iterator it = enemies.begin(); it != enemies.end(); ++it) { + Enemy& e = *it; + RunEnemyAI(e,fElapsedTime); + } switch (mode) { case GAME: { HandleKeys(fElapsedTime); diff --git a/Faceball2030/main.h b/Faceball2030/main.h index b45b248..08e1d7a 100644 --- a/Faceball2030/main.h +++ b/Faceball2030/main.h @@ -2,6 +2,7 @@ #include "pixelGameEngine.h" #include "Editor.h" #include "geometry2d.h" +#include using namespace olc; const float PI = 3.14159f; @@ -146,6 +147,8 @@ struct Object { struct Bullet : Object{ vf2d spd = { 0,0 }; + Pixel col = GREEN; + bool friendly=true; bool Update(float fElapsedTime); }; @@ -174,6 +177,9 @@ struct Enemy : Object { float fireDelay=0; public: Enemy(EnemyID id, vec3d pos, float rot, float radius); + EnemyID GetID(); + void Hurt(); + bool isDead(); }; class FaceBall : public PixelGameEngine @@ -188,15 +194,15 @@ class FaceBall : public PixelGameEngine EnemyData GetData(EnemyID id); Decal* circle,*arrow,*YAZAWA; std::mapenemyData; + std::vectorenemies; private: - Mesh mapWalls,mapFloor,enemy_ShootMe,bullet,undefined; + Mesh mapWalls,mapFloor,enemy_ShootMe,bullet,green_bullet,undefined; Decal* dot, * enemy_ShootMe_tex,*bullet_tex,*wall_tex,*floor_tex; vi2d MAP_SIZE; std::vector>map; std::vectorobjects; std::vectorbullets; - std::vectorenemies; GAMEMODE mode=GAMEMODE::GAME; Editor editor; int level=1; @@ -246,8 +252,11 @@ class FaceBall : public PixelGameEngine bool OnUserUpdate(float fElapsedTime) override; void OnTextEntryComplete(const std::string& sText) override; void InitializeEnemyData(); + void InitializeBulletColors(); void LoadLevel(int level); void RenderMesh(mat4x4&matView, std::vector&vecTrianglesToRaster,Object&o); + void RunEnemyAI(Enemy& e,float fElapsedTime); public: static bool CheckCollision(vec3d movementVector,vf2d pos,float radius); + static int CheckEnemyCollision(vec3d movementVector, vf2d pos, float radius); }; \ No newline at end of file