From 44a944c00c95fbe3081e8bc0a8ee84833ed95617 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Thu, 11 Nov 2021 16:59:37 +0100 Subject: [PATCH] code mvp done lezgo --- CMakeLists.txt | 3 ++- inc/level.h | 5 +++-- inc/tile.h | 3 ++- inc/util.h | 1 + lvl/0.kble | Bin 0 -> 356 bytes lvl/{test.kble => 2.kble} | Bin res/tileset.png | Bin 9984 -> 11681 bytes src/level.c | 35 +++++++++++++++++++++++++---------- src/main.c | 4 +--- src/player.c | 36 ++++++++++++++++++++++++++++++------ src/util.c | 8 +++++++- 11 files changed, 71 insertions(+), 24 deletions(-) create mode 100644 lvl/0.kble rename lvl/{test.kble => 2.kble} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08bdc3c..3827616 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,8 @@ set(SOURCES ) set(LEVELS - lvl/test.kble + lvl/0.kble + lvl/2.kble ) set(ASSETS diff --git a/inc/level.h b/inc/level.h index cdad2c6..ce138b9 100644 --- a/inc/level.h +++ b/inc/level.h @@ -15,11 +15,12 @@ struct Level { int height; int size; char *data; - struct LevelBin *source; + int id; }; -void level_load(struct LevelBin *); +void level_load(int id); void level_reload(void); +void level_next(void); void level_free(void); void level_draw(void); struct Vec level_find(enum Tile); diff --git a/inc/tile.h b/inc/tile.h index bf73b95..0eda727 100644 --- a/inc/tile.h +++ b/inc/tile.h @@ -5,5 +5,6 @@ enum Tile { TILE_SOLID, TILE_PLAYER, TILE_SHATTERED, - TILE_OOB = TILE_VOID + TILE_OOB, + TILE_NEXT, }; diff --git a/inc/util.h b/inc/util.h index 4e47124..b5d3130 100644 --- a/inc/util.h +++ b/inc/util.h @@ -3,3 +3,4 @@ int sign(int); float signf(float); int abs(int); +float absf(float); diff --git a/lvl/0.kble b/lvl/0.kble new file mode 100644 index 0000000000000000000000000000000000000000..6e1d4e8cdf2a1a30cd40f66d6ebbf1e4ca1d396a GIT binary patch literal 356 zcmaivF&2O@2t$c5yL`!N_mDKjKj6et+z(&@a{vGU literal 0 HcmV?d00001 diff --git a/lvl/test.kble b/lvl/2.kble similarity index 100% rename from lvl/test.kble rename to lvl/2.kble diff --git a/res/tileset.png b/res/tileset.png index 6e2ea9ea3a7655ef90298ee68dc05eb0007d0477..08d7272e2bd21da1b442387f7b1895d594a121eb 100644 GIT binary patch delta 7531 zcmV-x9hBmLPN7>RiBL{Q4GJ0x0000DNk~Le0000`0000G2nGNE0D(#P!2kdcF_9%7 ze_4(syA4JEV-;S4CW_Q@BvAsq125l)kyZV=+ik#rUnMGs7&MT)1LHaW`saQA!C&o` zo+fI2^q%-@qm458V(IfY-}ju_`~LpP*C~Gga{S5PCklrupY`+8`q%Z}$McT?J|B~B z^3y=JzfP=QPmK08zWp}P*F-f|RQTdwe*=xLfol1j$X^4@&$dz@ray0CozJI#@5Da; zPrOxq$Nn+M@4uT8Jr@qvQcle^@m^~CETG1Je(K~z{=9QxuAT4oJyPoTRtd2@|I_RN(f zGg#)1^2FQU@%pa=-5VvJ^INd>e~lIIB?^^gMCRh1t4K(`-*qH!fWKeA|3zLa8I(87 z#s+6vpCOjyuiA<_s&Aqz7Yd&rSY-9D0SFOu3yY!lTTVS!$vr16MRO*OMt&v(8K5bP z6l9U&tg^IPJIS#Ub90a8_u3-ma~RGd5dxT$)QmdGRfE{5A8kerO{vmEf250w$&lG= zZ(Vxt+JpS2R&6TURn>Ipv}(=7x~bV?!{#WXLXI-}&|zbYIhk}a^5pKx1#_;l>S{|? zU%G6KH8(!d)D%I*2{ClWa$W2I#>u8{!>x9hrL~b^j%E|CzTxWX(fu zcB;>tp@3loHC5op1;=Kw8KU;<=Oq}o>rrXM(r@K^&vWcy4*>3)e_fn&`mL;kkPL}{ zm)+({)peY@T;WO5%^JHws%0JDwZ<_BZPfeR7U4bSb7h-8eaL2tJYYb8>$01zGa*=8 zdb@WNS#`wvwXO(mwUeYilc0H{ z_^A<%n$LQ)?w*M9%z&oZKGMc!Oo<7kgtU5ObNV*Pi<4vS!8s+G`K~%f#-vf%S~bc+AO`nF9nH2j+v5lU0I+K33f0YW)pK9Hf1kp>1XgP;cqj*xorpTQK4e6) z+o-r&NUR*`N*GrGdUISTu4Hl3d}fNBx?EXXvy37bk(x*8w%15HJDiLzJi|L`*Ux43 z+onL@Ojil~*=Lc%T$#WVDS$^ZMV@zRlO(ikH-%i3#fXs1`<)v9`m9WLp@V5# zfBU%ULNgQ-hA?}hjx3c4haK6k2qZ>zppNS{m>Te2;R4bH@vLhlLxJv>evzU-kWR-H zl*jKjptU#3aAa!VAk!uqwHnJZBxWE!RAE|{w|92EGL_V%GGhS(y0Wu1t}hUBFs3m` zLNc7}l!|fa*-E4@_mO>Y5e$dWo^zoRf7iBvlaWMi=NT|6JA*;;I^e^bT|utz#`>TZ zbD%wYV*x7FeW|Lsu?We@>A7|sHwh=;vzh-up5cOG#SnXtNfCp_=-0GuYU4OUyjC%s zi)^GW-BOlqr>#>DI(Q)3gDPhL0;YFV_zMAnpL+K|2b@R=jHW>S)R|ZvV!8*5e?}qd z>KB@LCO!o{gcGqf1q3i};)f%XloHIWL=n(WgocAR9NYGrHt;dHU;zMp+|v){W8nfe zzJRF=`$OId{%DZ!IFx|RI0N7m$2Etc1n`K2T?@s&msC7>clJqUS=XI-HP+T4VKX9w z4cP%UL|WVI=)@@oxUv%_Vo>H9e^@v|l^(7I0WmLy4flD+5_I@aOIupY@o+uV5(W}f zb32;ow@tt3Cc-zlb-Yat!a3;OSj&q?ChwCfH|>X${elR1r36o^7BaRjJ*5`ixi^f86z8J2gh_ zCqv7m3d~W~IsC_w%Ko6%S<6fP>{VuQun&8cfLz#aL2LIDfm}61=Xh%_ro>$PIZ9QN zDDDILs89lQxGn?}9izR%c483)^sdda7Tmb}gyHV^m`tEyik9t*(Lz#c+;Jmqmsr5*=$B$_iQDKq_{MXM zmdcU6C3O#ttC@s zpmqjm7g`#l%iiHeSs-Ye;T4z{Hm&H0PD%J93Iq65s-2xetfn$w8-p9C_hneD3+zC^ zE3N|K#qmQkE&K>e48M2Rd`|lGMna{;1JfCg5Rh$jfAC_1ThQ<3C*{}SP*S+zEFgrl z#M8`1x2~l4DXAkhg!9s~u!^SOm1YwFBwQPnic4q2mvz87P%ZFKlozxXjsWLD5n$MR zBRJFqYm!K*R+N?W(T5V$v@?u{No)=$felfZst0jWc&WB zMlcv{L}i?g0cN?Rjw-!0#|y~ZozdIN9%^8Ro^eeK(|W>W-B;M*B^J(71rFg9=^|ud ze~C(XIduL|i~$%Xq&+&AHSw2Kkf{etE3`dW!2mh(*?RVS>-YhH-aH*7zSHxXH$MFdbb&cPXENH&BIb$!Y<)l%1BtgO%{=dgi-Q% z44&;dim{3rk#gP$SQsf8$QAMkkpvK;f6Zrk(d0pQAgSOtAt^2-sVIMyC))Fpq8$!< zZaE&Ty)eh5P$JmU=+H!oO*rv84^9c~%o>-oEMa4i=-o;)_zrO)hV8MG;q}sXfmrRhe^S4f zCILSjPcW#Xj# z2R{q)gIp?%gHa!(4h|-vXlJ{-a{=e?nbha{u;|;}fmX$68T3(Ko{Zw7XbA&;9g|P! zScBnyW;~{fd%{wj@X;ln{ViH0f4r3S>5se!iyjodQJm9`8`vzgvgwVZ(~C!7i{|$D zibrE_Jhe&2ekr1*0J%KxFa#caV!{!Aa1Wcqun}I!qy<>%-thPl5&$}&y68pTY&vEn zzCDQM4Li^HEP12;>)j>|=h|<`sj_>+<4t@y174^rG95EPK>g4(NqyGKJcf4l%>)%e zOsjm9g|r?@K_V9?I-OgiG~TB)M2|j@8jP)S|1)E&81oz=7Cptk0h2GA!X_x+od5s< zg_B(j8Gjgt-?mCcD;?}0BATH(Sr8R*)G8FALZ}s5buhW~51KS2DK3tJYr(;v#j1mg zv#t)Vf*|+<;^yY0=prS4mlRsWc*k)M?|tvf-FJY$US_J0dehQ5?-NH@QBsJ{ ziN_4OAn_yDWtZPL7aaEU%!rXr%@aq6g+d$4ZOn>>N<2jzRaA}g{TY`P&Rd+-a+Njj z$zK@CX)DWIr!|NK7O?~o0%TNCLKzlfv}>f8NYQ!R!$08oMRLjHDuIz>0Trl_96$IU z{D1DPnV+0+lR|Nz^ToD5Mu6Zh(5Tt=_pxm^PJqBOaHX~Ul{zr z(&RnhatG*t(j`N3qyQ~{J`cQ~(Kls*zFVMs&Fx$B9H$RJntGMI0S*p<(E??!d%U}= zy>I{4H2e1hVUlv7A#GU@000oCX;fHrShMmCg#sjFFgP=W5*uG_RRFS+ubugU0v1HwVhLEd*5>o7x@$V_a}VxJbLsKf1L7mkM;}C ztFya%Ksw8~b90AFPh6qhaM^zMU6O&xV_$s?y>OXLBf?n-x=%EWxqba(g0KHEq7c{$ z%)B7hB#8rACMltjn10Oq-)u98#Vs>;DB56TgY_A=fC_}cCYW#zq?P# zEl~&)yQH&tZi^yQ+}}IKf3i)a-{bJ$fUO6waPjdgy#Fr;*oNTTN{3`RprUI$`^9Hi zZZGo6tFLp^n{e1W#t$>RY7N))$n%{3;eEdLdtX62EnvxR5=q)9PjUQ<>^mh zI|hT}F|GCnGe6|bmp?++bv(~Q)4?zdq)hRBpGu{|`uaM$At;y2)EhOVl=P2}2%`YU zE0O2<=>ey+0g0OMf57E+lp1q%_#xqV$`60=5|=JNfZ1@!R8AZvgn^G&vf1Cg&wO)% z;dqFV=NP#n(-e`JlL&>T1P!x7!)p>L!B}eScoqK56@2sF4p+xx0-=#>g3kIP3ujuy zQHoirVcG^kF^_PXM1H`i-y@Dv(j+946343{w2bER0?TW2e-xR*a~(3N(1k{lBpme) z(RD$)-RA7pIUKJ9fDi(q>)5tUxm;#2IL0_FV5K%kuItE|ARMM_UARP$n!Na*-{a3N z{UPPj0!1G4;f)WueDMLu6=#-Ln2dU?b(YxE!OXzSLFENn4pqw|vs|`i%*-*krea>c zcZZ39OcQwIe>|vLJXu;`Z=sG?v+=qiP7!dmh3BuJ_g;F7T!uXS^i%kwA+|0l zy9H6GgG{J*Rw&9?-xf8b|E!?NRq?%qAi2&KzI+gDjiW3O_o?_R1n*kkWTtoIufw0<1ZQMctt) ze@!kfZSdOBE}my{(Jph@bXm+(s)fQxa%Q?k;CfWO5Fr7*jEuYFY7eR96uE~GDUK;n zGGTZ;V=&mKT5e$K9hT3XXEYe1l@(+e^-7ttWw5@!&biIAD5V$buNdV@U5c=*u`f8so*I^Q741f{~nFiYG#IACMx4AXHy=9rXR zn=AuW6d10_jot~7<$qMO z)P(N#Ho6FCF3d3+PO&Q{rd1}M&5%h(o`pXj0&@0uKS3!;W9d9vQD7S;t!AB?e`~X~ zd6u=+4W`q8(P%`!Kj5g_Cqrj_eUp;oa{JaTqQIw8GEWbe z4a4BJqvJ<#tQ3_jqoWBrhQM*5f7!0#Ppj06K9#vuCdWh4G-IyqA(e)ZIm$m_I69`) zoX0dR8go_lKDo(px69V$W#(E9N~TQ|hIHDCBvHh7zViQC`UJwEe`zrcla>pb+xFR}Z{e-7u)p2KxZ zkQBJ4$8hZPMQ@3lrq7LJOxF*%UIb(!Ww~Ty38=Uwj3S|-Tl6zUs3hG?5^5nvVKEDJ z;@ODh^DFqnlqfZz$mw+>G8v#`jBVO1byfjEQ7FQA%PwQV-s7W;|MyJ} z{Bo;}BVzn`Mw}*`WQthk*j7e$tx9ugo?H!SuXV^XN$N{1#{$>Ff6{gO$M?l^O%$K`{8OZbqS3CRvJCW`p%>yv z!I_z0!}UPXzU}b z3Pr9H_%r+<#1tBaZsL_}(Dl=QBGpov*I#;#=l}TyuKi?>f0J>-=A{+3E}!S^H(%ws z=l+PV|K(rs=%?5D);Ir(Pww1hmPD9#fgnc{ijoQKvc-yRQ;%Zi6G=xH6r+IMS%41+ zsc6WIW|FdDxLkDS*fMKedvl-MJd0bla6F4}Iz|&Y_jV6B-0Lx(3Z{XNW*SVUV}f8z zy_#W)F)}%(e{8#?QA)qtBa=A`^NYwta&YeuC3Dh5lFE!Qj1ic)j)!f#7?wktsM9BK zabp9oq3Bd=yzxITV0(|zUfkrBSH92YMv24TJ?`AQ%@a@lCYzu7nD74WclncVJcqSX zr$BJAs3LShR7mbeC&)q|gn?z)B*3lFga}X+IJrd6e;jCez%4h3CtYs8w?keCX5%9)+o3Q!WT}sgX4tmJ;m!^v*I{L) z!>wC4Nu^?Leudgfg?6ijV;Te#pMJN8uImWhf21e`Ni2UpBASlpRWJ>M@zlo@gQ=wFZ;WTJ0w5T>KY(98_%MU)pc+_Wi`vx29>-2g(Y}@9r*XOh_YX-#)cHH(jo$jC^!{hxmy_b+~; z_raxHTj`}d{G^_G7+kdH{TcV&Kk2^TpY-{Pzkj;#{MQ$OTanNB{@KcB{MUW|J;D1i zxXM3F)Yj*V`STb3vvg>`O!QeOYDa+!fBQ_-KNH39e&Ih8jQ3bi>8<{Fgt^~O`#MQ` zf1Tc9y>ow0^6THJ5D@rouXl0qg}?82V2t;=@E&6M?1X^)E>6!6 zyK=vx@_pt1fYvXdu-F~pxbbr^%lGGR@B94w;JX{*A6Aa*a}|ERzsrYJzXVyof9F_p z=j``%BNakgK8N}`;=N+vzTZk?>-Rs{PVD1CXpc$9B|zh1xo2-nDL`G&c1!12s? zikba~TjEi?Kt~2ni2Tu92`g5uS+}wMhDtl_yvwe;?Y_r>YA2p_@+qgDcKR9L zsCoCo`nT8rj+*~MEnK8Df3SX|#-p`6r7+FW>1%< z<-jhpz%ehxKrn3|^6}r;{e|35xVe=6FWkZxa!%0w6UaG1_Xp(uj@xfgGs)e0qPqww z4HeWUl70->ZG<*d)PDbY=D50JC+1}<#$#^GTGyPloVm*!WXGJ7f8|aZ%jRx;(d&r? zvD(JX+0O8N*jnB~Jk{@7k1y3RK^>N%Tgtmyk9+kqr}0})T_t)V5{gc|SDuG4XC80U zw^h#>drAlMa11AOHt*!Q_RLi~;1Zdw)sb_woUM;ckViBhS3KqZo2l*-`L%hLi;Y#| z*)b1ad%QF4ympPYfBW$PkUM|$vA~pvbB&8ZJ4^Xy>}O32!0PrW<>U$jS7xTkQ@))t zR+?)P)l$~6U6yq)@LJ#i$R5Lng0{4sSj^nqYpd$FNZ|(LgGcRf5){IirCkg1g-BKIn+Gi z;(4-bB+=NX3ncTxLR&}GdCy~P3e{@63^tabahSot>V#MeOpUAE$@X%)&K>3x2;)#F zAQSQeU?+v_ zj9gP5Z4Y2?e3;-p2P-_HHdJmUsQ-gNEU^!?RzJpWmd-~A!7wGh*}=j z?L>&(y6Sm~LbO%|FTh#^B=t_7*ER-RU^{*kur+YatkcV-0JJ@aFeaEAqZ998H6g3o zXchCx`jdrHUuB;aX5K8;Kcre8QpHQER%fQ1H5YTKf5W#PF8TO^{M-UrI)DU?I3LS% zuekYQD$~rdG5ac>hARBz8)0!g?IxdLMT!x|3 z02eDse?-(uob0r5o4~Y|J#0Eu1t#DSMi^~Ma+uxaoaRX2VG?4+`knA(a* z(?&iJuV(hR2!H`eR$Y^<69mv;spg7YMz@`gM0cOv)9&O5%E?J7n)XZpAC`8dUl6t^ zf5+~hh@gu=;HBB1KXXhaQYI-IEVyFzQ&p;iQJDooO*~LLtt^kkk;ad~p?IjPresH+ z-K8^RCKsS@Cgg}QVg|H{0?Zbqk13GgIl_KIfE?|N5TmJ2X8h@>gd?7}Vhs60BcTpO z0V&QV+7`BTbw}0HATwFpC``a;b1^9ye@C*Sx=zY96@nQSg$>LKGqWpS*golbqejs) zh+1<};$K3ZZLf?xq|c_(f-Lx?N{+U{zR`E6*q9lUN&iQX=7pgX6_S0b)=gE~gUsQj zCK4TsgDXlHJ3dL@BR`3@*kmAYE%C)e=}gt zK1}7PmwXE{>^MZ2)<_vAFOsM%S;uq{szNwQa0lQWw2MxmEX+bMVP9B9$+QOn%FJ^p zz;IxR#M#r?rb5K6@Px{P-zz^A5>MF?vxIJPns z)jU$Fe?UE|!g1`IlA@ zhynhVb5HQRQp*ge0Yrp<2qmY52uP}pKqa`~GHQuptX;ra3%mPh=g~0=B5+FJ+K@AygmlFPd^1t-fsn&IBKAlN8P8uIlK}c_W}&R z8+9zZMGCTPR|aHwM43gw4rTvATnYT#@dgR0!KaJLDqemg`<4pDTJ`g6P(wFSZ@j#! z3r-r&_fP4b`hS9m=J|r9T@(o~U2W80N=Ll{8Fg;_5qR;iDZQ5Df49yO0N2Ya6A_7% z2MAb4>kJe8QASV_=%xxKNqwlyz0-qKFKKMsVMt`DN3|qm^klS2hL*0#w<{mCg};1y znjAAyq)NxA+L>y~u^?#ZwSp=M!gkiRb2c%IUi}aUF2Y{CRlpQ~N~L#sMF=vkAHpBL zUi6B}mzQc+RCY@?e{80JXm0$h!ipPY__a#aA<9Al@oPdSKS%ThaujFJ)ntT~YS(yp z{1&w#k(rO!#~|o`Ej3*>`NEMFGD_}B?MNfktHXPoizc})^@*x~P?{dMr-E9f(yk#S zY3bMe=alTs!o+cAOk=(-xN13Vg)N44ZSWD*oDD`E*z&$>42}q_jUxSm8@2v zIVrDn%7UE6f8$lY=L%Q}S}F#6WIR1|wo8QtDIXIo_}gm8x4lM4 zflq2XB6L2kghWqADdExwJAaIF|qb z0fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~lJsg({E5pl>+oh(Qdanvdlp+cw? zT6HkFenOLmB*n#1a4k6au~>C*an{wrRS*O}e?Z*aoD^N8#Q!CQ7BLXd6xINKSzHqZ!*9q z63;T-u!uK^r#CH~^FDEymE;`pIq|qb7bJex1kia6AAVGwJ8p^1^LX=jG6cZ`h zk9+us9lt~_gfi<_c z);>-jfHZZLya5glfw3ZGuY0_^x3jl@&$Rmc0eWn5s(*2Cy8r+W!?W`ciUK4!Vm325 zH)LcjV>2`|Ei_|dHZ3`0WMeI1Ght<9F*7z~V`Dj!p%ae`H8?UgI5s&lIW#yhvpf_Y z1hYLEUO+ zBFM5tN~B4V;&2_#%$c*l?|JhfnCBz>@Z9`0&bZC}ZRPt7HaB<4Bgy@{8(ewj8l9%c z`aAEC9a}v0rKd2IM>I-^qZo{kq@S{O>jC3`_&YSE;RvuwMXDEME=XBWK_@E(tx{*k zu&I9<7AILj&vxiF>-=JOmwS^JDe{OIUiox`Sizq30v~`5- zSQOy_d%L?_yn2n5r>~)(6`Bh0fie$xl?l4>s4i zo{jN+n?|F~`mG~|LrG~)lH?}Ja45A3`wuoa+TP~cb05TUO^%NSOmr5B!kE`zeGl`j z0Hf#_Au}$oo+msQu)lYQN@JCuzV%D4tX{@yx=2xyr5W)!WTIJTd-D-9(^IT(tzmzb zB_$<^1&OJlmx^kk)3j<-O@~NijFrZo@AJBdcx`8c(lkjlol;YD&rc&o&R~>dRq6=Q zXOslEu1ym5$m0|IdXqehkwt;)*U@xIdv*%VteqX8R&P-n21TS1_j4{TUtyeEyz)OU z^4%-nq*|Fml__^_-(hv-GL(Y(**SlPrw5$t&ah>GCBZ5|lnT9s!1j^0$9jFrr4Tl;MX1eUWn~D?7kn9Bq0b5O=W0kNU8DW&)>zg4BFEZ zbQanqv0^+LogJW{M3)A-A=%v9;Nl0C_}wf2&ts3T@X|{^Cs??|>E;H#lS6-2pIF7R ztEjXjO*5h>=GeBF$V#k2qU$DFp+Hw`s4>@7!W;Xi00_VamOO`N9gh{=z*l2l{N)>z zMa<*RJxh4n$1w`3o+612C^8z|1u9j8csStE!(9x$i>?ZE+egHI0ss?>WRS4EwME0P z6AfcJ-42sf54Cb`G<;~Qg&WK8ejAsBV4t|U1;L`X?*=MW_Y zwYrVtHi*I$bO&7zajU`E0kRMtt{spU87r5U>Gucx)u%s+@C;^_=IMV_>zpJpFFgNo zlw+c)65WQ*+%)kx=g{?V$AW`ojNNjXHe7`g8mMr{u|CA~U2@&T*F8+(Qw{jcHG{IPH&cY8IAV zC5;T*AZ*t|yClN-$WT!)t=7fL4f;1X)>+LtFH(a_) za~vOziQvhh171pwZo5v}OL6t!Fc<7j*OIl$;(==Ig4Z;MDgrFuR zU0tJVYPcS>J9WZQKtml;Yb`K5>XYY^R>!9hI$BX8!V~(ZM@+OQu`HWrD`4yWyBzg; zX9xJ)*S-vvODTU8X_Rw(aLQ}f-y%Fc;3FUUGnOx$=dmaLg3b3gxbT4scwPlEg=hKn z2O*#JXSi#H+|CB{!ZEkh7^&sVRvc^%YF-6XWi$<&Ln(+wK~EOMdW@-TqSzpfPMN(l zN7&CvauZa^K`%iTV?>eSSPnDY1wcb7L7Wa)SUAVg{_%g=0fg(5#4+h;j02ded3rlm&TMV7oSWHnw4Kc(g-j zs!Ns$4#$5jJfp|#!u;6*e*3?_=IQ62C6yVel+=P6z*@H`!q;_g5F zfSPVFJmb+;k9eGu79OLM9X#JK;|jo-YC<3B}b zdWm2C>L)BMR@gh(;r`AV&wTi=S^D4ue)O+D;_tuzZS1)Q3XK&Npcxv8DtMHfP$&&e zGqFvF47hhXBmo2pw=6Kq0!u1txcGJzBj11J;jK-o?h_P3=V(7A?(b1#8B$6tbBt02 z!NeSXeTw(~aFgNSgwE_N%}ML*0PTq;GxLJMUdGYhr+N478~k7ICERL*YtKB*m8UME zjWzz|-~Wp*eCad1@HcJ#9LHyGV}pw4GB?-d-o3lz zg`hP#clH`gl7##39`UoEzQZWL&&NJ>jlcce3sk&wy!7%721AGT>;hl>!t=a+<2EZ# zJWjjj@#-r#&~(_*a}KPM%rXfyhXr1%&a7J}OLMl0lmaM$($J7bNv;(LLlT>URLfah zo?&M39N}q?cytITG$f56$F>AQB$#fK=F|j1yT;PhWmc~~#^Cgj&Gp;-5k#SU4Y*}u Qpa1{>07*qoM6N<$g38~1{{R30 diff --git a/src/level.c b/src/level.c index 9a358de..c88e585 100644 --- a/src/level.c +++ b/src/level.c @@ -9,26 +9,39 @@ #include static struct Level self; +extern struct LevelBin lvl_0; +extern struct LevelBin lvl_2; +static const struct LevelBin *levels[] = {&lvl_0, &lvl_2, NULL}; void -level_load(struct LevelBin *s) +level_load(int id) { + const struct LevelBin *s = levels[id]; int i = s->width * s->height; self.width = s->width; self.height = s->height; self.size = i; self.data = malloc(i); - self.source = s; + self.id = 0; while (i-- > 0) self.data[i] = s->data[i]; + player_init(level_find(TILE_PLAYER)); + particles_init(); } void level_reload(void) { - level_load(self.source); - player_init(level_find(TILE_PLAYER)); - particles_init(); + level_load(self.id); +} + +void +level_next(void) +{ + if (levels[self.id + 1]) + level_load(self.id + 1); + else + level_reload(); } void @@ -54,8 +67,9 @@ level_draw(void) const int rx = tile % tileset_width * TILE_SIZE; const int ry = tile / tileset_width * TILE_SIZE; - dsubimage(sx, sy, &bimg_tileset, rx, ry, TILE_SIZE, TILE_SIZE, - DIMAGE_NONE); + if (tile && tile != TILE_OOB) + dsubimage(sx, sy, &bimg_tileset, rx, ry, TILE_SIZE, + TILE_SIZE, DIMAGE_NONE); if (++x >= self.width) { x = 0; @@ -81,7 +95,9 @@ level_find(enum Tile seek) enum Tile level_get(int x, int y) { - if (x < 0 || y < 0 || x >= self.width || y >= self.height) + if (y < 0) + return TILE_NEXT; + if (x < 0 || x >= self.width || y >= self.height) return TILE_OOB; return self.data[x + y * self.width]; } @@ -109,6 +125,5 @@ level_set_px(int x, int y, enum Tile v) int level_oob(int x, int y) { - return x < 0 || x >= self.width * TILE_SIZE || y < 0 || - y >= self.height * TILE_SIZE; + return level_get_px(x, y) == TILE_OOB; } diff --git a/src/main.c b/src/main.c index b3c562a..e6af893 100644 --- a/src/main.c +++ b/src/main.c @@ -9,8 +9,6 @@ #include #include -extern struct LevelBin lvl_test; - static void update(void); static void draw(void); static int callback(volatile int *); @@ -26,7 +24,7 @@ main(void) GINT_CALL(callback, &has_ticked)); timer_start(timer); input_init(); - level_load(&lvl_test); + level_load(0); camera_init(player_pos()); while (!input_down(K_EXIT)) { diff --git a/src/player.c b/src/player.c index 185d595..106ab9f 100644 --- a/src/player.c +++ b/src/player.c @@ -14,6 +14,7 @@ static int jump(int on_ground); static void walljump(void); static void death(void); static int oob(int x, int y); +static int collide_tile(int x, int y, enum Tile); static int collide_solid(int x, int y); void @@ -75,6 +76,13 @@ player_update(void) /* death */ if (oob(self.pos.x, self.pos.y)) { death(); + return; + } + + /* next level */ + if (collide_tile(self.pos.x, self.pos.y, TILE_NEXT)) { + level_next(); + return; } player_move(player_update_rem()); @@ -154,6 +162,7 @@ player_update_rem(void) void player_move(struct Vec spd) { + int vertical_shatter = 0; float sign_x = signf(self.spd.x); const float sign_y = signf(self.spd.y); if (!sign_x && !sign_y) @@ -170,23 +179,38 @@ player_move(struct Vec spd) self.pos.y += spd.y; if (collide_solid(self.pos.x, self.pos.y)) { + vertical_shatter = (absf(self.spd.y) > MAX_WALK_SPEED) + ? (sign(self.spd.y)) + : (0); self.spd.y = 0.0f; self.rem.y = 0.0f; } while (collide_solid(self.pos.x, self.pos.y)) { self.pos.y -= sign_y; } + if (vertical_shatter == -1) { + struct Vec shatter_pos = VEC(self.pos.x, self.pos.y); + shatter_pos.y += + (vertical_shatter == 1) ? (PLAYER_HEIGHT) : (-1); + shatter(shatter_pos.x, shatter_pos.y); + shatter_pos.x += PLAYER_WIDTH - 1; + shatter(shatter_pos.x, shatter_pos.y); + } +} + +static int +collide_tile(int x, int y, enum Tile t) +{ + const int x2 = x + PLAYER_WIDTH - 1; + const int y2 = y + PLAYER_HEIGHT - 1; + return level_get_px(x, y) == t || level_get_px(x, y2) == t || + level_get_px(x2, y) == t || level_get_px(x2, y2) == t; } static int collide_solid(int x, int y) { - const int x2 = x + PLAYER_WIDTH - 1; - const int y2 = y + PLAYER_HEIGHT - 1; - return level_get_px(x, y) == TILE_SOLID || - level_get_px(x, y2) == TILE_SOLID || - level_get_px(x2, y) == TILE_SOLID || - level_get_px(x2, y2) == TILE_SOLID; + return collide_tile(x, y, TILE_SOLID); } static int diff --git a/src/util.c b/src/util.c index 11279d3..1ad0181 100644 --- a/src/util.c +++ b/src/util.c @@ -9,7 +9,7 @@ sign(int n) float signf(float n) { - return (n > 0.0) - (n < 0.0); + return (n > 0.0f) - (n < 0.0f); } int @@ -17,3 +17,9 @@ abs(int n) { return (n > 0) ? (n) : (-n); } + +float +absf(float n) +{ + return (n > 0.0f) ? (n) : (-n); +}