From ad01361dc3f2df1a0892d8dc68968f256263b3e9 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 15 Apr 2023 16:42:13 -0500 Subject: [PATCH] IShoot enemy implementation. --- Faceball2030/Editor.h | 1 + Faceball2030/assets/enemies/IShoot.mtl | 11 +++ Faceball2030/assets/enemies/IShoot.png | Bin 0 -> 7684 bytes Faceball2030/assets/enemies/IShoot.wings | Bin 0 -> 23782 bytes Faceball2030/assets/enemies/auvBG.png | Bin 0 -> 2470 bytes Faceball2030/main.cpp | 93 ++++++++++++++++++----- Faceball2030/main.h | 29 +++++-- 7 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 Faceball2030/assets/enemies/IShoot.mtl create mode 100644 Faceball2030/assets/enemies/IShoot.png create mode 100644 Faceball2030/assets/enemies/IShoot.wings create mode 100644 Faceball2030/assets/enemies/auvBG.png diff --git a/Faceball2030/Editor.h b/Faceball2030/Editor.h index 4cd6007..f80de93 100644 --- a/Faceball2030/Editor.h +++ b/Faceball2030/Editor.h @@ -11,6 +11,7 @@ enum EnemyID { EXIT, START, SHOOTME, + ISHOOT, SONAR, COIN = 56, POWERUP_ARMOR = 57, diff --git a/Faceball2030/assets/enemies/IShoot.mtl b/Faceball2030/assets/enemies/IShoot.mtl new file mode 100644 index 0000000..b875557 --- /dev/null +++ b/Faceball2030/assets/enemies/IShoot.mtl @@ -0,0 +1,11 @@ +# Exported from Wings 3D 2.2.9 +newmtl IShoot +Ns 19.999999999999996 +d 1.0 +illum 2 +Kd 1.0 1.0 1.0 +Ka 0.0 0.0 0.0 +Ks 0.19 0.19 0.19 +Ke 0.0 0.0 0.0 +map_Kd IShoot.png + diff --git a/Faceball2030/assets/enemies/IShoot.png b/Faceball2030/assets/enemies/IShoot.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8f5a76e8dcb6cc8254ebcf1a8cb631911a4742 GIT binary patch literal 7684 zcmeHL3p7;g+us;OZmFcJF}f++T+9q6GHwTHP!ST@=E9V@G&9V&bV}qBBI%-}Ce=}d zN*yV;l0=~r)loTAN=kEbDN5g-QPDc*eCIgl`>*f&)@s(8HG4nr@ALap_39 zh{*r|(SuiB-f2&Y)jzfvMj`?XDmu8fF`TxJp%oX3b4zA*>>n05?L_TDS!-$L=6@{M z{H#xNZMV+e{SK^iI%^*kZFE>r+tD?!Yx|>yma7f7G&@>`6seAlwH@|N4$cLVY2rZV z*_K1w+-`IxN+kAoI{PIFjnrRIaoKm)x!SyPa(pM*nuQqb@H%$>&AJp!f3|NybajXD zU|hAs`OQN;sgH2o1~+^hRkKhZ{K@sM#xI^P%$ggUAUc9xDZz)$R*`?d%%vwcD%&Ej zYwxb5+4k$ieO#IT+#<*)N3-I8k?Q}~5(b2g<8zo+Nd z4BarZZ&6**(kb?HxDc_=wD9VEl5yec#EwAZuLBRc%0=NeQ&(ru+p?PCxPy}k1dC18|qDFYITcJb$|FI zLGTp7eL+EbM8~o$1QHd@@{dJK00>@+9*gR`?X+mXVU1?*bY(51iJyPk)IAEpTN|3a z+6At3s@gi;I1>eJr6HdGoudjy9?`?aN`jmN`}TViL^d0mbKOs^-q07G86ezP+Ip!Z zLiBcy_6!|@1!_%iHKh%I>h3de&4yBHgGTM_+$HmSmx^i{p_ZI04oSqpn8D=-i7$Jn zpS@Woy1w<3SIGPAcUM0y5-;=l`BllLYwU{)+`*^ID0Ta@c7j7Q&n?I+fB2Z3oRuR< zZpwJhX~J|3qpYtTyjQ8VMRE*L^^pv0dlv1jvhrzkYh@n3*y^1HhN*nkUKxwbIdCt{ z@1E}maxZegq1ZQHkK0k6*cx(pXg;sJqkro9moefngZ{$H22H5Kvb>9Y!4Ks95$P8- z(eHu_8WcAF{87Kx_IX^RrdZGB6FTPn+x{0UgWDQT>9m*WhR1JBx`JPLEywY!w`p~0 z3wVbaW?OGBet5QbV+~SkratQ0lf_y_le+e$KJ!}gaJ^1x%c>h*cf7mJcf{!K}@j%lw~OhnaX23o&aaK~lsOvi%=`QXL_$^07I*{}M# zJ}`%NHr|UxsD(^863VZV*acN<4fo8mjL7XVY*48=@!Bw_rCx0^`+|O~?be3LhQXX@ zI<PP9-49g)T2(<=02;M=dLji1N3jsZ2igj^|4#PwcY#Y;!o7f(KT02++UNt z*TzxZm+jU$KSErTt+S?Jx7zs=lbUJ{dJmuEm5N+95nHwzoZ0nA!_=XmatCr^b5m{hEOtz&`o4syx!bddroQ22+Fno0 zNIfrCf8sR^`$c@bilE(eGYC#?PRSVw!;3vv57@(F#H^4v+Y znr>StqJ?h4oUD3mu+L@NevP7(!#&wf-M(qTY?jxew+pAP*HU*k)motzw|RHbBBGH* zhah+IKwVV#KDODklPT^#%`IJJn3gtzIA9^RMj>nRIS&xODR(e5dMjGD8}!jylvT*F zVMdkih%j&0mNYv$Sh>(_S;4AD*<}vP^wM(!;t&Fj(!k4PH&2E7*pR}k z7d(wHL~;GkNe?S4>+Sl~ALHvY@2+@?S$=j$n7w(Q`4D22*3?w>^lh zQZBl)U~8KW;Y-4B$Cj&4w|nYe;` z&^6f;?>O!FG$ub&b7y?~^heN@H|bd=lXHdB6HTM70Rz9f*Zj(3fIC_FQtiB?=Ux>P znkeE9?%X7^y3@ML;fi$|bJI>s$1CJnSJ&Oyj_Ommfox9|lg=R*wJ-EA z+Pdxb>Y%%oPi~`wZl@kCHdD=4RJPK|)iACvAr-4`ZBvfVP26=PG5uZn(MD8rbjOdE zE)En&C{O6a-N~y!9DZ>=Bgy{Q@=%YiAMJsUTG;r)8%73MYnEqsyeo-IDG*M|y8FKM zP`2w$Z?!j0Rs0(mR=aw82IZHwORh#|j^t?{njA+dK}rl-rlveLo3>U*bUf(zuD4aF z)9yjkW69pPn&N*-uswNvRavUU>*=Md-itlG-)4Q-R+(9r)=s*)qN*^)Ogr`P;qBVB zg_Fb{3$EIv^=HriV32QRZM<#mJPgn1u)O-2m&%`_A3t34{)7|SP*<_UZ&oK&?fE0c z8H8)^mxg9mtF&!a%J1D%zEYWCrSR$zW`@ijC$KpzL4T!H*=N zO!(2mi?WIS+189)zYvMo_P7t2vdCe0G%NuXdT zTw8h&(=nV!Uls1+P7U8cHK(Dhma1BaNH775E`X3CRxq1S5?P{Tyd?NqYDS}wGKgS< zCCZE9hP37I=t#UV-WUVgia46Mu7Y74?Xzq@Dm(*C7sU+;Zf=Kp>(#u zU@QfV`qiHs!V8wAL!+YU!E_c3<-@aLznRj(iQ@LvLn=Walf{*J!D4@d6fha1Vto^v zbVQcU*g#;<#!xx2`2vVdrAw(`a$_dUgNHkaXo9DK5YYq&;%R17 z5HewyfB{r2!yIA|88{+!423I?33nwFJT@vR6%D4MGEArtjbI8g%&8a(uz3U+6*=&J;fR8K6?3`;P_Vz78qj2RwhItp4%=keiQl(J$m#wIw~h_o;y zI2~A8NZP3|fy@qPL$c-3ApwWy&fx@GqNE`prJi4hDe!`#K?2AQ63}5%49WYN+c<4d*{=-=sKAp?xrVqm`!8@zSFJ0be(R`^*jIM)B<=W`wYlT#p(-zOQD zzTf5gF4wpe7#H|^cYT*@TndZ}{Jp#W$K+BSeVL-O;U^#={Hk<+87>ok%~A?*cCZ6J z0TSTTNrUYfutkOI=*8=}vam?(qM^ ztYgq`~`<%X)RD0m$9C^WgVy0GI#(WS9^B z7g`Gdw!l{i06@Y&|NYQ7;iHrME%s6PXiR@(`|CJiuThG>1t-I~k7S1gjO6~IJpXRm zzY_mXq!^8S3!K9^gdQh+Os~lKtNfGh8A;$@O#A<-ZJodL(?7^}97P;c71--fTI4TQ z_5V`adddHrMf!hzwQzFx0MAx+oe2lS`KPwPo48}?iugyDaTS?Me)X)s#aC?+Ysv#^ zIa8zj8(~B=YgcKcT`hZ_dgs5XAle6Mn*vpQ4mp35s?xiHb6uK1f)hqL_ml%A%PIA*dQRiM(G`; z2S}o#(i3W;w1|{I0z^rJgyjA%I`hnY-}SDgf8?HX_TFdj&#nhm6$kSRrnUzUYaQCK zcE@T6#HH{4MaY)B>Y*8PnbI#6?FJ%GZQgCE(Yt!}@27X0ZP~cd(coTh`V|@Z1v57T zub|K!n{xHMc5gfV^vca%mEN%F-mulbE#8j|`V7nup+#y{I#sswozM`zArQgp7)nJ@ zhM|Ux`H_}oRp|}NhXj(5@w4Y`q)cUZ=v;Xli9ai=WPGJ{kzg7;r-S51YM)O#ROxe# zmZr*}l1hDPx-N*Lw8+7v`)6hQ4XsiQZhf10BgCz98WHEb;nMy7SnGESQVcjZ zA1+rk%>PzR(Y`E_mzn680ZIz5IzcarjV??0k)wsf!f5O^xE}$#xs{YZ0JlA-{0>s% z@On9V!zV>l*Bgd|UuIaryLiFOxn1m;t_U+WWW&1cNl>y-=!Ol?JK~;5FB5fMtEg^8 zYn$5|Co4U#V2P02LOE;BA02d*uh3tLVbBoJ7r)N8W+Kc&Jr?6C*G?O7GvK`Q#sxKR z)?&}>oI}>2B6n;(azK+D*4EZB?0}bW6hb7d#YE=`qP0)E&+qk3L>yeMv&s8z>{WdM z+k3>2WRDjvXgDhqMn}O*u}mD@=5lm^d(3ls2gVkZx?H?hl_@Fm)li%n1(-r;dw+Wk zYrT+N4b1iJ7DPMQ8k=c4bPM3UQdN;ohpt~H1`3MV5|7K1l^%D5LaGia^#t*rQo^5? zlF8x5y1PeSKj;WU(HGZw^W@(%m%F^84g&9Fp4pYBp(obbK5Cju7MYf5D3{WWG?}7@ zytfAmx5*>{basgH@-(%=PJ-(3f(?zgcWh~O=)Yf?z2lV*kj=cHdtehN>8_f`_7r)0 z20|-rtO*7MI@@7X14*YIZZ!YQyh2TW)19+RkBIO~a-F-q-^7MYYd$Nz(;t8-%cvPY z5+6}Xjatv9- zm1YEVXdjf=2AtmoF`%<-Y)be&DtpQc31eLmcmUW65&W{?m4-3rl zo-AgK;_iIdyRN1c4c?kkpunl)iq{f2<$s=<*g`_jen*h(^}juO76T3MeIheK@4dfp zP}kg(n349v@ACUeXd05IkJc}fE8=`%7)3N+)z*gNr{Yc2D}GFziNIs}(-sDAdHjhc z*&x)#H(oE-&|&;J8Eu@s{&@fW2rg}l-uYedGji?wy`Pf9ku{j&t50GDH>dj8y^}S@ zxnxha0UhV(5<1e()4K&7>#}m%QN2R*_n<&$JG$H)R4+pFvV>`|<&RALTLF_zRqC$9 zt}$h`*otCl54#!?d0Bz^_NQa^^m~gHoRsYuaCAuPS?v*9{LEz7HfQe}9U3$kh#`62 z(fJ|5Dccf0B5HkyJ!`#jK(}F{1vY%LK;4&Q_S;fj&EgRAMCMXE^Xo5y2VU|tebARP zF#&*PGHxNKz3UX|82yvFcF#|zbW0y9&u2TZyD-sLmNexM%bzws6B7e?N0jXxnx^40 z6D3|V-pnhROZ%DKzX*m~m%SR$j2c+-K|l%I#0o_R{A4B^u`H~GaeiV_yRhJ72}@MN z74Kjgsx$}8j*5&?!ZV5KcZ~eLZt=`aI6-VsN*EY;WxyHeA1iva_vC2K(hFgXeZ^)F zM(FU*H=O7ET_qUpx%Gy7bV#0nxJ!zd}@- zg?&u#5h%>u{c_Rnq(P6`IGMG{@0Je6d6iM3kP^=c#Dh2vK7@S_-HfIcKFzt@QpWthxAAI227P1IZT8ot!Aa zRCYSi|8hX)>T!Iww9@+SS7sTQcoJ(2G)7QAt^Z)~LP;HnDLr|ht2o(;lpDa-)=FXb zo45Q5c9=5<^AtD^{j#VlwYG+jT1gFbNsPbS$wLhI^<4Pl;73Rs;XcAojaP~}xqV9(y_#AphODf z@Xl@`)tJF*K;UGYY%_C24%B^;-Ti8z`m4OZ#EgyFk_9zo6nxhYkn+ZRuog z?HoT7kRpza*!o?S zYr5RXa=g`k9frQ&J6$5I67DA2aa{)uJI63432k04rxuawZ%65B6%W^TcA1{n=RI7# z&=oYAUc?C+RqbCYA_@S(AA!(g^9>IBDbVoo1VBj`L2BY>0#m|>=VY;k_t=#s68-p; zG9AO7Xpa{t*UpV3%kn#L#&eN%%0oWS+B@Br)ZLb*4A@-*O9pJe;H$+IQ=W4{d?8EX zdAB{#oifDz;Hf>IOd}@IPtvh{c z6x`(1U7}}^hItD+*uiicdA|vSDkMeXx$Ch%oNx&H)je$b)f?x-8|d*3QbBEFFg?k%Lc1+@rMtn^E!OsX})Fb z0_HHOn7A$2m|k>v%6&^~9TkZv)9OQ7**N41)#@VJ3HjDfv*zKVZ6OM1Oe9(CQchvcxQLepYxXI8Dq8uOTp-m81`vgErR ztU-)$cDa~J0G>+w8FGbRIZOFvUDxc&B(J8tGX-~Zn!7J~9D@*s|sh{~1c(;;HNzb-*h=#?*)eFACqeI0$!K2b8EL(I* zD7#!)vHH_%)_z0=kl05amh^!{6h6*z(O5Ftt_JmbnRp*q`aT|*X`3pZ!`2N8T0-{3 zB4~|gg9v2N#bEbhZOOb*@T&@3&9|OJy@;?81pRWvZ4k40biPoMY#Q@&|@~qIq2A+^+HJy~KW#Hva{=MA}ZqOmlJt{GI z$b=4@V-S;^)Gv?L31&aa4^58;XIkJT_A4#t#l(loHaZFj zz*aa}qy6#@Rba{*CKVi8n*>0$k!9C3I2!2|)WV9TwuaKA2vBSqjTRj#i4RMs1XA0Q;eML$2EQ{S3 zA6H??K?LAJ2TT}}zSn^L8w4SbSpInd?s&EpQ_hj#QBDkT81Gj9i`Idw9c7X;%={+e zZ_xA5l7Vw#jRB`}Ok9ITMcMd#9vjG(l=AJHZ9SA!l=A`hZRk{(kC@3eeuI3Xv1d!K2Ls2Qmc@ne?Jz8jB1+*0llw4AmgpVk6l5{NP1?3qw*OOi z2uoBFG#@|E4?2%b^kD>Y%bC{3;L#E9TC!*@5B0AU)lvjvZvE?17W9kZaaXv*|J1UCG=$`I*P=eU$3$1mbZI82rngvl?t(B z5sHWT*J>>@A`Ej_&KCM^L8MLK4wvr?Dd`*xe4-51$(lw zO+?Ze#%NB&_9F-M+ze4;4x{CrgHwbYOh7~je5+||3#+N6q%LSwr+?^QUh31Lp`dxv zCDPL!Nfk$7H$Np?btA1VB3Mlbd%*I4H)+BVNv9YRO&;sYQnY-y&$or~m|M@6@?|DO zGho>P3?S*nqyM?MHJzRp2-FztzZ~)LpaMDgdn)ZHbNSoqg(n8=C(NChf;r~Ml_m32 z+V$>>UWP|6gdJo(l}LfD@3Rl_Trt!@kkjAuZXpnXn)_(!mNtC6PBHd`u{i^3PAK6J zZ3)TXtx3O)u0UL!B@zYAo0hnPf$x;2m0Q^R(l}eEsizWaPOCbrNxei6G#XL@r* zD_>smqO5GTCvzBU*J7GU!4(@JyWcriAU!&gFK$}UFkoviF$V0g0nxu2DqxDFgXddH zwtx(zFJ%o+-DTXkMO(P5dD0jJv>l;>LxiJa|1|>!4ZJ3cPX`BlSXv%f+HX~k;wtH7 zb}#4wn-;{uqoNYIpi#L(xqsoU{F1FafX9_yh~ANeu*+H=gkq52hm+=&RbVF==t$v3 zhB#KZ?_UqSE0n+u1hxZSVC?Qwa35VrPTI5}1r|BQ*q~8tA@)C%bJ@6VJT9NSl0s;O zoH3aR>6s=u8!+oA+u}}VP^ZXrHAd-SRa{uMF6y20RVe1p|yCYQWF1W&cvHPe5S}Q)EQW z(?V2-4KMhkMj2-Pb}iU>20BIP!Vs4hpFQ}5+n?;5?CV&~{b|>`#^-GZn6M)GzS2qA zo2Mt|N8_iaBaps3>rCmST(?UYdyGsHHf-`6Y*aKA+1{x=Tr2X6qHk>4(@XkoK2EtD zs4&GY;Re=SZSK8su#SyKI0NrOYVmC$PwWS2x=LWG9x~K?i(+xsV)5O|?4)bJ##x zAnAl_f_Klt3mIur@V7S#R6vm8307CXcPOEOr)2T&VE^LakEl=51K2CfEnwD8yM`rV z>=+Smgki;bB;jS4tFmZ_3bt-ZViZ^GV;~@vSlE`42TCSHykg{t?bDh>yb>Db%!nvz zFdF#HN!%59%O{hzjRNjw83;NC5{szyOm>+%GZny@x;fLCJp#n^aK$BuJf}yfo1fLN zP#5%TIWM)7jxxouppFs?P3eFsBOLo8PMeX}5&_>zKN?nnH}80&y48=!^@yK~s|9y~qU&w}@bl(huk!JEeuugwKwKovSLBGMaF z2UO!HB@6r80A_p-T}r zpA#6cjV0*wvpoW3=CEh6v@JTV#G&nDbTR%V*f;N?<*;GBcvzv*1>W5fH+pj#Wh8-S ze2X_N!UoUFm6+P1)rv_v@?O^^43IwOB1r!$mLQG$fXYtdzE!gcc}u`qQ@=~fQI`<2S3yBu)HjD zU06lPOWhs32q#k0F+FyVz%Emy!^B_WaD*;DKAa`chqYm)Au(YoStl^%FlQq;@C}f! zX~cWSAU_qixo&A3NEwrQbc?`g{V~p>8!r5X{qg_#cX>&fg?=rOdBgt_(AEwsSmyGQ z>6p5O+2jku-z%-@gSWc}6f$hl1j!EqBK}X)W#-3+j|9Fp`hmjIcVP!3N<-q)8|n-u zIdUO4{Q}0)NZX;jQR$|17l0E#^(E+sZhE>4k%tePHRhHwFi8fo@;y|%ksw2Pb%+^ zUc*H4)KD3x1oI&*5}i)QG6mdU1G%7DrgNDe2Sk z%#Cpt?iuq4Xm(9n`fA0v3OC^=jcY-ktDpOc@i=ck8;b7`)j^msrM8N<(6P>KDQJe? z#iZxvxh>ntUzrKB49DN131t`GhMe}PA!6-+M0a>^VtjL7y8qhUJ&ExMN`C8k=LAzyo=_@KT3p{o{jd4d$Chex!nlUFeCkbwM5g9KDo z1#(teTUT$1L8|*JyiFc1@Cy)WKPp|EWp*6Z^I8szQ7vW<4Ch|mU|_-X?QQL9G#9VY z^7ZRIev+c5FpnI69>Pz7!UN+|%RC=7OukrS!Rg$X)$v@oiLlN8v<`Fpb*pxx8aM=*(%YXn&`@-yRD;6$QJb@p|&WN7r0G7@5vEXva6x@z|#jN`yGf#L-=D1G3z^M>~)F5hfqzG@Ws>fF2sV5OJ0R5>maQ#}xj9J<8E;xa)EkEnKQVRZC#L8}RxqXit%?D2 z^oZM{dLY`rp+Pqprl%*9qSKGPc@w06ye6jOw=PR3dUP~l+bzFdC+%p41Q{5Q^26Lh z=OGXvvfrO-VkE}{f{_``Tl~v_+Cg6LUtOBvNvE8BLLA^)7;m)nfv<+yuS`52>9=^? zeH=3WJTk=HT`|0(hvH0GAGPQ<)7X@5M4gT{EjvDz6U}%KmBm% z%=3=t{2W8oMO_r7(fqrncuX;UkvZ8aN+M1Pl8tv>^?KfiQ4N?;D4?o3mEz6aGn`sH z3Z~R_oQ*9zzYlagkL)Rf30k@=nfRS_;W^Cb;oOJ^RiK7!>u|x-LIp({$=rf)^eo30 zHxbBSR5i| zzar6Hk@J=Gk>$kzhhr3NUSis)M~3!=zjQoK3+k`NtCh65#;1|8NCLn__}W}`;6eGA z)YMMBh|k3Fmi6qk>5-Z@v$moTHauYccGxSQ;m3z-Fce#nK)(Mop|SCkrILPV$ExVZ zi?2c~y?P&%qw}9zZ{cYrHr@#zf9z55MPoXuP85A9x^n!|rh1;P;$AOsHth zMK^p3-jIIijSt;C=Nd79Fmn{%IHe{gG0_Wy9mfJ*?l=_w_ND)b`&nMQ{AbVh4^MbVhm}bW_3yQ zoZ12lxbj_R!(hmA|3SUc%7Ue5Dyog@*x9t>E$fa?zfI#)b5MH4axJm*Z@f>VV}pxI z-qk2S3XN&}VL!byU)&gFrG&2=ef?v#>xk;v3x1NYF>~+P2ZvqbA6ZVP9lv!_u*%i_ z5?eQ&v9m-iTIpDk=%tn&CXi=*%YZ}EO%CS;{#!(ebHR7N8yxhZ$UQrf6>?tXmDSd< z7xVEM&N0R;9_~>o!+J*KUw%M3a}Z?3gL+1%tVd;|lTWRzuC}EIo3jB4+BLk);7?RU z2|m^2)6Ueww}>=>_d6Gil9Smj}oD2A}23XjxRY$dTYyGwQjEl+@(b?n@k7Z}# zZous=36o03o;gJiQE$J<$m|U>*sIspGV|j}aj-lUk}CjSqFrHn+cu!-UAOUM!#qLI zIlmX!zVR&%j9wZf*H<|NlT3*|^UgCu&^%BBX%n9;?x?m}`R~mZOeXW|14h)__?wMI z(nfw_7xhiT2>kmRr;wNM$APJQ^WaqepW;z7A-=d(H?oooJP6ceF$~SSMIGC<1{$Qq zCo_H#t7sLRiNj6y&8imx^15vQ;OL`r)8a{42j=kI2o{5jO#`-cT(IyB){JIE<=4J`GLg!RKS;#r8?p$-?U~<^O zp){#(z*fH$C-p3nNdKaOr{?k33o%F+CAf<2?0dzxcL4cr(HWe)r3qWzTczed%RCD} zuhBONJ*c0XC2x6xt=^>ahPrcld%YrPu!jSFsZ$V-8Q`kO!btnZUAFMa>sWrsU0LpW zm&x0Ix-}k~g47C0B?LMrg%|irW?FPQBi4pv6ZXhUS&OBm8JzA(Z*RbAib;0bz$j#H@(@C!#Ib0y1UNLlM8O=M6P&%FED>S@!bVy;8hJs_I2)IL=YQ0DA60Mz* zKV+P5G&0^4>~zUWv$Bry;|txMEzmC&2=+~jAGGajR)jeGP-+7ee;SQiXhYMpQH{A0 z#3JD;p~ch$P(S~Nm{jGmIq=Bb!s3yEf&~4@5-~k*l+AHub4)-%jozQ_vY6ZH5n|ri zR^2h);gVk7waR4{ut8yPw%-&ZN3ABdpP@DNk6PaWMF|MlUSiqjv#OQ>Il~2-U?RqV z2nzTR7y{55Pap4QxxHVi-r~ABu)WQrNy}FmVeJF40gQKb7|(^91QPcXaMQ2%70>(P zEDQ(s9xljm!T0C3)j-k%BaK8P9|G)~fQ!i<&we~8KWcc6^&-XgLb;1iFO}8PCZ-2P ze=w3o!FsI6oB+YZflsP`Q=sJ()kGQzuM8`Vgsk^BW0D&zljd@aG^UW;i0qu*?1lnh z$lttEL*3yjZ@O1;S7||uzvmadnPZN%dNXf&fEn?F2e-XsclDgPVDI{n`szsyq>m0e zjedj;_#pP%)#}>-ScLjM&5-IA$(YA^&aGoBUo%qsdB@4?JJXoabH)XxbGRGI?7*`R zqel^~pehWGEEHqR86!q66PHR`7*%)3HTu$K;GZifiDCPqj*D)5Id%&(MAz8+P-11a zUPyAqnma^ITo-5f-0afl-|<5Exryl_c70%6J;nNiWYY!k-f?lJVvE@`YOX6J$2SL( z4+hA_a{X;dSkC251UlDKvI~ZVDp zVhk$FVnRQ5*Me+3PrE7V@sE@sbI!!XIlC}_Siy}h?P!>fT+IM5zQ}P>IJ`-c_7d2V zsmKMsLDgJ)jr8$HXl^F-z3QVa6O858^z_fi=G~Fer>JYfWQ!QEd;9k15~Xu_$6~tD zIxcrje(`zHP!$oSREJ5wyyd3gaz=~gT>OX3E6>kliq>Qoz69i1hi6_)wSfSeT3Ghm z6{ABIVj5eX%>w>`&keJBr>@$WFrfGL8SEk7?HC?vXSTH^`gBe9Jj>27r;X$&VaMA8 zEqBdx_9BfeucuOafF~E^gqSzwm8kO#Pp8EaMu)r7MjpEq`(++5=j;#2O6<4&^EO#^ zjkAic((o$62CFcKF@{?oeM6|Lqp?E4+_+brdA!xAIpaCAMQLk4&0c7j#2>sFwbE+Xdxt5 zLYzBa)+K+KQql`Nk;NY2W8$@pK86};`7=h3iucWxxyjcI%u_kRKf(iRWU{eXJ(=j#AvP}Dce7@O8O1ee}Qz}uyYF2;R!(ETbbrl_hN(}JBoW1&tJ~PiO0kJunL>u>WI*V zY+%byWiIB6k~u!*j)$X2AlUBAU{&kyNtOEGC}pN2Zrra@nA52bDHZl~DlkG&i8Bfm!2?8oN1 zoNs)3T#f-%Kh$$7p1i7;3+y4l{K!{ZQapk6C}>~jmJ%-J-t-0`$z^3T%BcK3r8$3U zwLkxvNYNkVbqPzUl-#HSciK%k>6G1-u1yc3U*rFXREI~M#S;~ zP?fnY;{gpo6f~(;?$O*9{t|Q=`F;vwLOzN%m|o0YNc_vBMjh&TuT=-cRxU5$2x`yd zi~H(=!FJ8_+|GK@YO!Idbe(8fc|tccq&x83Iw8!Yb2}G<1g|*pbtXlkJoUKG`To?Z zt0L2`-v@c@1FUT(T5T&5=r`K~0;9S$a`>%NGt=P44Xk(mBJ@SN)q;^4_Kf!;%POFJ zwe=+s3f%xlVAj4@T22g`3Os|(vN~mrwAcW$s{TWab6LwhP2F}Hqr5AR67_J7fnEF0 z!a~rZOSlC4!zgxWxc!Nf>f_z2^NMc=BnVMcd^57MwSMc^clj01!adz&3L^%Z3SAo?oh?xewTC|Fz zT9Cfk#(;X4zSr>u;gbrTd#^Y7Gaz%LFn>{0ZkA8Gt(s}9`rPoY3%=$sZ3fTLfGo-x zF?vg~yh!w7?3RJMzgbb_cQdd=MxRX>W*Lmc^>4}1%3uR(wA1hTa;$M{97haON5|yq zN0sTA$%2}B5LHA0G_v{{niC4n$0!;-q}nGP8e!dUx{8$+8%|?#P?&zFlNXI0cVqqA zRY9C@QYz*@kb!o@cxv~Wac>!j8;)*v^wN>5Y!ig109*4!0?+BMO zU-){6{T*K_07}ssZG3;6>Misr5ST`!lXoVDym(winA2Yc!u9=q3AVYqd0eBqT$n`* zBANFxdi~_7q&~j*HRF)JTx)}t&4=(v(DTQxa*U!+U69pB29%ZThB=?*^_7Z`T#&Qs z6O0?dFO|>5bX_l-_+fzZi3N9;#Z4Hw{#pCS#cfd!6ayCiDk^#@x#G1G8590uR-sP5 zWe%8&kms|H>wg?M#$K|g($c|0JtjaMJ2v*dMpR3DasDmA(rdGLt6mDl9M;z&9!4;A zn&xPGy?nU?uM&3bUh~BIgOhJ-;J1x0ejX?UESS8}?^B7@4xjuV`63z^>Rkn{W=KNz z)M^kcH^ErZC@Z6%5)f+iMuf5ZtZ#73c(Zy-E^etg0@vaxNx>x#o$W?N=YA(dWP3l` zmHRN74Y}Rg{w|?;+`k-9zifM9`Evib8uhnt%Z7e2UNNV>?T`gEI2aWzVI$p2WCL11 z#uW-24rb-V^UDfHlY>b6;GapB;ZxYgn79dn#P^oK1+jCG{BYMEX)#XmRs_Go>A0!q zjI}kieuO`#)FGn#2Rt2AYfJf(A>9qg>~{O?RFU{~-znM6G4B}W!$8UJnFW^I+&w;j zn3J?ybLi>912_-jC9cbgd4AlJuDLd^ULE} z6ClJ;TBhZze=buzph)h^4~wQJ=aWpKe%GM8+SuQWrba$}QrutG==8l|vq}99umES^ zGe_VjS4fYWjQ}NoF!xu~+=yo}&H0+%1X!Cpva{&C;Y#d&{HGUXXtVIb_JG#}($%O$ z3692SyEB?gIBdbD2pjJ#?d6%dR=fgTyz(~BF!IR6SD{47G=CIsdD#|;rV51dx8y^1 zLg(4f<^f4dm7-Nr>q6Qe11c*pZJwk6YKpVk1%QKlzg-p-Rz?qE%Zbob34Q(zv8AuG z`Mhb`(oS&e3or_ctIm#!VIWiDxLJ+WU{<;*KuNPo@^4lBHgy_Q!}YkyVN2i!2HPA8 zXlFA#kxGDZKFXh}Z<5B~0>*QpTMx@U{wvCbY`xl=`VwetB)$Bh*DETCPTOD14qMQx zg%9hSY>t|tOGA^mVGjylANI@vueAVf9U}R%+5UgAfPs7DFOE}x&GDZZM#c34eGv{D z|2$JMvSL`|btqr6nO3k&RhXm@%su<*I#=nd4R(PT;nsvk^@lM zMAKW~@Xbtv`Vp6%C*KR+l7n$a%a7KWf)D}CPQfFR*lvB{ zR+?ieI5aBLwWX4* zY)}I*{Iw{Jf|d~~PlEFx9Vb=?|0I3;4PY@dcI-(bF*dkVm0yFJRclThRrXZqt03g+ zpGXquf#jS{*#PX0D2d-xa4T}|t?)J0B@|n?~S;TQ60Hca9bUGYy1*(ULG0$lYmU=?pv}Z(Xj<3eobwq&5 zp2mW$;hga%278Um>Gvsvohk<^>aDM{tt!zyKC8`ZEgA_=#FjLLK*+sA0P)DfcgA1l zKSw__hi44C;!G#*wh?azVA{m6nOd(}N+m`qcqKAj6OxLE2l4Q9{-24?+ZpSv-94|l zaAp&aP05(ob~IS^iaEu4VDh{khDlvqpS7D7^WB_cDRfbp4)x_qaz&qKS!XI%RR>PE z!a7$yz7X?TkX%I6!bh14%*h9zP^d=laPU+V=7le37Vr{08Q*tp-V9JT(7!k8&ONmK z=eVn5a@lXcgOKz^{9f@)nZimR64N9iG4wy+b47a?NjX-t`ozbhHyeS1FUE7m)>*qr zde>x61YJ8_CT4s$`sUILj>I~8)E5-t{fui4B21F_q|rmJ1O&%)_e$MtPVTC<5{3}8 z1V9s~wGxW~vcoWmV8?f}{xe|tYZRtA;iApsyiUNMOq<&<=WvtGUTF!hbpvgd_d3S6 zgpjoZx?Zjq!3dWOP24l6}2mt{OaznEuu|I|*x;TKKnJE!Hpx#Xj5T=UUd+^5HV zR(ULwceO>73((pi9*&&p73BRpH>2cbZPJyS?w7#xiF7a-@3ZX&p8Xg*H&+!wwz`K= zy2u^G42sV)X1@8z%YzbZ-`y2fZHp@PQZDZ|W-&xZxm{8QWkB)|9g?yTX8p)aWSlst zGYw4ogL6oVz_Im+-0iWj`$Vz9D|Xmb*%S4Oj-w?uVc_7$2%Lxt@uOSKr+(|DZ7_Jl z2m|w>mg#m82^?yL{aiGb8|?Z$mxnlj*~T-!i>n8N1x}rm7eI}qEY7%T-@Co{d{f2Dmz9whjAWs5%WY%L zosFK#C^Vn;aF>gW5T+I7LZz^^Oswkk=2xpg&u4A{uW(!cyMYs|PO2I-ZT&_rMzAth zX*LCi)`#4Q;-J_S~*7hn?e$(Kc`Ss$~eReB>ee#6Xn(W zFjKEz6D+Z!Z0zsg=IDLjmNovfnGSIT>-=NyYb5M8$LFTS7S}H5<4bX*Rh91*BljJ7 zY7o*3%+>FiN{H_e;uYSm1|hLKdzzE~U83^Iz4vd9Ly&w>yov3{$f@r|QGa30e~#B2 zVV+Vc5A-2%rk@SqYky6eJSc7BRT0EL4s8g8yube0$l=`ora+YuS%0)j31L@{Oan{! z)}qVU77ww}hFJN|Rcp3f6}f1cNh+R?~MDN+fVE-;4q>=!lH(5F8_!JF?mab(#tQZ)80M0|D4 z{N7N-m9MPrZ+}mbs^9KmNRj!^w?8khyRF{NO{K3x4;{pQpmmH_x=|qI?~G3PCDgD5 zDsONJJz$I8SAK*9gFL;5jLg^YTw$aRs3vQVTAHMk$I8P zi-5y3E5aQ)k$OexqDzp|O5}k*2e+$1m6CZ*f9zB3lv;RpVNQfz2_?VU`bxJBh{q%S z$S+@;&H&o&e@_Ka2c;5rQh%#7Ex=3(RLcr}%Ca&pK<$(YT8oB0$De5W9-YjiS#9n` zo!bumhxOqT>hE249iLwM!D>1EwT-6Iv!X-y$O|n)90OnDjkjm1a5?!{s%`spT!MwH z5=(bIq$~lgb%La4tD1k(2D3Z)y%E*tFG#jVhf8D@f~a-=VXow~)N2AhXUJtiE`ci zo{JOpDR&k@YyI{1%q`sgJy%4!kibBQt+?&9RpOoVCL~So(Qd8e=UOb@x-0jyVNxmK z>@>c|()s4)cM&_&AK%HUXUmwQFPzgFebW};_X?1zeqjnE4Odu-ZcTm)e|LV)b3;7G zRRc;(XnCZ{4qk0_fy$EK^?VP(B>`F)5SfE8-os?0&%%S-}d{>P0izP+^QfiL=XP=ensE&LRhPTUH!9T zzFgr5X+yVEV~1zK#|BmnVuv|8{{Yy)PE5RUs{qga`|d?Q`a*c#QE_v?p-Hggr)fq` z5Zwn&{rIj*INqS%1~9{)Iw_m4sD$M?{a&boXQ%Mv($UE+o&>(-DM0V8@ES;P+%JnAD#gcZlK&hQno7gl$I<@ckS0a zTa;D7#ME1Vr;4Sfmq4<%bo0;eAAdbVsSkJzI`9K`fo<<#Xen)9q`b87;qhcI+@)kM zxO#@vUhaV{F-InLjr|p_#Nx?({m(I)4C90bv|v4G>`Aun*cFU>#a&+7 z>NU-Gv+j2I|6F-?;v)Mh#$x3RYtydv(x^Ym1HgcRvhF6$&1>IWE~D)}vGt$FD^`u$ z)_X#1yr?mwk#d!=ZB_P5&++}O9t7&MdlH=QN@J#9x^jSvarqszDJt&s|N2Fq!Rp8N zBnS$awT!|uL$#_$?z@cACx@XT=L(a^JIA~AR^Dmiy;h{6KKsBAft*CW45awp#;|nP zY?Lk{U}FO zx|#AD#3Xmz5NdAKhcn*neT~1;Ev}q2z$F?I@ zYZMv}SSR^EB%cZeHm>B%pA>k$TjIr}Ey4z`Z{!W@n=VkXf9~4wEAKme30y%>on>!~ zhM15-Q|m}Gfqx&2>@fQ$%`>Xp=(S#Ye(FlN_Lb>obx2oeB>euL2cZs>uN36O@%LemSBj3KR^a_=Hb5X_YyMLb z(2hYM4^;ns=>fSwARD7U81L=^3z)9>_zsjSNaW~d(c`245D5l}^q9@6_Wn~>&~zb? z(_jtocUnimAd!Y^=2f#@La#M~i5CK?F6bmsbJtnjO6H~g0g2@QH-kgEm7e@uJiL;t zEJ0>rd-%8hega|Xg1qM9{+q@jkPoMBYrh+R-10O1LN?01Bdo@%t{jGfhmEF(K8Eg@ zyf%1-Ee*LX_fDL9>E{zf53mX{{BJJiVjvK~#$l^-lW_^p%)w%ckhBW2%a{vX`!^?p zoTC0uGKNGh{@*MNiCymn&3pd$)St@w3j%qe@_$n=#J|kh? zoclRus}DI=E&0JpT7*DmTB{uLXWU;HGtRZ0>HRDOQ;0kS(i@kjZYF*{C?kf=N94nm zt&FKYE1&zy#FVLd2Ix4;rD^jb7Q7A^hB(StHEowwu#ezIKDp+5UBBlYtMXg2! z8VYI@gg~(nh!6r?@=j*oBot^nYt5heHTuh&yU)J+?0fG1zVDp9Ko5=)cs2F*C%2S6 zP`YP=MQ}Y6MIH!wFxiufXTFKh+>p+>gVzbeu8Ez~LfRFCwv)A3JfK>rkDr^o_$`Fm z@=RIGkOxBsj?;x^a3gkSpUNj7RJAsLK7t+9PlYRNP=#MVC+2hTbsl`VX|by=?k-2f z5yY)Ylnedm=Jc;=&}Es2jz_3BXq6ZW_)TID60aYHlJuu~U6Z;D(+GU=Bg>2J5zEMV~9)$JC2N3^Ka17;XZX-0^iB_k2_!?7 z!JjP0MG;Bgg$l|QP@#l_+Hhd3>DLdnR_?E6&x21mhv1Zhm*h)_mtbq zmqxGl?&s2kv0$KlW^_iA{c8m63x33K;!pqhnoDuAxa&YTkBZO@(qQ>TN&Z767omZ7 zYEu_?3cfrp!0Sl}mDU6|K9@8@aVI16Y6&H77kw#|^EQMk0^ZQ3rLm$+Kc|=VdhMZ$ zjZdS%X6K~uawp2f0&dz@8j^tmi}d4VVLvot(dl2Dm|Phi{3?p&f>0pYBVgmf1kS>s zQh^O&6?*z6uSVKcwqm7ZOxf)y2smgNKHjp?bf^)bNuw1X%r!J^n^L~;MvgPAsimuU zVl8uET-vOhTl9?x{ms)hF>?D(O#{D-)wMP9Y%n}TF#8FAnkuTU{9iE#X95jl|PfKWW{p?_!zFt!7%DtPlRlHEM+dJ^4BZ8ngMv?kBcV>^M8#q@9D zaZu8l<-e1(KmQV{lNpFHFFc2Ok`T&1KAcP0A=ys%-}{NKN&--z=hWeR$_6c-IGnUO zpqh?FH8Xw^gz7Go5YJ46C<@G6$wRZqKR_NwSbVWc(Q)R5JEZ^syBl1%4sC{Tn;g(2 zyCJeffpiCw$^B!@9ZS%)M11TnE|$Fy3+M4esKzu+z4$gkW#SQ%oij4(Q)U#46RM%6 zxentpHYo4p;~Y2{=Mo)Q3dpEvh|Ul-^AR+ivyo2<|Z3_ zvmHue%gjwRmYM z9aYVn?PdovgVnq_t=_b{i9V~)( zc+csWQm}(ig7sjqpD?&Sr`=uo%JoQ;59?Gn7X|B!A)qe+lKo<-C~>tZh4Y zAwIN(Sk2v&e&qf$#wx&3P0k$EW`OI$ZJ?$Rs$Vxuw41Silw|0q>DfujKRrvD7}RvrCk=zfPX zbYA~7Y9d0vE;V`I9}?3;z`di^tcVc`Id(H=?Fvg9ftNfEB6?`m#TE*25`bf(Ra{%- zEI@Rm!8tHydKDpV;cB?n{p-ufs(X-%y8sR6=HRA!w%5n~gX$M>`O{K{&ecPE`DR3~ zsZ=Id8t!Fl1@ce+!8_g{b;o_C3l51qDqWI|4hXR(-~#`zDwhR#ELr8XQsh0TZNbyK ze98o+pz%z>UcuRboU5@Ug0|^?GO!n~33(N_=yd$ARlvL9ZAZjJKP#q5R+7iN(X+#O z+aM2NWX|}{8b5t>WNK}s@F2{~nP3VIs8k+I+GM>JYFz=~YN)L%!cQ z5R(rcMhHKH5x$XnXJl^`o<#t_wpJl}Hil5Q@4;6bI6_6D3YUIPpY^EqX%t~FWu%Zq zNt+(sv<)N+7J(K-=q!-8a+kM#2QR|N(Lhds1oQ?i5zlF{9)K3oav{|YYZKN?Oep9w zj0JNKgkGkcQJ}pF@5$yv&2ZjoKo=)_mT15@F6Pw!x7|`e+o7bxX*JA8zY98W40>|o z67qF8sSD?=gdr4rq2%Zh!wI1+2tI_q4jQKA;4;}5&Ey2NGC-)IyhWpMil-INKZFz> zs4*3FnNRZY&G4)pg;qVrBFp0laLM9Ob9f$Q!5bIguoRxbEahG8|~@0I&a_|0TuD-SaYV{?4i-8`81kE{hIVG#}Wr zS0b~Cy)u2>!p6%3sREV4Eg=476Unw}e%^o>I@+N@|J)0`>Q4IOXZ8^#9%Hj=<{x-= zw3}3N|58w~RP4K9^#}fY*Q$cHT`s39BGT`Z-=DX=!fRKz^P$A}-hyPlbhTclN~cB( z*NeAJ?m0%m4x3!XO-^kl>5*IsgJIMZWpZjo^#d>9vbdU}&Gy!xKX{ibb;Y{7C9>_@2tY>}pUK7^S>LgVNH9#>Gq-agk8UbAWk1oyV)`=?d-&xA6w}x4wE`#GrZp^CPDO)vSc9kK4T&7E+A@v4 zh<0eD^suo&s^uzD@_Pz*bw63CSG)GgeQI^>jdU#DP=8oe&6jWKo8GxVCUp-gp*q0i*4=cabUVCCv${plcVpC5lMZ!=keP2rICQBXSvW)HaeA*QV^z%nj z&MQAwRKW7ad_Gn2R7I>9Fl>=1X0oDi!c{+2PL&n(Xjtatn|=uvKjm-W2r(HyJWnd2 z_p~w}=U&3*8Lk=Lq_W##p{<9dl(I;{Gf$vbBhU5jpD>2X-Ut(D%-)RM;Zn1y9r%|! zX_zb3IFl{mNl#L!5|fCVD>t=@a_=a#c!RQ4{Hw~)j3;s&6AcIT>LPV^Iop@5-)f>z zjTc}H{V0WV5R*$7A}%!*>oi)1Fb&!+wQ`rTlx-PQAmCX4<70KRg%NN~EKP_~Z`r3- zel!4vQ^31!8%B8Fq+hQhqTx6ai>@TrGIsFZb-E?s0;`EUy5tvpnqD2L1&ept`sW6# zh4He^5|^G=TJHgN!-cspc`1ClFC9QS?8JB%WhCetprq*J@Z_0PxM!&6RmDg2;sOPV%3IR@o5b!?(px_f9;HKR_9#sDu D#6h2c literal 0 HcmV?d00001 diff --git a/Faceball2030/assets/enemies/auvBG.png b/Faceball2030/assets/enemies/auvBG.png new file mode 100644 index 0000000000000000000000000000000000000000..db95ba456c3b421f4ec33281555b0be6cba960a9 GIT binary patch literal 2470 zcmeHJeKga19G<*faakQj5j&Bige65NyS;h2%S%O(YPV!0GR9lXRdt|nt5AN@N zbX}uJcCEufGoNDb4Z(*iG@pAGprmHp-qjs?H|*g06aJ~iy9>G#T65@T#sNuP4)g?t z+Z%tjqHCM1JkU9JXG3apK0XWI*0pL=;j=tE(QIsznbTZeHT14th)KC<9WhZI9#R$I z!o?a01l}#%)!&qcFmb!i(X3_c+8pNW^R;79(eqox=EBm6iG;yH)s{g2q4%w=&az1> zz7?W*lE_X!K#E9_mEV0(K4D{_qdTG}m1e-|Fw$pZj4Q-2Kl@-`dnv$ynmZ`m=iKr< zbS}~+hI$)GUJWLkJhT$*lHpOxnl7l=wMn@3Y3fMRZJP@I&2&X0k*Hy~abAO?q66D$ zQ$>w4=uNx8BtXRC^^@eMsyj-{>&QVkhu&%5WG0E=Opyvzx&4W3=xe$5;eMoLP!Hdb zgeoaZ%{x!Hp8iUaRL;2fP#=lpq#Z#4xK(q#MX zO0U<&S|QyT+N02z`&m}QzC6WT%W=`(AuTL8#kucC&ha=O;MH1@BWduVK@>lm)J z2o6y3d36f73g5U0x7CDuXHB9l&R3)UYzf+BzAJZI<*;a=m|~=2bVIGHqTyJ$XT=bF zxgBV+SeX7Mzg@`L134#ZOa^I-UA$dfPT_0%oH1TZ9%qiQpehUKfgrH$gHjc>E=hvcQI4|~dNVhbOd++Cu()8e#o)u5k zN0%?m$;O^}_4FV*x!Fio8g%clSe!TIlT&WW)R2sTt$Dp;HbpJkJli7ML?A$b5c1hQ zp#u{F9c1|Iw3?8n%@z<6hh*ZwpQ zOCoWK^nl@o(_R>PO3Pn3OUAGu(jkho=9S5_6^LkumiX+l!jo>^)x8kw69(@Z{GbrviLw!R0%O(cn{RVyHdrD<}RaHv{jtJYR zxA3;$S~Sjw>u*dY5kzk0?^hTnR#^WfO3P0x;;Trw#) zUKle661UsMfTGWm>_AWMyFx&S9zUH`h#nr@^Iso|z_Cz4#}Bkm{U1a7HIjc|zY|7X zql)PHc59Fuu&b8O+pq8cvAX*BI=lpNNKAblBQl`b$e7IXw7<2Mk!V;rdmK#55 zy%@V81RC2y%`hPlfGBEU& WV#pAGmI3^Dft>cc>?_&xOWfZ{`WT=9 literal 0 HcmV?d00001 diff --git a/Faceball2030/main.cpp b/Faceball2030/main.cpp index d78792d..18b8fe4 100644 --- a/Faceball2030/main.cpp +++ b/Faceball2030/main.cpp @@ -12,12 +12,7 @@ FaceBall* game; Enemy::Enemy(EnemyID id,vec3d pos,float rot,float radius) :id(id), health(game->enemyData[id].health), fireDelay(0), - Object({game->enemyData[id].mesh,pos,rot,radius}) { - EnemyData data = game->enemyData[id]; - for (int i = 0; i < data.ammo; i++) { - shots.push_back({ data.reloadTime }); - } - } + Object({game->enemyData[id].mesh,pos,rot,radius}) {} EnemyID Enemy::GetID() { return id; @@ -51,12 +46,34 @@ void Enemy::decreaseColorFactor() { colorFactor--; } +Phase Enemy::GetPhase() { + return phase; +} + +void Enemy::SetPhase(Phase phase) { + this->phase = phase; +} + +bool Enemy::CanShoot() { + return fireDelay <= 0; +} + +void Enemy::ShootBullet() { + fireDelay = game->enemyData[GetID()].fireDelay; + game->bullets.push_back({ game->bullet, pos,rot,0.2f,{std::cosf(rot) * game->shotSpd,std::sinf(rot) * game->shotSpd }, YELLOW,false }); +} + +void Enemy::ReloadBullet(float fElapsedTime) { + fireDelay -= fElapsedTime; +} + void FaceBall::InitializeEnemyData() { enemyData[EnemyID::NONE] = { "VOID",undefined,BLACK }; enemyData[EXIT] = { "EXIT",undefined,GREEN }; enemyData[START] = { "SPAWN POSITION",undefined,{128,64,0} }; - enemyData[SHOOTME] = { "SHOOTME",enemy_ShootMe,YELLOW,1,1,PI / 8,2,1,3 }; - enemyData[SONAR] = { "Sonar",enemy_Sonar,RED,5,1,PI / 8,2,1,3 }; + enemyData[SHOOTME] = { "SHOOTME",enemy_ShootMe,YELLOW,1,1,PI / 8,2,1 }; + enemyData[ISHOOT] = { "ISHOOT",enemy_IShoot,YELLOW,1,1,PI / 6,2,1,0.4f }; + enemyData[SONAR] = { "Sonar",enemy_Sonar,RED,5,1,PI / 8,2,1 }; enemyData[COIN] = { "Coin",undefined,BLUE }; enemyData[POWERUP_ARMOR] = { "Armor",undefined,{96,0,96} }; enemyData[POWERUP_SPEED] = { "Speed",undefined,{96,0,96} }; @@ -67,12 +84,11 @@ 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::ConvertBulletColor(Mesh& bullet, Pixel col) { + for (Triangle& t : bullet.tris) { + t.col[0] = col; + t.col[1] = col; + t.col[2] = col; } } @@ -97,7 +113,7 @@ void FaceBall::LoadLevel(int level) mapFloor.tris.push_back({ {{(float)x + 1,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y + 1}},{{1,0},{0,1},{1,1}},{WHITE,WHITE,WHITE}, floor_tex }); EnemyID id = mapData[y][x].enemyId; if (id>=SHOOTME&& id < COIN) { - enemies.push_back({ id,vec3d{x + 0.5f,0,y + 0.5f},((int)mapData[y][x].facingDir-1)*PI/2,0.2f}); + enemies.push_back({ id,vec3d{x + 0.5f,0,y + 0.5f},((int)mapData[y][x].facingDir-1)*PI/2,enemyData[id].radius}); } if (id == EXIT) { exitCoords = { x,y }; @@ -546,6 +562,15 @@ int FaceBall::Triangle_ClipAgainstPlane(vec3d plane_p, vec3d plane_n, Triangle& } } +void FaceBall::RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b) { + for (auto& tri : b.mesh.tris) { + tri.col[0] = b.col; + tri.col[1] = b.col; + tri.col[2] = b.col; + } + RenderMesh(matView, vecTrianglesToRaster, b); +} + void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRaster, Object&o) { for (auto& tri : o.mesh.tris) { Triangle triProjected, triTransformed, triViewed; @@ -710,7 +735,7 @@ void FaceBall::RenderWorld() { RenderMesh(matView, vecTrianglesToRaster, enemy); } for (auto& bullet : bullets) { - RenderMesh(matView, vecTrianglesToRaster, bullet); + RenderBulletMesh(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;}); @@ -797,7 +822,7 @@ void FaceBall::HandleKeys(float fElapsedTime) { else { pitch = 0; if (GetMouse(0).bPressed) { - 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 }); + 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)},GREEN,true }); } } if (GetKey(Q).bHeld) { @@ -941,8 +966,10 @@ bool FaceBall::OnUserCreate() enemy_Sonar_tex = new Decal(new Sprite("assets/enemies/Sonar.png")); hud = new Decal(new Sprite("assets/hud.png")); exit_wall_tex = new Decal(new Sprite("assets/exitwall.png")); + enemy_IShoot_tex = new Decal(new Sprite("assets/enemies/IShoot.png")); enemy_ShootMe = { "assets/enemies/ShootMe.obj", enemy_ShootMe_tex }; + enemy_IShoot = { "assets/enemies/IShoot.obj", enemy_IShoot_tex }; enemy_Sonar = { "assets/enemies/Sonar.obj", enemy_Sonar_tex }; bullet = { "assets/enemies/bullet.obj",bullet_tex }; mapExit = { "assets/Exit.obj",dot }; @@ -950,7 +977,6 @@ bool FaceBall::OnUserCreate() mapFloor.texture = floor_tex; InitializeEnemyData(); - InitializeBulletColors(); LoadLevel(1); @@ -1124,10 +1150,40 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime) { } } else { + EnemyData dat = enemyData[e.GetID()]; + e.ReloadBullet(fElapsedTime); switch (e.GetID()) { case SHOOTME: { e.rot += 0.5 * fElapsedTime; }break; + case ISHOOT: { + switch (e.GetPhase()) { + case Phase::DEFAULT: { + vf2d movementVec = {std::cosf(e.rot) * dat.movSpd * fElapsedTime,std::sinf(e.rot) * dat.movSpd * fElapsedTime }; + if (!CheckCollision({movementVec.x,0,movementVec.y},{e.pos.x,e.pos.z}, e.radius)) { + e.pos.x += movementVec.x; + e.pos.z += movementVec.y; + if (e.CanShoot()) { + e.ShootBullet(); + } + } + else { + e.SetPhase(Phase::TURNING); + e.turnAmt = PI; + } + }break; + case Phase::TURNING: { + if (e.turnAmt > 0) { + float rotAmt = std::min(e.turnAmt,dat.rotSpd * fElapsedTime); + e.turnAmt -= rotAmt; + e.rot += rotAmt; + if (e.turnAmt <= 0) { + e.SetPhase(Phase::DEFAULT); + } + } + }break; + } + }break; } } } @@ -1189,6 +1245,7 @@ void FaceBall::OnTextEntryComplete(const std::string& sText) { int main() { + FaceBall demo; if (demo.Construct(1280, 720, 1, 1)) demo.Start(); diff --git a/Faceball2030/main.h b/Faceball2030/main.h index 1581070..f0c0fe0 100644 --- a/Faceball2030/main.h +++ b/Faceball2030/main.h @@ -162,7 +162,7 @@ struct EnemyData { float rotSpd = PI / 8; int ammo = 2; float fireDelay = 1; - float reloadTime = 3; + float radius = 0.2f; }; struct mat4x4 @@ -170,7 +170,12 @@ struct mat4x4 float m[4][4] = { 0 }; }; -struct Enemy : Object { +enum class Phase { + DEFAULT, + TURNING, +}; + +struct Enemy : public Object { private: EnemyID id; int health=1; @@ -178,7 +183,9 @@ struct Enemy : Object { float fireDelay=0; float deathTimer=0; float colorFactor = 0; + Phase phase=Phase::DEFAULT; public: + float turnAmt = 0; Enemy(EnemyID id, vec3d pos, float rot, float radius); EnemyID GetID(); void Hurt(); @@ -188,6 +195,11 @@ struct Enemy : Object { void increaseColorFactor(float fElapsedTime); float getColorFactor(); void decreaseColorFactor(); + Phase GetPhase(); + void SetPhase(Phase phase); + bool CanShoot(); + void ShootBullet(); + void ReloadBullet(float fElapsedTime); }; class FaceBall : public PixelGameEngine @@ -204,16 +216,15 @@ class FaceBall : public PixelGameEngine std::mapenemyData; std::vectorenemies; private: - Mesh mapWalls,mapFloor,enemy_ShootMe,bullet,green_bullet,undefined, - enemy_Sonar, mapExit; + Mesh mapWalls,mapFloor,enemy_ShootMe,undefined, + enemy_Sonar, mapExit,enemy_IShoot; Decal* dot, * enemy_ShootMe_tex,*bullet_tex,*wall_tex,*floor_tex, - *enemy_Sonar_tex,*hud,*exit_wall_tex; + *enemy_Sonar_tex,*hud,*exit_wall_tex,*enemy_IShoot_tex; vi2d MAP_SIZE; vi2d exitCoords = { 0,0 }; std::vector>map; std::vectorobjects; - std::vectorbullets; GAMEMODE mode=GAMEMODE::GAME; Editor editor; int MapWallsObjectIndex = -1; @@ -240,7 +251,6 @@ class FaceBall : public PixelGameEngine float freeRoamCamera_pitch = pitch; float freeRoamCamera_yaw = fYaw; - float shotSpd = 4.0f; float moveSpd = 2.0f; float hudOffset = 0; float hudOffsetAcc = 0; @@ -277,10 +287,15 @@ class FaceBall : public PixelGameEngine void InitializeEnemyData(); void InitializeBulletColors(); void LoadLevel(int level); + void RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b); void RenderMesh(mat4x4&matView, std::vector&vecTrianglesToRaster,Object&o); void RunEnemyAI(Enemy& e,float fElapsedTime); void RenderHud(float fElapsedTime); + void ConvertBulletColor(Mesh& bullet, Pixel col); public: + std::vectorbullets; + Mesh bullet; + float shotSpd = 4.0f; static bool CheckCollision(vec3d movementVector,vf2d pos,float radius); static int CheckEnemyCollision(vec3d movementVector, vf2d pos, float radius); void SubtractTag();