From 10478eb6c5d593d0089dbe32364a65c0e411ca54 Mon Sep 17 00:00:00 2001 From: Massena Date: Fri, 14 Jan 2022 21:52:46 +0100 Subject: [PATCH] pew pew --- CMakeLists.txt | 2 + assets-cg/bullet.png | Bin 0 -> 125 bytes assets-cg/missile1.ase | Bin 0 -> 2028 bytes assets-cg/missile2.ase | Bin 0 -> 2084 bytes assets-cg/scarlet.png | Bin 0 -> 3810 bytes include/bullet.h | 20 ++++++++ include/conf.h | 2 + include/hook.h | 1 - include/input.h | 1 + levels/test.tmx | 69 +++++++++++++++------------- levels/tileset.tsx | 4 +- src/bullet.c | 102 +++++++++++++++++++++++++++++++++++++++++ src/hook.c | 13 ------ src/input.c | 1 + src/main.c | 5 +- src/player.c | 59 +++++++++++++++++++++--- 16 files changed, 223 insertions(+), 56 deletions(-) create mode 100644 assets-cg/bullet.png create mode 100644 assets-cg/missile1.ase create mode 100644 assets-cg/missile2.ase create mode 100644 assets-cg/scarlet.png create mode 100644 include/bullet.h create mode 100644 src/bullet.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ab7fa6..80e0d95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ set(SOURCES src/tools.c src/level.c src/hook.c + src/bullet.c ) set(ASSETS_cg @@ -25,6 +26,7 @@ set(ASSETS_cg assets-cg/hooksel.png assets-cg/scarletR.png assets-cg/scarletL.png + assets-cg/bullet.png ) fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) diff --git a/assets-cg/bullet.png b/assets-cg/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..f979ebee5825b53905f41ac09c4edc480e4f7e86 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CC!3HFEsom=WQjEnx?oJHr&dIz4a?Cwl978x} zPCe(%#h}2$e6e%>@B87}rK&4L4o2E->R`w^c`j_bB15@-%%qb3@U_uLmITPZ{C;DJ~# zID51&bXPgS@E~uPGIKQiC3`$@arAhplR7s7!wr*{ru!T zMvNQ*Gh@fW@|5ZD%I2gd<&f22HH==<{g`qWIAUUmxZzkMBEyK@f~Ra)S>ujD<>ShyaB zMSci}dX0slljQzfgIud^*~RemnHpGss~O&_myYVH8jRy?% zgtI2g8Me+@2TQZ|z{^EN@J_8fTgzR!{x#=I;IUn~aNYcQFlO2`=vGudx-C6Eu8`Ml{c<kzWkWWWp#Yf9mv}^3#szc7s2sYN5?F~`Y zg)#A&=Tp;$=LPo4EG%}e>2%N<7AW6SBn4I;wOrlO{pE?qlLl45viQUtt%u<^eRYcG z{N@zbJ;obTJ=ciJ#4J^zZc1gjO_;Artm++Hx`TPzTdca@!t&j_p3jqEtzQ_nXZNu2 z@og=tl_RO{S9-}iJbk4IW zZ}>FFVov_P)Y0JJ-7#}}fO(iFV1; zS{f(VC+HXEXx09@`ausbH4Pdv`2Y@gkK18YnV3jhEB literal 0 HcmV?d00001 diff --git a/assets-cg/missile2.ase b/assets-cg/missile2.ase new file mode 100644 index 0000000000000000000000000000000000000000..0d406936a9b5e237ed99e1c1272ef04b6f8948a7 GIT binary patch literal 2084 zcmcJPc}x^%96$%TOkKr@2b5!%Xutz6pj1Sc018^KNUcCo>&jx$5EZl(MTKfP6e19< zB3O?ihSpj+L|1Ez7Yh`yT8~J?3X&ioqSSUlIi~MZY)$|0zYf`#VRkd~&F{ULQT-*U zF4sh|lN6FlGLj@o%je%MUNRB~rNR9DA6v4iB)w=ieR)-OrQv+cRWC33#^v5MmLzLc zeBY6{H@=Z1QxjuZk_IUhaJ-E@)Hpf7voq~ryH*LibJsz+?u;NCe7Xa6mQICDJKbS^ zh%@}uV={D7+Q7NfC%}YHJm8Ie-mud!1Kz3?XFj2GgK@jWk)Y7`pzE|z(8|^tj`0#} z@Q<1THMw3e?V1a`(mn=WlUv}v$G^bfUw1>Fqrq_cT3_hoJsu7nBCcXH${&uK|CKnt zqZ;~@G{N;x1l#`*_fm1Q2kty#fHR{S;B4=0Fh;9~2U70BtKU6_FK&z9w-q0NH{*YV z=>g~Ah+)Iw`>x`SR)vU_6sE+$2ZdXq;m%&z-SIPQee@7k>Mz1$2eV*&>?Rl-7zkZl z#62!>n+Q`w)KH(W7~alX2v2<`rV%wq%z5TmF=0)(nE&oQeo(Iqf=}*cz~YCMFi|hg zzchOzoE0us~#g>PepM z=?+RKa~dab>LzWvCTfZ%XIds?Dkfq2C0@!UTbdLWe6BRYyBH(Db!DkCxaA}-1zE1DuGY9b{%A|eVRAKD=tsv#MAAr?v@6B;29 z>L3leAPR~g2U;KmDj)&;BOmi<$2r2WjcPn28N=wsEn=~XQhXv4lW4>t0qF$Y4IAGST;{xbC>3`xvW{_t=jd77Oc>c$wJzg&QuwL2x z?!rlvqn8(1nEcRL-fON|V(_ju56#@twDL%H+V{$1W?FUCgv>4Fy)!y2&)v`0Xg$}} zB)E3xOPeEoM=LaKGdpZ*CkC}Tj8G*FJiWpAQhAG!@2SW|I#%?e-RR|eSiF7n_`GGg zgJQ0S8I*P(R)i~Jx7rr>3-yWa?QGmuZeFGfDX9LL&AFv_x=%&??yN{1 zuTC#rS8828C^PnYkC~7-1zM2o{^#+$N?G}^zU>Y_kx!GG3$1y{8v+s=yh;B5#Rd7*%9~Ft}Cg_PqK}-cW-Jo`!eH} zu{8DM`mUn?EI8-w3+@|q&hh8%)uzX-+#@#|x~Hr*)pxdD37eqqI{HzqJTf$*QI5;E zGtJ3PNiC>wxchmjzrm}2L!rfLwUuS4QgQju%dKw=dYfiL$BLru>96Oka8(9wt{>pr VH{~-)L*nf%npVA9aPx@oJmAMRCt{2oPAVOWgf@B4~!r%@{)irkQx!-K)Ob`7{0D}5F?Mml znc=3B-0wLaXYSnj%=h^{zj=PY``l4Lmo8npbm`KiOP4NPx^(H%rR!FU+-d{v)cD3| z0H6vlao&Zmk%7w(t8p}8Y3WOAmX_)bW7JZ5ymaZ()thDD9{BJAMgbr^-C_080lVn9 z!ntZq(rwSucph*2G3xP>G2J!g%p3sFSvrfA)f?oivDb=a5Ipv|1x%M$(z2-es(i9= z`>?bcqp!wYXWa%YUo4PXv*4q#*NSCOI;ep(8>oK>NM|dkfT1SU#lAPNv{Y{xqn6U+ zrAt?jE zw4BG@Fh)IIGX3h}uCs0rR&S86#$GEH-%$AC0>(+m88CAV$gnJ6c^2qTdmMmaSpY;o zyp$==Y@}0iE^5Nk(wEjOE$2~7Us|$!wQvKscf4+8+>5@uNctH3`Qsh-PM`3_u@dtu z_}5OYNc9O{N}jx7Z9O}Z0LokVzFIeYmE~!?mR|Z389r|r{F;9T08|w&@|vaQO)Hk@ zmWQt`U``Q8ww5?QqUSqb#`el))yYgPh(JZoMfrObSmgmpF26(o5EPe6uGLj&;%ngY z!=&+z(M&9Nz5q>&nr5-rnB|j&8@(W2o^ZCF9f{$KR)GcwfkyTRATDg4u!_FB2z19o zHeOFyArC$cN)L(NPe?bCm9=U9c=A1di{Xn_0cS1f8WJn>cdO#{&r9RrcUjpJD=RU- z0)_+S7#Y@x!o7qpBZ>J5GEbaX5n;)b$&(L8VeZE- zxk3>DluLpOpRIPu8Zc`u(g2F3+gy$_^#18I^#18w61ilBM8}aQN7P~N$Ew2=H5EPa z1&!xX$m{7CHDvj0;ReGP8FH1Gb(7=8%t_h*6yp4UfM2JD+SAjd43Ag=D=Q#5S9%e` z%)(2D(9!t4l;^Rp3!kmVoXKOQi% zz!O`V%;Ui2hp|039aG{u_+u9HQb@V2)-$+c)p1orsRa?pNxg;zsn=D{Yqg$1zZDg# z=d3V?AS14wOo{98sYYkO%r&@LwHK{brK%sslB=l&5%_R^e~d8HsymOq3z#%tHNP~D zm)ls?x5SW_2bbbSa|;bO-R-KVF|mGX3?P5bOv0-r)$YExZdnGSi5Na#hp@+1_Lz0H zWgy8LT#7t%3k^3-7miUnr#CfTlMl?tBLixH3sCdK!~)*spD)acz`~7tz!gqUS^L`` zAYH>kVJ<#OCGS(@aB|n2boMKS|LBQI^Lf(?cgo^AaBT<2w5O+0Vw2T4)p!}7SqH;` za$GuD$R7(gO^361yKJUi#h$c>kqJYhF*xWvdFA6HG~6BldwQDE8r0)lCWAX&|^EMP@n*C2a>WBbTf)_{_v2L828&5?MnzYVrBV8BduGxfD4$eyqimyaGH zmMsMofJ>IGEC;dkb5t80AxG$IQ*$H$;JN-beDlA4BsoTX?donO97Uug>7>Y)(&wu2 zSm%+YaL2@F!d%ymJhKsixWUPeYQl57WGrWs>GpRWTE&Ysw*o7V(R%?{%#J2FWpN#(9$8t&(-!(L0rF~# z0005;*)kSuv)Z_)lmev)8-1VSz|g6Rto0dJ-TDeXevFRNXpCCMYiHMbWbQRli+L&l z;GI1e$vb<*^UliRip7bIaR5MzzOIqw87ph`VG{)ai+MZ%<(lA>+q!Y!e1Ed_WCWe_ zPzt&B?=NY1M_&MdIEXYA??&{rhgCn149mg?ze_}jUtf~a_c~v>ge>k< z%NF$=0n3&G9BKTDxi>am;DO8W3qZmhfSg_WKUS5zBrF|=kXmI^T^|i*UP+d&8j|%K zDv-&SP&wl}NkN&v*JIQ&Uc%fP5^P0P;S!NoR@P3eM`pDNfMX5GeXUsb9bjQi-v6{L zUeC`>BQLxvzU9GM)Dmk?P{4%zWf?SoSq5S=Ht+@AQx+#J3O4{;I#~$I#yDWsQpLuD zC0?a)G)KntGyqKifUEDX6gE4|ET#N%%Hw%t$yL!UkBWvqvPDd~fc3pISr#NEeO2R! zJhONK6S7zr{DYMi3OKHaxvPIbT)1yEHqa&SA0zwT{J|~n@U>t7pnF@5iYzz-o&0tI zP~^JN$*eXZA-EL@A+4@B4hBOZ;(TpBcnk~1j1nCeFqwP--Sg9rLDe*PQtou^AhX9n}QDWxR;BcsB+te8(M*WRK{F+}YgreD}^5C&tDE zfOhdR*99mZ7qY&&Y9s(?Y{mw>_sTSqJs|;8fB%?Qto_#O1ON?)&&H08dF0V)WAWHR zS>x(*TT93?rcQKRWe%O{XeQbkWz7VjybelP0LZzhL}X@cpaAgv+%!}bu93axX2(m( zmy%dmv;6Xqle&+@I$5sdj2Y`QDiyph_WeS|b6HtHcYeLOt(+v^n}UT|5s>a$dCGE?tFr&tDm$tPxz5EN5HC1C zzV%mf*OC`i2gvEmv%%D{u*ywwVr))GLU1b}STv*@M;GnBa65hs)Fe8lR5VhG&bckx z08rBwLTlPWM1`AEMEW@9-)kuOl6uRmc5E5e56fb?g70p?lnXaglLG+vg=(%Kk0Dy7*T3Bo$HM9i{$B)q5*+)3KVy@DkT;BH;Ntp9eZ>)v;&28nfcokWr zQDlwga)c@7yc)V26{G&C zB?<&K*4U`NbU}PSvbpvO9$&m(shQw4At8jQHDFgON@>%Mzmw?4mqBS~!V_Nr=#M`% z5FnNSj=A@irDeRd^tH2VJwCA}0q|qWTURXM4_1xOtOEcPSNvCzAuVdcTgaS*MNO%h z@Pq|;SGZlV07uhgd}f`hH^6ngcI}&iS$=r{#LbdDJq-%K$53Sfj{I6R*g{_4Rt})t z-GyI|a@9}x#JL#qk_PLGibhmDn*){wM`$j0_DUJ+Uw?U*0NuZib*1{+5^fiO03h)J zH^}K50fc+L-4?~XNDBfZ!6V*s}%SwTK}s9Gpj1Ukk>J0_Us98qF73Pn8hd zsydGV`%b{%z#D)@vA=3J@CCLn1`Ejfh*>?f}scZ`tjc?9Z zr&v({K*sfJ!FF2|KC(qo09ZBHLdJ)-IJdOjZfnbY0l=#OiHUdYNTd{)c1Xv{!rH9*j|@DE{oZf)^XI=+3%uner@poXh|(rkxx5EJ zn%n!};N=L)#g605`RWvxFK$^1@ge~5DS%Ja(pW)~ycfkMzZS@6GE3t Y2a3rHbq3O`*8l(j07*qoM6N<$f - - - - + - + -19,21,22,22,21,20,20,21,22,19,22,20,21,21,20,22,19,20,21,21,22,21,19,21,22,20,20,21,19,19,20,19,22,21,19,22,22,19,19,20,20,22,20,20,19,20,19,22,21,20, -22,19,20,20,22,22,19,19,21,21,22,22,22,20,20,22,22,21,22,21,22,22,19,20,22,21,22,22,20,21,19,19,20,22,21,19,20,22,20,19,19,20,19,20,21,22,20,21,22,21, -20,21,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,19,19, -19,22,17,25,0,0,0,0,58,57,58,57,58,0,0,0,0,0,0,58,0,0,0,0,0,58,58,57,58,57,58,57,58,57,58,57,58,58,0,42,42,42,42,41,42,42,26,18,19,20, -20,22,17,25,42,42,42,42,58,57,58,57,58,42,42,0,0,0,0,58,0,0,0,0,0,58,58,57,58,57,58,57,58,57,58,57,58,58,0,0,0,0,0,57,0,0,26,18,22,19, -20,21,17,25,0,0,0,0,58,57,58,57,58,0,0,0,0,0,0,41,0,0,0,0,0,0,58,57,58,57,58,57,58,57,58,57,58,0,0,0,0,42,42,41,42,42,26,18,20,20, -21,22,17,25,42,42,0,41,42,41,42,41,42,41,0,0,0,0,0,58,0,0,0,0,0,41,42,41,42,42,41,42,41,42,42,41,42,41,0,0,0,0,0,57,0,0,26,18,21,21, -19,22,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,58,0,0,0,0,0,0,58,0,57,58,57,58,57,58,57,0,58,0,0,0,0,0,0,57,0,0,26,18,21,20, -20,19,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,58,0,0,0,0,0,0,58,58,57,58,57,58,57,58,57,58,58,0,0,0,0,0,0,57,0,0,26,18,20,20, -19,22,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,57,58,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,26,18,22,19, -22,21,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,42,41,42,41,42,41,42,9,0,0,0,0,0,0,0,0,0,0,26,18,22,21, -19,21,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,26,18,21,22, -22,21,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,57,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,0,26,18,21,19, -19,19,17,25,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,26,18,21,21, -20,20,35,44,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,57,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,0,26,18,22,20, -20,22,51,60,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,58,57,58,57,0,0,0,0,0,0,0,0,0,0,0,0,26,18,22,21, -22,21,51,60,58,58,0,41,42,41,42,41,42,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,42,41,42,41,42,41,0,0,0,0,0,0,0,0,0,0,0,43,36,22,22, -21,21,3,3,3,3,0,0,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,0,0,59,52,22,20, -22,19,19,4,4,4,0,0,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,57,58,57,58,0,0,0,0,0,0,0,0,0,0,58,58,59,52,20,19, -22,21,17,25,0,0,0,0,58,57,58,57,58,0,0,33,34,34,34,34,33,34,34,33,0,1,1,2,0,58,57,58,57,58,0,2,1,1,0,33,34,34,33,34,34,34,34,34,19,20, -20,20,35,44,0,0,0,0,58,57,58,57,58,0,0,49,50,50,50,50,49,58,58,57,0,41,27,17,2,3,3,3,3,3,2,18,27,41,0,57,58,58,49,50,50,50,50,18,19,21, -20,21,51,60,0,0,0,0,58,57,58,57,58,0,0,49,50,50,50,50,49,58,58,57,0,41,2,2,19,19,3,2,3,19,19,2,2,41,0,57,58,58,49,50,50,50,50,18,20,20, -22,19,51,60,58,58,0,0,58,57,58,57,33,34,34,33,34,34,34,34,33,42,42,42,0,0,26,19,19,19,19,4,19,19,19,19,25,0,0,41,41,42,33,34,34,34,34,34,22,21, -20,20,3,3,3,3,3,3,58,57,58,57,49,50,50,49,50,50,50,50,49,58,58,57,0,0,0,18,4,4,4,4,4,4,4,17,0,0,0,57,58,58,49,50,50,50,50,18,20,19, -19,19,19,20,19,19,19,17,58,57,58,57,49,50,50,49,50,50,50,50,49,58,58,57,0,0,0,0,49,50,58,57,58,50,49,0,0,0,0,57,57,58,49,50,50,50,50,18,20,21, -19,21,21,22,20,20,19,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,20,20, -20,20,19,20,21,21,22,19,20,22,20,22,22,19,19,22,21,19,22,20,21,21,20,21,19,19,19,20,20,22,22,21,22,21,20,22,21,19,19,19,21,19,19,22,20,21,19,22,22,22, -21,20,19,22,20,22,19,22,20,20,19,21,21,22,19,19,22,21,19,22,20,22,20,22,20,22,20,19,20,21,20,19,20,22,22,22,19,19,20,21,21,19,20,19,21,19,21,21,22,19 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,19,19,19,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,19,35,19,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,1,19,35,19,1,2,2,1,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,19,19,19,19,19,19,19,19,19,19,19,19,17,0,0,0,0,17,19,19,19,19,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,19,35,35,35,35,35,35,35,35,35,35,19,17,0,0,0,0,17,19,35,35,35,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,19,35,34,18,18,18,18,18,18,34,35,19,17,5,5,5,5,17,19,35,34,18,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,19,19,19,19,35,18,18,18,18,18,18,18,18,35,19,17,21,21,21,21,17,19,35,18,18,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/levels/tileset.tsx b/levels/tileset.tsx index d5344a4..a477a09 100644 --- a/levels/tileset.tsx +++ b/levels/tileset.tsx @@ -1,4 +1,4 @@ - - + + diff --git a/src/bullet.c b/src/bullet.c new file mode 100644 index 0000000..e21652b --- /dev/null +++ b/src/bullet.c @@ -0,0 +1,102 @@ +#include "bullet.h" +#include "conf.h" +#include "level.h" +#include +#include +#include + +static struct Bullet_table bullet_table; + +static void bullet_table_free(void); +static void bullet_update(struct Bullet *bullet); +static void bullet_draw(struct Bullet *bullet, int timer); + +extern bopti_image_t img_bullet; + +void +bullet_table_init(void) +{ + bullet_table_free(); + bullet_table.bullets = malloc(MAX_BULLETS * sizeof(struct Bullet)); + bullet_table.n = 0; + + for (int i = 0; i < MAX_BULLETS; ++i) { + bullet_table.bullets[i].active = 0; + } +} + +void +bullet_table_free(void) +{ + if (bullet_table.bullets != NULL) { + bullet_table.bullets = NULL; + } +}; + +void +bullet_fire(int x, int y, int v) +{ + for (int i = 0; i < MAX_BULLETS; ++i) { + if (!bullet_table.bullets[i].active) { + bullet_table.bullets[i] = (struct Bullet){ + .pos = (struct Vec2){.x = x, .y = y}, + .v = v, + .active = 1}; + break; + } + } + ++bullet_table.n; +} + +void +bullet_table_update(void) +{ + for (int i = 0; i < MAX_BULLETS; ++i) { + if (bullet_table.bullets[i].active) { + bullet_update(&bullet_table.bullets[i]); + } + } +} + +void +bullet_update(struct Bullet *bullet) +{ + bullet->pos.x += bullet->v; + + /* boom */ + const struct Vec2 level_dim = level_get_dim(); + if (bullet->pos.x < -6 || bullet->pos.x > level_dim.x * TILE_S || + bullet->pos.y < -6 || bullet->pos.y > level_dim.y * TILE_S) { + bullet_destroy(bullet); + } +} + +void +bullet_table_draw(int timer) +{ + for (int i = 0; i < MAX_BULLETS; ++i) { + if (bullet_table.bullets[i].active) { + bullet_draw(&bullet_table.bullets[i], timer); + } + } +} + +void +bullet_draw(struct Bullet *bullet, int timer) +{ + dsubimage(bullet->pos.x, bullet->pos.y, &img_bullet, + (timer / 2) % 2 * 6, 0, 6, 4, 0); +} + +void +bullet_destroy(struct Bullet *bullet) +{ + bullet->active = 0; + --bullet_table.n; +} + +int +bullet_nb(void) +{ + return bullet_table.n; +} diff --git a/src/hook.c b/src/hook.c index 53f4291..128deb6 100644 --- a/src/hook.c +++ b/src/hook.c @@ -62,16 +62,3 @@ hook_closest(struct Vec2 *pos) shortest = (struct Vec2){shortest.x, shortest.y}; return shortest; } - -void -hook_debug_draw(void) -{ - dprint(10, 20, C_WHITE, "%d", hook_table.n); - dprint(30, 20, C_WHITE, "%d", hook_table.hooks[0].pos.x); - dprint(50, 20, C_WHITE, "%d", hook_table.hooks[1].pos.x); - struct Vec2 player_pos = player_get_pos(); - dprint(10, 40, C_WHITE, "%d", - (int)length(&hook_table.hooks[0].pos, &player_pos)); - dprint(50, 40, C_WHITE, "%d", - (int)length(&hook_table.hooks[1].pos, &player_pos)); -} diff --git a/src/input.c b/src/input.c index f0d5e20..2b56c87 100644 --- a/src/input.c +++ b/src/input.c @@ -14,6 +14,7 @@ input_init(void) } input.keys[K_A] = KEY_SHIFT; input.keys[K_B] = KEY_ALPHA; + input.keys[K_X] = KEY_OPTN; input.keys[K_LEFT] = KEY_LEFT; input.keys[K_RIGHT] = KEY_RIGHT; input.keys[K_UP] = KEY_UP; diff --git a/src/main.c b/src/main.c index 7e583ca..d0e9483 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,5 @@ #include "main.h" +#include "bullet.h" #include "draw.h" #include "hook.h" #include "input.h" @@ -32,6 +33,7 @@ init(void) { input_init(); level_init(); + bullet_table_init(); } static void @@ -39,6 +41,7 @@ update(void) { input_step(); player_update(); + bullet_table_update(); ++timer; } @@ -49,6 +52,6 @@ draw(void) dclear(C_BLACK); level_draw(); player_draw(timer); - hook_debug_draw(); + bullet_table_draw(timer); dupdate(); } diff --git a/src/player.c b/src/player.c index e096e44..83f762f 100644 --- a/src/player.c +++ b/src/player.c @@ -1,22 +1,27 @@ #include "player.h" +#include "bullet.h" #include "conf.h" #include "draw.h" #include "hook.h" #include "input.h" #include "level.h" #include "tools.h" +#include #include -static int k_up, k_down, k_left, k_right, k_jump, k_jumpdown, k_hook; +static int k_up, k_down, k_left, k_right, k_jump, k_jumpdown, k_hook, k_fire; static struct Player player; static void player_get_input(void); static void player_move(struct Vec2 spd); static void player_hook(void); static void player_hook_draw(void); +static int player_update_frame(int timer); static struct Vec2 player_update_rem(); static int player_collide_pixel(int x, int y, tile_t id); static int player_collide(struct Vec2 pos, tile_t id, int h); +extern bopti_image_t img_scarletR; +extern bopti_image_t img_scarletL; extern bopti_image_t img_hooksel; struct Vec2 @@ -35,6 +40,7 @@ player_init(void) player.airbreak = 1; player.hooking = 0; player.locked = 0; + player.dir = 1; player.hook_pos = (struct Vec2){0, 0}; player.hook_near = hook_closest(&player.pos); } @@ -42,6 +48,7 @@ player_init(void) void player_update(void) { + /* input and air movement */ player_get_input(); const int dir = k_right - k_left; @@ -55,6 +62,7 @@ player_update(void) player.airbreak = 0; } + /* hooking */ player_hook(); if (!player.hooking) { @@ -64,12 +72,19 @@ player_update(void) player.spd.y += GRAVITY + GRAVITY * (player.airbreak && !player.hooking); + /* applying movement */ player_move(player_update_rem()); if (player_collide((struct Vec2){player.pos.x, player.pos.y + 1}, 1, 0)) { player.jumping = 0; } + + /* shooting */ + if (k_fire) { + bullet_fire(player.pos.x, player.pos.y, + (dir ? dir : player.dir) * 6); + } } void @@ -123,12 +138,42 @@ player_hook(void) } void -player_draw(void) +player_draw(int timer) { + const int frame = player_update_frame(timer); + + if (player.dir == 1) { + dsubimage(player.pos.x - 5, player.pos.y - 5, &img_scarletR, + frame * PLAYER_W, 0, PLAYER_W, PLAYER_H, 0); + } else { + dsubimage(player.pos.x - 5, player.pos.y - 5, &img_scarletL, + frame * PLAYER_W, 0, PLAYER_W, PLAYER_H, 0); + } + /* draw_rectangle(player.pos.x, player.pos.y, PLAYER_S, PLAYER_S, + * C_WHITE); */ + player_hook_draw(); - draw_rectangle(player.pos.x, player.pos.y, PLAYER_S, PLAYER_S, C_WHITE); - dprint(10, 20, C_WHITE, "%f", player.spd.y); - dprint(70, 30, C_WHITE, "%d", hook_closest(&player.pos).x); +} + +int +player_update_frame(int timer) +{ + if (player.hooking) { + return 5; + } + + if (player.jumping && player.spd.y <= 0) { + return 2; + } + if (player.jumping && player.spd.y > 0) { + return 3; + } + + if (abs(player.spd.x) > 0) { + return (6 + (timer / 2) % 8); + } + + return ((timer / 60) % 2); } void @@ -143,7 +188,7 @@ player_hook_draw(void) }; if (player.hooking) { - dline(player.pos.x + PLAYER_S / 2, player.pos.y + PLAYER_S / 2, + dline(player.pos.x + PLAYER_S / 2, player.pos.y + 7, player.hook_pos.x, player.hook_pos.y, C_RED); } } @@ -158,6 +203,7 @@ player_get_input(void) k_jump = input_pressed(K_A); k_jumpdown = input_down(K_A); k_hook = input_down(K_B); + k_fire = input_pressed(K_X); } static struct Vec2 @@ -184,6 +230,7 @@ player_move(struct Vec2 spd) if (spd.x) { const int sign_x = sign(spd.x); + player.dir = sign_x; player.pos.x += spd.x; if (player.pos.x < 0) { player.pos.x = 1;