From ccdb63fb1eeb4dfa2a6b70c24b668e60e8181a09 Mon Sep 17 00:00:00 2001 From: Andre Schweiger Date: Mon, 28 Dec 2015 22:20:20 +0100 Subject: [PATCH] Rework connected tile rendering Might drop FPS to about 50 in certain special circumstances on o3DS --- data/icons2.png | Bin 17650 -> 14933 bytes source/Globals.c | 17 +- source/Globals.h | 9 +- source/Menu.c | 44 ++-- source/Menu.h | 2 + source/MenuTutorial.c | 18 +- source/MenuTutorial.h | 1 + source/Render.c | 515 ++++++++++++------------------------------ source/Render.h | 4 +- source/Sound.c | 16 ++ source/Sound.h | 1 + source/main.c | 16 +- 12 files changed, 210 insertions(+), 433 deletions(-) diff --git a/data/icons2.png b/data/icons2.png index e9e408a9f0891b5edf304fdc6c04c0934be0eb2c..705900722620046318feff1c9531fc92b77d9049 100644 GIT binary patch literal 14933 zcmeIZcT`i|)-N1DK%}WC9pYmFQL6M3Kv59|L8%f5geV{_BBHbe5Cx^h4g?4YNXLNE z2}MdGN)<>#3nh{Op@-1Rjn6sfeZTX5_Z{PoJMR7O{*kr!DtoTE=9=@j=bCfprPWPS z!9$XV004lX*|p2J0RRs6EeGHr5BuWuFyEbhIpA^8;vxW0hT`9Wa16cYpK*`tTm$0rbA#BW1sPk4|VPt14^l#KXn_0Np;b%NK2e zAoJ;b8)s~TX`z@Dj|(u`%MSIF!%?2@ZgOaXIJen%bGbLI+>RU^uPw5^XlRUTta6Ta z5-p;NIlnw=&As=!&3)|t<7xM|GIx13BeK4p7P*=(E;7{>%m^QwT}Q6#+vY9Q@0T#r z=$nDIh_Q8yb=52`Z5y`DQc=N6(at3rU44UCB430$kc)1N6Mj( zGcX7rYo;lr0YTqelqP>g`Ci}ig@=MY=7;L_u#L!T-G-GqpMTbASMZ$|!hq4iU1^8; z!qWn}bU||1OWTrXR2$rwQA@N`_~VF##qz$JGOpC?&d8^|w5hj|5&-$4W~b{E$KF8odWbCqE{B#4&1AK@ccKS8X5}*k_(bBM z+ft&E7;V9EHRW6bG?$3QuFD!UHm!}681gu-A^&ZO+Pyryy#48)2rFaqy zvU5?CLo!3GNBMy2%1mBHB8>Fg^Se4hypp0>a0$F#Eq*>SDeG6L(8ogax@&jxg;8JB9?CrI{s65v#^^zC>v)-IGH5$@3OLg6r;;93i z{XUTe8-8@;nlr#njwDSrSo>^te5jT%6|8s6!op~l8}RncQbE4jCo|b~#WUT$=HMg} z%%^DU#Z*Z_*%b0R1uY3)AWiYA)zd~((Ezjhkj?%vqtJ!cV zJG-D)B5$Jiu2B$KySCZAbGVb07W2`QS`X-P3UgaYb~kIM$_l>0{`d=$RHbQfv$LoG z)Iypnsd>E~FZ&Z50A^Q4Q}t{kHvM0xDsti!$VXd`aFKy*-tPeVr#<6~HVMHTXB|6M zvmpT2L+020YOwJhkbr6uy2anQp-}D&)}5%d&R8Lik34Kth6{H6sVrEeA8J~yHZGv? zIsp`?V+6eR^a@2Ik~bqIouNe+;8mXuVwA5GIRZL#?8XizKefEf|ImV2?P9TFTl3Dq zJ2{SZ>pgEW*y};(r{5*tteHVsq1es%zd1cV&Iv#_a2y7?yV&v@4~Q6YD|0^PaFrr( zXL{P^dbBi1#RJ>t0d&rA&9zK3Mk>n$VyI>n)5gwh(YCKbM}E{md>b@!|xdv_W+EUpjvNzt!=_ z7nzgR9}2kvx=vxX zk2u8=A1*X>V;e_TMe>aAzbUew^Q}HAXFvwQ)j$+*y8>|bW6joIXB`V?-uL*pBs3lP zRI}0gTdniWAK9LEd2fPKhIb66_Y9oBb9d?a*B z-H%}^D8_*vGh8OT%(B390<2wcKm3WfXTU_a)Dxu>87sD$3c=nF{Ayg1s(9!hwgdlJ zc>lsC#bTVlB_nZlaX{l6Qu&(}mZ!9B z(x)t}Y`+D#S9;{U{b$8;$Y;Lk7HW@)@cdaVOSj+wIhs_(#lV{kU2N_u@5$(UBSgaN zZEB^FTLPz#pcPYrZ36R#2^DPkl+8XeZ&G0gY?*~o`!A-~$leQx&noG^yb>6aAV&4_ zjhDv+WsQ)yjj6J>!K)YhU)c&|6=dI+vZ0r+d=#`%T+X^C2t7w z*iZ*FIS|u9?SXgP-iIGy}ilYk8Y zUlRG5mk9J2XI+Kg*X|P0Aq{1 zkW6Y`&*}_@vx_6V=kV5}a?4wwN`7P8k|*Xmj}?J&QMXh81-|_}X>-dl&^grS;ES=5 z9G#&n6XAEzK#g9Pu&u-^K-IoX9%-UYAoaYSR)ifhTPx^#xDM~mL`rrnbPVwQ1Wcq3 zV520ewj?1p9Pt*kry9Sj_L3hE|IW=YlXeOsQ%ZZ8!iUI76n-@KF65Ql?~7u>8r|Xw z@w0qs4~2*$1^ln7&UzLXY?65f2JuMrs^*K_toQD+&&rHin+hIqG(ENgMZ7HLDC)?h z!9e2u#?!E4R7+7$FQK28aZgFUkJh_-TfA4#UhR|-<-3sHG&AqbDR?V0x-UDikybdIftc^lsF4{^^k`O zELq3MV(iVySCCub^C9>>MQ}+R2#dZbDDLP#AMNwj@Q*Z)#J4LY+^N7y;*XcCyKR~L zwN;A0eotHp3M}I`wkXmAln{k}sPc2M=>*a8-Cl7wfgN}xQu~zv3j7j=Tpj(b&u+Uo z)%`WRx(|-P7^|LZQdu3LtL!!r`}z-gD}5hqJYx(bIurb`kr&i>_I(lb+4R zL|?mSmHr$dPzL~5QePLE-MRKa$XM_;Z|9f|J(AXDE&hnZYDvPlkS}4gsZ>b?AZsB8 z$i(Nn9kw`**@V%)I^M1bvOy&D)Y_CA)r+bgE4$j8=7lq`^0jRkwzO0#2svd8>~R|_ zx)GcTn2zdkz(`np?jHwOFh|iC(VwAZwOVWqn(??F4-|-Il?Fy!t#l}{=kf_}m29J# zDPo6e!$$iWe>7#@#5$C8<{7Y#Z`ZugEbe^k0I9IuTqyJII+xFSXkiSL_4@L;_Z-7* znP>B=uT^?qNLP`(-!)d$%U1$c|bX=d8@J!_Y3 z4E@U~z$S9}51-<9eVzs^Ovs_q+GlK)a?I$g$>*%xHZSmE{R5n=NCwh^_{J3`0s@AkR!7I z4Jcu+kU;0mwDcI4aHy!n%7rxXPo$i}XX*+6*}$%re+oF3+gPyo8MOQW!ls_X!Gw`q zi)tUS5ngrk9Fe>dP`JEe%+^RhBT$7xrm$zdlSq$gZv8R-rn}Y^00%1*kz3vE1}`X( z!_AUz%+nw2+4d1S0{e07AKII;Hp!!&Vy^!nD#bikruv(?T%XX0tK8fBynd>0+snDM zliTkOMM`zty)fS-=zbyP@%aB6{(n|7;Q))Z^l^ge6EiPLDuN{2h?d-2 zoRpX6D=CxrkAdOK8nGo+f11Gt)U*G!%~BH=noACe%e&=MKRLjqF$mA$_WZIqD<6m9 z0?mj!E>8S|1S&n;jbqKXzRl}mAw@mD%}Wt;wTvZd$sCk71Vkna49>infVE*oh6e0yk9CLIXv~==o@d!Q$UwV@U66>4SMch#57LVZYW`n z>tGB&3HL7rIHIR}(bN9$S%G+*;?V?F)2xAkOlhDj=4Kh|twnd_ljdhMOJ{(ht)p;J z)uy;zUcb`m|$xeMMl**5n<#S|LMA^mpMs}lrf{OdwfYng&y!`q*FcA}I4|M^U3 zV|%7bghtX%1=FK{ccX;yK_@;b;kUHNvQyq!sT zL!yI`0>UPps|oZ4|E;opCmY#g7_r7?LMJ-$C&EqhZGu$m%fjIP%az3D+GJUW1m0Qn zh-$N%P6H;UB;lh-$~Kv30crYY*KIMG=dcH1AYpJ(5L&#f;r3R(zHmh7C)zEMK}UXu zTZpTsY`&EHp8uaA`o|wc>Dj2lo03;{1jhJM2TRjG_G4auyPbL^ib*TTK?IQ%Z{-UK*n63Cyq1 zm^YR8pUtt29*DZQZCvu{zLA}!kF$U!Kf4&ogT|{D%L)wfdMUMFeg;kQ%=4CR>O~K{ zg|c#HY6SHB+eb0_E-mLk zl|6UI1}sIVggVp)L;?L@Fjp&CAE2zJn~rfMK+Tr;mqT~Hy1&<(1EbdlpXo8PdA5t~ z4O++!o(R3RS;b1s-^OjEyw#pH@)7DOi+DI|=$#)o18ZGvC4NDk6b0P0>DD-{72IwI z_NAD8n?1N?#O(Nl=uhCE?UKoib^!HyJ3JrwHf~$0tX1ieEXU)9IBsWxb8IG#vXRYa zbk}hA?yrC*sT*Hii?%z8u0kQ+^~nPYg(=^;GrJ5r>?L^dd%Y;-&u1zRX2QF7a=d&Z z!bFN?$0eOBRwAwkAxbKL{0`&?bVM4KKu;1tjuATl6)9%;muStZhp3g53&pafc7kbz z+)>j5;>4X;?cj^n%wcZ8Zb)ubD;}#4f2!xU-K4o9fGx$>VTixs4V&(fNmRo~-JU$n z_@@TmJiS~+?0sn>1_$Y}QC$nc0lCYcaF?NEXL_5}I_ukzm>Xh#-Tbz3RBNdtz$62? zCFW&z2e5!+t{S2h0ra$ho4`Q+hmYyl$C)7Pv)a%aRM&bhs{PjKcH;~dC#L1(zzi=z@yI-QnZ&&Ovc z=F5_%$%A#rNY^tqE;BE)0Hm1h>Bbp$u;s7}SC2v1+xV1&e-H?5wQW|wo8MREJOI<5 z7X{S8y+JnFh@9E>6R`7k8NYZFK1Nry%BdujScWvL4C_=Cnl`SPS&HAd19&kD^Bg3PvZt0)|+D$`Ir*f&RkB zuM8h$g^)w6?yWjFv8GAtM(q8L;Hjc{q=5&xlmT-_m4H&iXiecN1s*qNbKznPGj!0D{K$BiHgm zoPe6O=+U@fQlH_}aau9nMDVhSrdrSc4@3;|{hR&+L|f;dqpTa}WD$Ru8vtBIHQdnIq~(~t;d-E{!n zf2gc+O#p1^Id`mBGzivK>Nq~YE;32^LPau~L}M)%!oMH~&;KuHPk=WZRONqr{dxzm z+b0dTxAhl0lKtD-dtru+C_*;Q+E(kfS+li~g$$ltMxfNYh9;W~T;J4=8~r;oF8x%u z%Hu?XMzZe8&YbSe0p{)8S>4ahb(LJi;yZmU`73YDy1%g<*+a+|g?gsHi@J_%76x2y zn3aBwO3#KEE!KU37^z@M-9H&D=1Rz}k1XNDv0eh z_PCy(49!(`^@xd)d`8$qkHIhZKqq)a)Qw=wKoEJSw$o#^$$)@i`x~ChP6rc2&_(A^ z!cOlA&#^zK&Gu8TxhSW5aoT1YDCU8(Ki6)vr{WI{fT6p|^i48@V9-r~7}0_a*S6HU znPxS}wb~=J`M^^h!;GuRRip$}R6x0ICY_$1jmdbD7=one&TaKRd@V#7hr`&$dCShT5>)h)YLgnKxD*)Z@onjM;dLvEuJ}kI<2W_cov{uydeD_=c z6i9E^=?!~dQ@W@GKodS}-~F+n7~H}!GEsC-~>bNEpqAEEv!?W-X|M6AmghosaQ zR58ZB7)c(I{(Ot@3o_+-0u2Gx=r7}uo6yJJRQ`MS;ewAr$@v9DJ-U=aQ+PKk5d zuOXOsoCz(e;USC0eJyy5_eM1kIkbde_`N#7Z|E9%|KSnV#^T`@9*kPN!g`2m&jp)?~EY4vWy3YU4Q zXnO1KOXEtM)yl23!#(bM;X6I$l`2=6!&d-uEAib*<_o*LH%79qb}lM$4rL^MGwA4Q zJhQx4c{yX_fd6Ww_tx(#V(&@z7X<|uBMnMv@@RYJFpg9zu4UZsJ`d!{uSpT_~fs=FeYp$?Gk8S`b+QBLFP!>&IO{Xrrldq%y@4@7CM zK4?t-Ac#7Q)*Q{G$a5n8rrz|BSLizcb)wGRI>6Xa7Sx6b+7#$Bw)^SJnw~BJm29~bJ zZq@*n2EwzQ0j{dXRHnGDH`2+0TQj*dt^YNjllcM7jGKUnWdr7UuMlFsuI|e_+2cF9 z%H16P;=9B_13j zry3o4)NFT4lMl+yX1w_oZaa4B1TkdRb>|pUq;+#pv43EK#dbB1tK!;-5rw>mUra&0 z+yXL{8`Y?PJCNf-j+Q4mG*oW-FumL|Keal|g`>@UoaOo+uSQtFWPKn){hF59nZf?- zgb%;xYCt!l=ZwmM6myjj*Hqf=6^KP~uwxT#3IKMwnXpd}-wPCTK3Ht{_WmiYS3|{J zUiAh&#M7qb@BPtZlA~FhxPx~uWP<@cKE*;Bq4BwD!j+f}_zu1uakWY{qcfvDeuA5U z&XW-Jg+O|VZ==dKwZ^~U2JT((ZR00uTB<7!;c!`ej3=>ClIHlg7svs zq?pScQE?y{be6I!v05rdEup)-mCA4L>$CYVNKY7ubVv1S(7q9qvU}@+fQyiW7g8WT zCo1lw4}=6~mY5}aGTIB4>lgQp#W;()?+(3?CFj<>!`X{?V?;}Xb(@GHd7CA@O6cx5 zV>zk{K$7Xoe3% zx&Pmcugo-`$Ku{daIR;$U+Ck8-}dn6 zX)$ZA*LLL@)P;?ZuiuD8c3d9+(*&Z?`$8R7PQFSxi!)0%%X0#FLP8@`n~^J=uTl>F z-Q>YhD)z+cPyO#9@+yFo`w7|w>NCH&PpFqHv-wNM0q*8%QgXU-)ED@h>engyE!pa@ ztHOR3@C?$;)6z-oOzfp@nH`E;>Z4<+-2yyvWn$eqYWMj8$rV%aLQ4;GhQ}&CHu7=9 z+twjeTnWJNzL$XWiM-cLYnBoOxjnUw+hDR28H* zIRG}0IjbC$T-qC_e{e|Ny!h&(f!10%VcBvqxp#9DflMsxF+~-~aq2_*mMbXg4Q^QQ zp~73qE>(W%HwqhsicUe;KJ*bRv1NAdH0dQgK(_K~pjJ}zqhDfTAalF*W}(?C^N;SAdenF&Tr@H4BwsA!h}TcPg%mMQ!9Y7y z?SmHn56^E11{EW0W-&2{M+d0 z!Mg1$35Z`}LkpY{j>_U6Q3Vx%j%0t6$X-t;O^q!WJ;MPFSvO(SK$CxK6kibpWZKqy z-QRn6rKt}*M{b(s^8)!ezo+Q)X6{-6C);W+I?Ya8I5>~8N3C7dt!$sCw7+IM0m!0eOEe%s=b5uxtwkJ>_O1VNI1dxzb zV^a?jwsd*nX=fo2wbss^sZpCe!ba`K*OdXrf>@oc2TnT&uQ3@XBcu-owpBD+9Mb-B zbn&Vqs51*cp_OZ|=$&ndGu%7>)O8l(79KDdOYjYCDR>*Cn~9dI%A& zlU*UgMHL}yA7KR_TJcqgX|gDLlKe%r2$1l2g1+ola^=g&7zv>HCU-=C+X`n7O8bag zh~!n68fen%Lfn8OXuGG(=7t+}*zl1L|8}NfKdRrjWg0eQrvg|28$TI~>)o;CZ&GcI zw|r#&g#A94oNn=-Z{+&3-W5M|Tk1hIkYILMGRD!;#KxOdDeM$AhN{1KE&z|D{qnME*;1$h zoX(U)%UE=x@Z5lBLo2f6RLk;cJLa4>-s|kbaqH#@aKWfvrWXQoUxJ zhtsP58mlh+GKgw_(g=dz|&vDnr|K$h5n=s*l-A9Ij*UNyQ?;n z;yNO##WdJa`lv}%RpajbZ(OM24-$# zdq;=Q948oq1T{ukvXvAXBl%_sSpSy!`{mHb>9bfumryI@)=b) zL@2w5ong)HG1Xsk%=v5y^sf92mKq?n)%x4RVP!#{QwdfMC_7s=@#NW%g5HoP;fLL} zdP4Av_}E;v8_txLzGp;jq&7rDs_L02D15m5s@L}CM&J0aSNW9gbmNEoMqB{oS+~)R z@2t_F-noV||CR+c()+#T=w~}(yF{6Rcg2n#u>6Vh?fEsMbEl_j0VR>+s zyfEymm>aa*la&GdL;Fhim{!T_p-61FHm2A^eK}!WFv8|O$7<70+l!<4Ow{ku-9nh3 z((&b?W#1c}cW^V#jpCxvbpuIO|Qloa1jz5AqD0 z*TP;)Al7Z$5=I=)O;%6?id69>NjF}`5Y-!6@wFn4=HDym^R)BD7$)zepGG^L{0zUldYCTu(hr^wEF zv7KBh*s_-|z_%GqLH)Tzh5ox2L?WfiUELa%@$KA{(+N}Z7yQghxTv>=b1btY-S+d^ z%0aBjmHqO)vTWrBD);fGO4 z&ZUb5qXEqoif$gx!995@)yuDZgW?Tizg=pf-%A@;&qOV-kP1%S9xZEXPD$Gsoms~B z89H7!&A%+UjZ3-KeGjIBpl=L9gq(u6q1b2ha+ZeSbCy0r#gKq$)+jVK`XzpZ z+rDc*H4kI7mJt*-6daH->d{WQkrBFC9qu0Q6iR{`A-Y2=ci(4*U#E&e^!H80T&l*Q z2_M&}p~$r#NsZf|F7Pab1kHfM%eFl}hc4?A8bA3*4CxZWk$1>rzXy}--qCZ4@6=5X zqYM#qi;lY>l=P7OuFrIysCfTzR$ag%Zy`Q1~QtsH9)6q_UL|VZxOkBR9JSfX05X2C(?3j z_F}rGwu)0X)ieV_tl2Ni{;^}Pl1kd7b@IDVmjkO*77Un^u@{WOH<9U25F2mzC8$o} z-IKz-@4D+BInk@J9m)($h+nYBFz5-xV7IxFw#S0zQVoz7 zre#AOn(Y0?cFu%Rhc;0w8^aR;Sz{ofvHE}sP3DbLGEdeb(;16~JNqj-;(5%1#vxEx zuG-g$u*#9OzVuFZsa~xdwDM)G7p`)CYo}H0@w`(=-&1Xg@bTqreQX2LtxPy^_eW&9 z)Pn9#ux$8lp^1K|B4szv(x49KgoA8#`CoBK8mZ3wO3S_SX${)~+TNgKY|1Wj8&c=j zRg{={C78aN9om(u<&6*9NsmM`s>4(Eho)j4X$`y4#wJEWX>Vm6=ALn< zobmEqKwb%Yn9p+mmyOHb?1&q`Y`A+cy*|7WL3aitCuPKWT@;eH@qtWzy0ibaf|eXT zU)IQq(n*6W`W{ZIRT{@vCKR@KQ0-?(e#vA2eaAFoq#%H~)%Gd)Lk7}Sb-2TRslRq% zq2c2gQVh1Q=x zufTc4gx?RxL3e<%uy2P5Q=3qKK2kwgYS2=9w!Sw>NnwrSbBjCJ=ZW;f{qC?|TyZxY z7GU1;7pQ5icJwyQjN2JUt31=WYaB9U%N*CTgPR%OVMTq8mjq|(prfK&kX`U zTiz$iHSW+s70fYk=g20IrMY~bF5^VY5U}jI@>APDqDf{Q*jqExbw)qzQB}7nO_;u{ zK?s_C4%-JZh@h}zlw&`TD4k%tZfoYV_g~fc!tqqtP5sP(f%&*S(QRz_e$GkJ2J|y| zs#-efcl!&oM%J4Cej3jXrAYqKhxEs;^oUOx`zIT`nP0>9dF7ACjlS(xQAu1rFtQ?| zAGj(A8~7CSVUvZD9@xw=X#2STYw)XnUFRSpxeQ6bw}`BB21@~oRE#um%kc=}uivAj z{W_rTq&snRefm~<3uN1(*Um~k7nRZ6pIwO%&|fuh~68!Kig?L$tCPNVYC zm}Rga)giOl?O_ShwkfL^ekw?0*gpgGgPWhAZd4UY-%LWCH;PhrA45W~s1e~vPgr?XUNlVUi(!}v0 zx^0!T-NCj9U3!L`tK|Lg!TpqjfpQIULS>owfcTs@ zDdYXKs?;iFm%61AqtRgcQXu_R!yyst<-}xzPrC{Cqmb67~nY{?!!!zNaAs@pc0j_%lNId%~<6JVIo6wChA6F z_@HMM4*m9!hYxCc+|+cL%{5bfK!SXldYx0yw=vw~OEti9D8_f)%ir3BkzyH=IsL4y zK|3;VOx@ZxjZnY}T$ZC_^{|$pN)|-vA_c?C7MBM@5ut59RFEXIv`NTtwrhAg_64a1 zfs4(o_hFqMpKZwgfPDkQrmI`(EdRRm)kWj2p?QvWt+UwtXVVXqPr=-8SI&#c?pVuG z^%=TJ(oQ#n%zudNZ)F0R;+AR)u&l9=F)~9zRLG#d+0E{z=Tj1ev8am++a;OFH1IST z-*`IH;LDs2r$;^6z8CbqVVB7JVO0sR5#rx2$P90ynqnM@0|`pEq5iFllA~m@{kaB1 z2K?l+#^(>pO!kshfDW{l)XU4cD|0tsF2Vo`rYCPN`8#PJn-<#RzGe4yoV>dl ztn+oFeiFF4QK&EaKA3+s)wgDTaxyoXsGhMJF@2Xit(5%6!BEo=7XL@7te)&iW-EXC zP*%Il*L|_z*PvruJ#>p?X&R2m2xttZX8k0qK=i99P&#SjGRJupy&P#Vxz@|Lg|#+1 zXm4cYxO}nRlBDwi*V)nt>1eeU|8BI5s&cwr205U#79=EG&J;hsAqK@viDrT@`vW zm91}EDD35Fl`zCN;rE|7{DC)}f~|sum8%~k>D6D|lcJ{>`*2@PW>l>Ml>o-=#Vjs{ zcZwsI`Wdb+`~LN>=wlCE%RY*Zn_9AZcyYetxSt7*L-(_KMtMRvI>#IM_ z?$jsSOZ5@9N{!(!XMECQ>Y-3hN>fAgdRJrJ#uoS3lo~SMF}NMKLTEI_u)TxTXu(F| zwC&E|jq}wHPg2VLmSvt8l$UFaeNh)`vYt5@Ux3|DzAIlcvV?ft^5oY7BP=Kus{?Bp z6B^f-$IPa^3t}f)2+%e|jj>nQ(?OaI<7ktg_Fg*|5`i<6-I$Dxc`#8$A$$NY9Pa`F zRfU~%o6zx}nroz%X^xV;nbF=Hp!l6cB_kFEL7(5{Ff3WF15^qd`gedg&P5>hARMKh z2dpvnBQJWMLVpId3HwhtVOwjWwG)yg2*U579Oqox?b8BJP#j{%E&*KjcYz{RyXNBA zJKokKeF4fCd#|z+>4Cl9ra&z$J(hRCkLO#tby_=1yj?XLt|NUOb$Kot>6Rc~WBK!? zB3d6ZrmML(`WL1v4?IDDrdeJSqA=8yQs zH~f|nD-{9lFTXBneslr|>HCG_K8WTvyM#`dEq4ib?x@GV497L=nSU9umvy|Um&{ll z2>9WW1O1GJXkj(vSMolit&yN6(&04V+AqSWPlrB8wu#{35p z8)Xc=H?R^*_bP-W{g=?opc6*p_ zdM}p3)I4BxauV&@+oV~uTDb`h=xu3^T-^L>N#5q%eZsTz@eLmD=IOE@cjXLjk1>2e zv|Lpl`GpqEojOF?U((FS5j|Xj9?;wA_`Syf`bu8i+)>CrVei8Mxaj#tHEjMVX40b6 z)~MfKT^Sa1>u!!7K86L+0eO=8AvXkX4YT!!B#B4OzNm+OJ2qt`6s%}4QPa5cD{9%9 zMM%s100#w|tEIH8Z#{fizwv`yq@oi#XSRGQUMx|Y&vN(II|t7>7qjQ`w>ItVgG`#v zYppFmncUc3S(2#;+cjEFi;9(QG8E(5-m+XmJu<8s5AbL;t`i5 z`8r;b@J2#o)-8H; z`gv)gR-KIfXqQgD#?UbwQf=?dT?s<4G~x%xl)Zv6)2DJuzDj{Dj&G%i{gtDz=iLs< z9}duC8~rZ=ld#SX%0v0#bkSi@4dDw2xl1ucDRxOz1nmlw_WPjm7}9F1#;o1)>d1v+!>hK9fdYl6 z5Za36-O|^xJZb0R`PI$0s=>7A)Q0x7PutR{#%|uPq6mM*#%r(XRbmQcvd~m5x zlPz>#5!=Hnh)8&NA|1Rl~&tvsCux8jH?OXh}{({!=mPPQtH=S zR@?f5y5bwdQ)L!(`Pd#C-UWKI7MXgOu z3Ty6POXjVeH)uwjmt3Fz4;`BC@K(2 zKzd6+2&jkwA%q?TB|tz3A(Ye;pYp!Xd%p8s=dW{J*|Ybay=K;|H8a1xS4ql^>y|Rx z_iYCN05X>^UAPGV07aKTz*b4o$?aZ|ujnN1XJ%yv090m3^KMCq?zi2& zL%HUb;(MN0+<21XE3b6-mK0FJrl7v(?`!)byskahXXBB=d7;tLm}_^LBikcte2Hsg zzy3yOP!}>D25q6rXzWe9c-f8lR5oLcfL!V$BO`zMe+DrwGHOlN{Z}`FxsP9JIN#jv z_4RKWVtUC}idMU=pr^`lX3~)uD_*-#;1hsFB!rzANxHXEJuva78mY(b*^hS)hBX2Z}3Mw|7F^B_|IzN zNdni`WEk?znDw=<5lx!|HCuSsY}*d4Tsy{_wS?>gjuP8<8a<9*bo{cQ{AVDNBtX5B z{0MF+xQ$Zjs)VjiH<^*EDtJ;;)MB17Z1c%wz$33~p~y({4!+kr67kAEb}>P(udYi4 zeoda8DC;ZPukf++YLWywS@P6yaFBSV44?;OfHyJvmY}Z|;n}?X=VI!~az(6s53B4e zv-@S*9*ygxgkScC|Ji@tNQN5nw4m*}68G-v%#nw+%m_@$mY6`e z*ks`m&|$KPZ$O=%F|0+aYB~#CU2Od|1f4~XeLNg&!*a{eY0|udVd(hM6E9>(SJ=l; zN<7ZiTw-{N80iBf^sX7EN9ZTuluV00Q96+x@UXwmk8U(77M`D|o*kV4RH$!*$k$jG zdv~2F@uKUz)vRKiO|MiuDC%^7jE6{)eU_Na;p{yvBjd>~KwUgB0>hs2^O2&xuc%;p zM%$g6i$FswlkgS2ebv3g3%3^xm_T zT|u+jRj#TYjx~Wca0#ey9Z9CiaaP1I#C7@4D)=U?j=Xj+$0}Y{!ty?H75GMfTpSk! zaGCXApiW_#l27Vx^wqThbJZ)5G3{p@zF6MJANE6!6=%@%(TRABC`eBgS865yCKxlKb4u%|jHO@cf{KdVD} zRd*uk@iB=vb+4|o)SbJR@{X%ZwvuqY4y1Iyfq{_V`t$%3_*XSwdZU*OJW1vMv-~-y z`c`A}OmB_KnEpu2#olq=cvEVqlmIfy@_e^d}VNj>%SeE z%&r+)J6=^?*eU6B(gRZYXNmU^UX6olJRB=W^9KVpSD%a{ioAQ91r0}Qfvpce*O6pz z>I34JhsUp-4nS6Ljv$Wkfo9h-Sq)sIf21u zgFgG!V2B`q)AI+|)RDr0%IVkkl`O^YFNfLtx||+A83&!Ex)jZpiO%Vw^`U<}wx&ro z!lp03OPuwF>IqT;qyz)547wq<#FV(KUKtE3b@5F2P`{D#IS_PJ-UwqO2mks|aJq^8 zBf{QD+F9C#`(>fF{?__-liPKo*&}=nQB}`cbXC7GIZ+7VmZ3)P%6T$Jt$BN&)`3Mc zC;>W}VeIG|;HZSD8M*83o3UwE`9IcZi1eF3+iX0!QK$9(5^h^* zSvt|Fh5^}8k}G1hr78@)*n`)bU$xGgsCrI6#c_7A-q)>L8f#X>lGPqkMw@+{S~A7N zlWfzckqp@DsFuaL=X1e?C(t6=yrxg=DAW3=`LE4|sJBG~jQV z{8A|6x50c-bfS|kq7;7}xi}r8Y*Ji8kFhn080lhZt#olfW@PRl7!&mxtJ?#S&%L(8 zOU!9ci&Rhqt8o78&LDgC+hUIh@!Ikgcx$bCY|GNISlOZZ8ER;&gAp;+>;(X@FMGen z--3_*wW>LBL(m!e0zMmJk2MtRF{wU2ZQX-46e1X-uZRP@VitDKfd~MC!Sw(HKZaO{ zR^pcHpa1i@i2sQ^pq-D(YARh$Y~RfFzQS~fg>|rPOXqT&*9~i9tRgEH<}J9n`Uz_+ zJPvf(+p0)blhiHV9POPRazv6?DQ50hkax1@&pxEfCB{x|cErC=V;0WCiNa%E-;cyx z>h~?hRp(Jzjg=z;)#7npQ{b1p68d$pGR7;?RBrHTNgntmgg0v zJDrVK4dzZ3(dXp~tPr0-=h>A`FYQ#x4r-8;0IyIlfsS&(XcsGO&X(1+@~-n(MBLpD zxG7=VkmJ*#hC8dqZ!4)j5W9}*bJRDnA$)T>u8;NVBH6wjX~AEtp)eZQ(+w@%8*`z@Nlj z>Ez9;M=Jy%PBF$4;FBojkeP*g$?1;bXrZ>)ER)LOz*qv8BB|p0B4~F zV_^&NpT6w~chMQ4VdSKw#NcixRW#?`jVrE^ z*_n}V;QHgo3@=V@c2vaXuG0g&Zd`3ibM{^L8Z`6%F~%Bx)oTzmjcj-*pPlFgi5D2M z@XS`bQy+7;2jdQ69twPFPk?J7&z0yCX?4IZ^CzP$=^t~pU1X<$lhvdJkFSQ+djoBH z4cH42llvwOJ>6tS?9bJIa*ziQ>Y=js*Bia+tUGe2u`B+m{e|~Ue5q!u|( zwMT~Yb?J}JdVg(5&7d2}*uaaI`>cZiJGOjza3u%$)+;O#%z}e;N>#!Q1PPn@zghGw zo13e)Fo0FjnRvUPkX}FJA2dz;GhFBZLg04hihTa}zd1IV@wHof#r=!%r{nE(^?P}U__2v| z=c8lOiRevMFH^S-ZEz#UkPM|O53vhsPiw|U4gvl$4S~HmXl&9&Bk^Kpqq8PSrRQBk z=f698T+N}Ab>zxbJB!33J_Cyuy?}v8&#vC1Um0mYkCEdRkoIEeih+=#=)NR zX>a~F7By6?T-9swpxv|m0IIu|hq6?K_uQ7Axip=J3i$5Ls-emOl4wPC&IR(L!S45U z{tP`bH_)aMd5~7T^QOfPPsTkU<5j$}>~YrB8adcwoglZ~Up(h?l5psPb`@NQ5wD0S zS0xu-J@wFV9q%o*)-Z4s_2jtNa@>5p;_=OtmP%aYsI?tq^W8{FREDValhde3;|`89 z&CbXSHP3>En^dxHQZRo*Hi6OL2-C;Uc{nzwd%>{Suo5SMv#K18n=t9@-QPO1teZ+< zI8{TZ@9^{%vgC@!m8w1}UP;A_#C%?2Q!C*H@@c?SDd^Eh+kw>>sPg;{%qd9C@ky0S zt~%a#Cmuzi4o1_&W78M`#zo2L(~~vk5b{f}uCuI>v2*L4r4PJf3ELyY8*JId)6_8O zV4Wrmyun!4w@fMbi78`~l2B>vxOIttBtwe>WqW|Z)g@XFIs zVg5mW-4X5B6*A|wL(fl%C3|;*vcJ}9v8~;b83#(yQqBFQWEw)&ewg-Sa{#E*SRa+| zt%jIc|AR=g_jti)f&d?Y;h_-2sCLN;%zy8Q+P!-5x5Q?{fsCQc*v)@!HPq-1rPc~y zcw>CT!UdL?HB~aJDnLv7VkV2Kr__@X|3{pN-w^p8+4*l!+=Q6Ut`a<#%DZ#2|NRK? zo-0uiV#or{Mc8T z)ThO?GY<;s8%?i>CuTRAE1lpglC5E6$VJMUxC zFIK~3knTKjUCIm8t<(2F-%0qh(`-u#$IF5Nt^LuueGht_tXfTWk-^gD1}$9M0fhmI z9Ocx-9Es9c63f06a!)QW`>clt>}x7#OIja^x7&L3`Jg1tZfSF%t+Pa0H6Q%d`L8cj zDlZX?CF(0wb#^xtu`;imR5DGSU=@o^&z`49x%$@eFVtY5xSZBOx`>b+3BL6DpLhI3 zyOybO=vT0UoN2gc#6rZ1tL}AmD@#fM z@0i*Xx|F&Xb+G12`@FJqRsknb{p`%FOwRkzo9qW?hn_bK1Lo&1$sy#@@;L-%r{hBf zsc1q~YqyLs?Q~Wtao`Qk(HJUgEiJlrO0=5eTbiczC1C^|tdv`9#PlDW6w}QSHV!o( z`L%g|be#pu!s@o5Tzey4qh)fhn#Aq-^RAFHs&pT2(dq1cb;L)&5WQiZ^CH+^FN;1W z9b|8=BpSw|-4!B2jk<2 z8`s|74xVzZFhI&__LUpF$fxvLZ#uk7lZhX4pkQh)u1^L7%DuPto&8>TD8`5^b1nf> zwtXNY6ah*g{5D(B`=Z@A;_`&U8_oYbwC(r7m@QfJwy!gJA|gZvQIoR|HP5Sgw;tsF z{q}W&c>ML zJo#&(@!iZj!s5AzfIK#bCr_rf_YVYHMbzqCKM|o6(e}Bjr&7UXa!74t$AVl#Q^@Iu z7p<1^(wK)Idbz$f$zuz63Eo)$bcDHU-Q~v)S?N7W)*TpKLGkC4ft_`=;F{NNa+^(e zj-eKPS93Cmzx4FUs4<1$&bmIH5`v}~zze=+8jQG;UB#=(?u!BoUXFe=5x!(2>fSQf zPbU-ye_Nr3T%>JoxQ0lt^IQkl$N%o6ZTzsI+F?h6MBkTBvTWI34%HGm%UOd*h!ko{ z--R#()8X=&65o4+Dkz*upv85!f#7{t=c-<$9rap@5Llt!`RdkmVQb72(Rx{(s`OX> z2b-vlgLVb_rxOf;fofh$)%MDcpR_4jx_7SgJhFab>$R0#zlLyA?wAnmjCRAz9L|Qk zhF-iWO`?v;FV^gfkTa8#l+@E4yS@z14%WL_+Va?fx>V7=^Dt?o+bJADdkZFl*$%Fb zw4)(~QDUusjIRGtRFKY>LbqB=|3^VjEcXj3=&LsosmP ziMd!Q_)~*I7uu8(NhkM{IIhNN|M5T=(+>AdW!FXTBXLe*Ag0e)E-vxM=;Z|MV_M<8 z2M1{F{py3Xses?yj>`t;>I9$?3469jn^S4$RKOkvjHwGlPWJrkfygeu)#bUU66fJ> zT!(NDtLd267{o>s9t6jMSLA{WNlwIV^iZpUy0C038?g~wf zv`upTcNFZk>`inhXjkq3)Ic0nZu$e}K3$<_ID@Ksfm2 z5tYU8WyGWQvWo3qeB;T&Bz%Y0QPTYLe^j$>6?(s| zGCl#c6D<|Vx#4KJG-qrc%b>RzW5A$9=}fe{bTUcK^^-%!ea9hKgvv5&#T6nu!(6rZ zYE51bC@!!pDd?&?e$sQu=UGvilmq?8Ts)h#9G=Qv%1)7nwLTz0Bg85?s#P3diw8@u zA0NF`VS4_#=50>V#gqV((utAtPB}MgpSE^}J}kmn+A62aEwXMp@vQXYUk$d;mzg}E z9QR@1W#1c~G6j`@G$EJ0EgmDS@pd`lX|^QQ)(meu#gZ!__^rKN*58K?T_hGd&d15; zzE6e3t9BKg5;<~v=ZG*opSg0A^S_z2DKj)N(^d?V{EVdcsp;_ueew6z1lMpQp|u|rpWFHTG*qezK2ig zKfG2_R0Ho=1(npSoxaINe>;O=KHgoyM{gnO%LQr|Shr9HDN&b0?;pB++%s_f(VRS) zc&*^=yuKu70#G{<%dpwOz(-4n{}V&7$%TgpseiUIL{`LLm*A$#;nl##5wGX`eRx7` zd;+_!2qwqx1fWG5uX@||vF>gDRr{vo)Bgn_sdU-ipUp2pxt|+Kme5n;BpsL%Aa0Iq zUMqNMXHtP4^x}^mJE|79KIENYo*Z^{{8fbdN#w@l8$qh$saowoTSLLbiTtZu#uJ}N5&PQrD{$@c$IY4%r>B|00QH?6 z)e>^`nBFa`wyN#(TZ0E_=E7ZnAQo|k(w2y>V}`y%;Wh?A6q`GCpq)!WONdEB5vf6urCAoe0n(g`i=dM0;De{T>od+muoAYh|qiflD$b~tZ0tQRnUK-_f(jgJ87DlVIxPHt`>g)j>R$pYzKw` zf8vM7zvuyspgO*lKmgwJ(M(rO;k%y0@7WcxfwH$Ewu85ZR%d}<&$k|7KI`9-&8~Yp zpVC=ea5#eP^n489^#FtiMeZHjYL`*3fdn;u6x=|rR&6*hZ0G*4w97Csj9k*6344d# zxUhJE4Pdp0b>N$TfIW|902(TU%MVkx@-ZI8E)VtVLu9l%x&X}qFxu+c}R*kQWRG><{4~^Q}IMb zr*Dh_?tW`v-8)&k9Q{-BhJz^%wolCe%?Uxgfvz?=g|eD9nqn5n95`-15pHWzsZ(kq z9%ny#D^#Pr-!GKlSTj=Dj6A~Bx1sU@} ziVqB4LA!1t=s*!34Sqa0sC@yaGNd@D@^L<^1K?Jg%C>1XSF6QZQVt`FHZJGLv~mTq zx|n$#h|8?Yf(KR~yJqW=*K^0XI^O9<#CCOiSvyBdX=qOweK1Ppu942<`y{cO?A(AI z8!q#mm1xIGLI)^zYshwoj3JG?g5|=Z@jF0{D3aPrMkh2>l76=t)WpUg%DBZp{}yyz zDT%5p8K+t7{rYH#n$)#_1B#*dt%L^^f(J?N5+xEI<+~iDjftWnJpD_>NNuIW?L{9E z)Zj4HIxn4nMDEY2HP1PxPZ;BMxYFYihZRErH=MGXc z7$5<;Ki@Z+U)HgVhDY_xqs_#&6+j^4^y+?>5^~WmKB3w0I$4Acm zMyE)F6pop5x1mq^cFA-tyxMrBET>x4F4=669|?O}q&zKtu&M6Sz&DHg;GuIWMyTpA z<4A!&J$ixH_l-HUS&%bbEb_HYY+d}%L$RO+sEpOW_&*NSu1Du;H?~Q~eMT97OIouw z4ovBG3kEdDw1Ry+7Mg1bh+$xm2eV%`62C$DW})-}PQtI@NEs}r&>zMQZs)qr4O-k zyR-DH0n4+f6njH18DD$Wrcx)T>4uLEP&){}L{qSBs`ROFtb-F+x7UY;7Jcj}?bZRK z6AB^p($^I6$tL>o!scT}>_wjiCJ(wdhxx%TV{M}a`dO=R@sU-j)#YZ09(ho42`0W} zq+8ILUs%}@WIwrdWIG4SFZD}{H&OG6{7C$3XQ|BdVf~B8wElSQclQ$X8t7wu*0`)? z;NcCL-zc~{5=+xEy0%_$s#`C?dyV(3&&Tf?13g7fSL0FHmNhKP`rcy|qafGEfZwu~ zHI&xc8<6ZfnQ`=qB~faF<*kQ;7Qm3rLZ0y6ZuZ9du1AiuvsFdPEH4|QRQHZ(-MBWq;7+=UUr>Dh%$e2g`w`mFZFstq(dg`Ja-48O7dBs2bj{6f7;wW_-Sbdw zzI!N1{@k@$JMS8eSb>mLV}0ufgh3MQ#7le$tMOhC!OLx;BaeQYT7BkyCuK-ITI*Vf z_{6dJn1h24cLvW0r<30kY!MpBrfs>8nm^KaTm0rrUp4+{iKdN;>tbedl}Xp^dbInRat}QdCMJ=S%9McHDWH}us=Ri+ zrcX9^as69v|0rlp2ocXMT?T?qc99SLQd4B=#ou5qakvZ`p#H96w*SHh8Bb${80nxb zay^@>G5O4~MeiS|Ns{WPTaeVP5~PoIp6!U}AsJI)&xLWo-5tOtaZ#s&-Bq*M_&_Ue2|I1d${!}eVGZW=R^APCpD_`Dx6m@ zpvOcVUtl}dzqu*U& zhKWs<2ro7Pb6Ww@SZc-aR9DA|<+l63@^@-X#vSx$&TRpFqRSKWEv!{FuWNa6)D
E36Io7j-*ga$%jsd=3#l_&x(tzQZy#EfUw{= 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 b(USiUzKk4`DmLCa00000NkvXXu0mjf0K(z{ diff --git a/source/Globals.c b/source/Globals.c index cc4c99b..1b5bf2f 100644 --- a/source/Globals.c +++ b/source/Globals.c @@ -1468,23 +1468,20 @@ void reloadColors() { dirtColor[3] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 3)); dirtColor[4] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 4)); - grassColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 17, 0)); - grassColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 17, 1)); + grassColor = SWAP_UINT32(sf2d_get_pixel(icons, 17, 0)); - sandColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 18, 0)); - sandColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 18, 1)); + sandColor = SWAP_UINT32(sf2d_get_pixel(icons, 18, 0)); - waterColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 19, 0)); - waterColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 19, 1)); + waterColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 19, 0)); + waterColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 19, 1)); - lavaColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 20, 0)); - lavaColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 20, 1)); + lavaColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 20, 0)); + lavaColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 20, 1)); rockColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 21, 0)); rockColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 21, 1)); rockColor[2] = SWAP_UINT32(sf2d_get_pixel(icons, 21, 2)); rockColor[3] = SWAP_UINT32(sf2d_get_pixel(icons, 21, 3)); - woodColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 22, 0)); - woodColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 22, 1)); + woodColor = SWAP_UINT32(sf2d_get_pixel(icons, 22, 0)); } \ No newline at end of file diff --git a/source/Globals.h b/source/Globals.h index 8ce33b2..be50ad1 100644 --- a/source/Globals.h +++ b/source/Globals.h @@ -74,17 +74,14 @@ sf2d_texture *bottombg; sf2d_texture * minimap[5]; u8 map[5][128*128]; u8 data[5][128*128]; -u8 treeTable[256]; -u16 rockTable[256]; -u16 grassTable[16]; u32 dirtColor[5]; -u32 grassColor[2]; -u32 sandColor[2]; +u32 grassColor; +u32 sandColor; u32 waterColor[2]; u32 lavaColor[2]; u32 rockColor[4]; -u32 woodColor[2]; +u32 woodColor; char currentFileName[256]; extern u8 currentMenu; diff --git a/source/Menu.c b/source/Menu.c index 0422bb2..7a49e77 100644 --- a/source/Menu.c +++ b/source/Menu.c @@ -879,16 +879,17 @@ void renderMenu(int menu,int xscr,int yscr){ drawTextColor("Touch the keypad below",(320-22*12)/2,12,0xFF33FFFF); sf2d_draw_rectangle(0, 50, 320, 110, 0xFF7F7FBF); + + if(touchDelay > 0){ + sf2d_draw_rectangle(touchX, touchY, touchW, touchH, 0xFF0000AF); + } + drawSizedText(guiText0,4, 60, 2); drawSizedText(guiText1,4, 80, 2); drawSizedText(guiText2,12, 100, 2); drawSizedText(guiText3,28, 120, 2); drawSizedText(guiText4,12, 140, 2); - if(touchDelay > 0){ - sf2d_draw_rectangle(touchX, touchY, touchW, touchH, 0xAF); - } - drawText("Press to confirm", (320-18*12)/2, 180); renderButtonIcon(k_accept.input & -k_accept.input, 122, 178, 1); drawText("Press to return", 58, 210); @@ -1031,7 +1032,7 @@ void renderMenu(int menu,int xscr,int yscr){ if(!rev){ opacity+=5; if(opacity == 255) rev = true; } else { opacity-=5; if(opacity == 100) rev = false; } sprintf(scoreText,"Score: %d", player.p.score); - drawTextColor("You Win!",158,76,0x0000AFAF + opacity); + drawTextColor("You Win!",158,76,0x0000AFAF + (opacity << 24)); drawText(scoreText, 200-((strlen(scoreText)-1)*6), 100); drawText("Press to continue", 96, 150); renderButtonIcon(k_attack.input & -k_attack.input, 166, 148, 1); @@ -1052,7 +1053,7 @@ void renderMenu(int menu,int xscr,int yscr){ if(!rev){ opacity+=5; if(opacity == 255) rev = true; } else { opacity-=5; if(opacity == 100) rev = false; } sprintf(scoreText,"Score: %d", player.p.score); - drawTextColor("You DIED!",158,76,0x000000AF + opacity); + drawTextColor("You DIED!",158,76,0x000000AF + (opacity << 24)); drawText(scoreText, 200-((strlen(scoreText)-1)*6), 100); drawText("Press to continue", 96, 150); renderButtonIcon(k_attack.input & -k_attack.input, 166, 148, 1); @@ -1240,11 +1241,8 @@ void renderMenu(int menu,int xscr,int yscr){ render16(startX,startY+12,0,128,0);//Player(Carrying) render16(startX,startY,128,128,0);//Workbench startX = 120;startY = 20; - render16b(startX,startY,16,96,0,waterColor[0]);// water pit - render16b(startX+16,startY,32,96,0,waterColor[0]); - render16b(startX,startY+16,48,96,0,waterColor[0]); - render16b(startX+16,startY+16,64,96,0,waterColor[0]); - renderc (startX+8,startY+12,48,160,16,8,0);//Waves + menuRenderTilePit(startX,startY,176,16,waterColor[0]);// water pit + renderc (startX+8,startY+12,48,160,16,8,0);//Waves renderc (startX+8,startY+8,0,112,16,8,0);//Player (Top-Half) startX = 110;startY = 76; render16 (startX,startY,48,112,0);//Player @@ -1257,10 +1255,7 @@ void renderMenu(int menu,int xscr,int yscr){ renderc (startX+14,startY,32,160,8,16,0);//Slash render (startX+12,startY+4,104,144,1);//Sword startX = 64;startY = 40; - render16b(startX,startY,16,80,0,grassColor[0]);// grass pit - render16b(startX+16,startY,32,80,0,grassColor[0]); - render16b(startX,startY+16,48,80,0,grassColor[0]); - render16b(startX+16,startY+16,64,80,0,grassColor[0]); + menuRenderTilePit(startX,startY,112,16,grassColor);// grass pit render16 (startX+8,startY+4,0,16,0);//Tree render (startX+1,startY+14,80,152,0);// Apple render16 (startX+9,startY+18,16,112,0);//Player @@ -1315,3 +1310,22 @@ void renderMenu(int menu,int xscr,int yscr){ } } + +void menuRenderTilePit(int x,int y,int xt,int yt,u32 color) { + render16b(x+8,y+8,xt+48,yt,0,color); + + renderb(x, y, xt, yt, 0,color); + renderb(x+24,y, xt+8, yt, 0,color); + renderb(x, y+24,xt, yt+8,0,color); + renderb(x+24,y+24,xt+8, yt+8,0,color); + + renderb(x+8, y, xt+16,yt, 0,color); + renderb(x+16,y, xt+24,yt, 0,color); + renderb(x+8, y+24,xt+16,yt+8,0,color); + renderb(x+16,y+24,xt+24,yt+8,0,color); + + renderb(x, y+8, xt+32,yt, 0,color); + renderb(x, y+16,xt+32,yt, 0,color); + renderb(x+24,y+8, xt+40,yt, 0,color); + renderb(x+24,y+16,xt+40,yt, 0,color); +} diff --git a/source/Menu.h b/source/Menu.h index 61c20f9..8899882 100644 --- a/source/Menu.h +++ b/source/Menu.h @@ -5,3 +5,5 @@ void renderMenu(int menu,int xscr,int yscr); void tickMenu(int menu); + +void menuRenderTilePit(int x,int y,int xt,int yt,u32 color); diff --git a/source/MenuTutorial.c b/source/MenuTutorial.c index 34681e5..a7c33c8 100644 --- a/source/MenuTutorial.c +++ b/source/MenuTutorial.c @@ -114,20 +114,14 @@ void renderTutorialPage(bool topScreen){ renderButtonIcon(k_attack.input & -k_attack.input, 80, 56, 2); renderc(60,68,16,160,16,8,2);//Slash - render16b(12,20,16,80,0,grassColor[0]);// grass pit - render16b(12+16,20,32,80,0,grassColor[0]); - render16b(12,20+16,48,80,0,grassColor[0]); - render16b(12+16,20+16,64,80,0,grassColor[0]); + menuRenderTilePit(12,20,112,16,grassColor);// grass pit render16(12+8,20+4,0,16,0);//Tree renderc(12+9,20+14,16,160,16,8,0);//Slash render(12+9+4,20+14,192,144,0);//Axe render16(12+9,20+18,16,112,0);//Player-up - render16b(122,62,16,80,0,sandColor[0]);// sand pit - render16b(122+16,62,32,80,0,sandColor[0]); - render16b(122,62+16,48,80,0,sandColor[0]); - render16b(122+16,62+16,64,80,0,sandColor[0]); - render16b(130,70,0,96,0,0xFF383838);// hole + menuRenderTilePit(122,62,112,16,sandColor);// sand pit + render16b(130,70,176,16,0,0xFF383838);// hole render16(116,70,48,112,0);//Player-right renderb(136,76,16,152,0,0xFF8197AF);// Dirt item renderc(128,70,40,160,8,16,0);//Slash @@ -147,7 +141,7 @@ void renderTutorialPage(bool topScreen){ renderButtonIcon(biasedCirclePad(k_down.input), 44, 125, 1); break; case 3: // Furniture - sf2d_draw_rectangle(64, 48, 192, 32, grassColor[0]); + sf2d_draw_rectangle(64, 48, 192, 32, grassColor); renderc(32,24,64,128,96,16,0);//Furniture entities renderFurniture(ITEM_WORKBENCH, 50,60); @@ -186,14 +180,14 @@ void renderTutorialPage(bool topScreen){ render(76,48,40,152,0); // Seeds sf2d_draw_rectangle(216, 80, 32, 32, dirtColor[1]); // Dirt color for grass - render16b(108, 40, 0, 80, 0, grassColor[0]); // Grass + render16b(108, 40, 112, 16, 0, grassColor); // Grass render16(124, 40,144,0,0); // Farm Tile render16(108,54,16,112,0); // Player (Up) renderc(108,50,16,160,16,8,0); // Slash (Up) render(112,48,72,144,0); // Gem Hoe sf2d_draw_rectangle(112, 156, 32, 32, dirtColor[1]); // Dirt color for grass - render16b(56, 78, 0, 80, 0, grassColor[0]); // Grass + render16b(56, 78, 112, 16, 0, grassColor); // Grass sf2d_draw_rectangle(80, 156, 32, 32, dirtColor[1]); // Dirt color render16b(40, 78, 0, 0, 0, 0xFF8F8FA8); // Dirt Dots render(44, 82, 40,152,0); // Seeds diff --git a/source/MenuTutorial.h b/source/MenuTutorial.h index 84d5733..682d7c7 100644 --- a/source/MenuTutorial.h +++ b/source/MenuTutorial.h @@ -7,6 +7,7 @@ #include #include "Render.h" +#include "Menu.h" extern u8 pageNum; extern u8 maxPageNum; diff --git a/source/Render.c b/source/Render.c index 42385af..2f5601b 100644 --- a/source/Render.c +++ b/source/Render.c @@ -256,142 +256,6 @@ void renderFrame(int x1, int y1, int x2, int y2, u32 bgColor) { } } -void renderDotsWithColor(int val, int x, int y, u8 bits, u32 color) { - switch (val) { - case 3: - renderb(x, y, 0, 0, bits, color); - return; - case 5: - renderb(x + 8, y, 8, 0, bits, color); - return; - case 7: - renderbc(x, y, 0, 0, 16, 8, bits, color); - return; - case 10: - renderb(x, y + 8, 0, 8, bits, color); - return; - case 11: - renderbc(x, y, 0, 0, 8, 16, bits, color); - return; - case 12: - renderb(x + 8, y + 8, 8, 8, bits, color); - return; - case 13: - renderbc(x + 8, y, 8, 0, 8, 16, bits, color); - return; - case 14: - renderbc(x, y + 8, 0, 8, 16, 8, bits, color); - return; - case 15: - render16b(x, y, 0, 0, bits, color); - return; - } -} - -void renderRockDotsWithColor(int val, int x, int y, u32 color) { - switch (val) { - case 208: - render16b(x, y, 0, 0, 0, color); - return; - case 16: - renderb(x + 8, y + 8, 8, 8, 0, color); - return; - case 32: - renderb(x, y + 8, 0, 8, 0, color); - return; - case 48: - renderb(x, y + 8, 0, 8, 0, color); - return; - case 64: - renderb(x, y, 0, 0, 0, color); - return; - case 80: - renderbc(x, y, 0, 0, 8, 16, 0, color); - return; - case 96: - renderbc(x + 8, y, 8, 0, 8, 16, 0, color); - return; - case 112: - renderbc(x, y + 8, 0, 8, 16, 8, 0, color); - return; - case 128: - renderbc(x, y, 0, 0, 16, 8, 0, color); - return; - case 144: - renderb(x, y + 8, 0, 8, 0, color); - renderbc(x + 8, y, 8, 0, 8, 16, 0, color); - return; - case 160: - renderb(x, y, 0, 0, 0, color); - renderbc(x + 8, y, 8, 0, 8, 16, 0, color); - return; - case 176: - renderb(x + 8, y, 8, 0, 0, color); - renderbc(x, y, 0, 0, 8, 16, 0, color); - return; - case 192: - renderb(x + 8, y + 8, 8, 8, 0, color); - renderbc(x, y, 0, 0, 8, 16, 0, color); - return; - case 4112: - renderbc(x, y, 0, 0, 8, 16, 0, color); - return; - case 4128: - renderbc(x, y + 8, 0, 8, 8, 16, 0, color); - return; - case 4192: - renderb(x, y, 0, 0, 0, color); - return; - case 8192: - renderb(x, y + 8, 0, 8, 0, color); - return; - case 8208: - renderb(x + 8, y + 8, 8, 8, 0, color); - return; - case 8224: - renderb(x + 8, y + 8, 8, 8, 0, color); - return; - case 8240: - renderb(x + 8, y, 8, 0, 0, color); - return; - case 8256: - renderb(x, y + 8, 0, 8, 0, color); - return; - case 8272: - renderb(x + 8, y, 8, 0, 0, color); - return; - case 8288: - renderb(x, y, 0, 0, 0, color); - return; - case 8304: - renderb(x + 8, y, 8, 0, 0, color); - renderb(x, y + 8, 0, 8, 0, color); - return; - case 8320: - renderbc(x + 8, y, 8, 0, 8, 16, 0, color); - return; - case 8336: - renderbc(x, y, 0, 0, 8, 16, 0, color); - return; - case 8352: - renderb(x, y, 0, 0, 0, color); - renderb(x + 8, y + 8, 8, 8, 0, color); - return; - case 8368: - renderb(x + 8, y, 8, 0, 0, color); - return; - case 8384: - renderb(x, y + 8, 0, 8, 0, color); - return; - case 8400: - renderb(x, y, 0, 0, 0, color); - return; - case 8416: - renderb(x + 8, y + 8, 8, 8, 0, color); - return; - } -} - void bakeLights() { playerLightBake = sf2d_create_texture(64, 64, TEXFMT_RGBA8, SF2D_PLACE_RAM); lanternLightBake = sf2d_create_texture(128, 128, TEXFMT_RGBA8, @@ -495,66 +359,94 @@ void bakeLight(sf2d_texture* texture, int x, int y, int r) { sf2d_texture_tile32(texture); } -u8 checkSurrTiles8(int xt, int yt, int id) { - u8 vt = 0; - if (getTile(xt, yt - 1) == id) - vt |= 1; - if (getTile(xt - 1, yt) == id) - vt |= 2; - if (getTile(xt + 1, yt) == id) - vt |= 4; - if (getTile(xt, yt + 1) == id) - vt |= 8; - if (getTile(xt - 1, yt - 1) == id) - vt |= 16; - if (getTile(xt + 1, yt - 1) == id) - vt |= 32; - if (getTile(xt - 1, yt + 1) == id) - vt |= 64; - if (getTile(xt + 1, yt + 1) == id) - vt |= 128; - return vt; -} -u8 checkSurrTiles4(int xt, int yt, int id) { - u8 vt = 0; - if (getTile(xt, yt - 1) == id) - vt |= 1; - if (getTile(xt - 1, yt) == id) - vt |= 2; - if (getTile(xt + 1, yt) == id) - vt |= 4; - if (getTile(xt, yt + 1) == id) - vt |= 8; - return vt; +bool tu = false; +bool td = false; +bool tl = false; +bool tr = false; + +bool tul = false; +bool tur = false; +bool tdl = false; +bool tdr = false; + +void renderDotsWithColor(int x, int y, u8 bits1, u8 bits2, u8 bits3, u8 bits4, u32 color) { + if(tu && tl) renderb(x, y, 0, 0, bits1, color); + if(tu && tr) renderb(x + 8, y, 8, 0, bits2, color); + if(td && tl) renderb(x, y + 8, 0, 8, bits3, color); + if(td && tr) renderb(x + 8, y + 8, 8, 8, bits4, color); +} + +void resetSurrTiles() { + tu = false; + td = false; + tl = false; + tr = false; + + tul = false; + tur = false; + tdl = false; + tdr = false; +} + +void checkSurrTiles8(int xt, int yt, int id) { + if (getTile(xt, yt - 1) == id) + tu = true; + if (getTile(xt - 1, yt) == id) + tl = true; + if (getTile(xt + 1, yt) == id) + tr = true; + if (getTile(xt, yt + 1) == id) + td = true; + if (getTile(xt - 1, yt - 1) == id) + tul = true; + if (getTile(xt + 1, yt - 1) == id) + tur = true; + if (getTile(xt - 1, yt + 1) == id) + tdl = true; + if (getTile(xt + 1, yt + 1) == id) + tdr = true; +} +void checkSurrTiles4(int xt, int yt, int id) { + if (getTile(xt, yt - 1) == id) + tu = true; + if (getTile(xt - 1, yt) == id) + tl = true; + if (getTile(xt + 1, yt) == id) + tr = true; + if (getTile(xt, yt + 1) == id) + td = true; } -u8 v = 0; u8 tData = 0; void renderTile(int i, int x, int y) { int age = 0; switch (i) { case TILE_GRASS: - v = checkSurrTiles4(x >> 4, y >> 4, TILE_GRASS) - | checkSurrTiles4(x >> 4, y >> 4, TILE_TREE) - | checkSurrTiles4(x >> 4, y >> 4, TILE_FLOWER) - | checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_TREE); - render16b(x, y, grassTable[v], 80, 0, grassColor[0]); - renderDotsWithColor(v, x, y, 0, grassColor[1]); + checkSurrTiles4(x >> 4, y >> 4, TILE_GRASS); + checkSurrTiles4(x >> 4, y >> 4, TILE_TREE); + checkSurrTiles4(x >> 4, y >> 4, TILE_FLOWER); + checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_TREE); + + renderConnectedTile4(x, y, 112, 16, grassColor); break; case TILE_TREE: renderTile(TILE_GRASS, x, y); - render16(x, y, treeTable[checkSurrTiles8(x >> 4, y >> 4, TILE_TREE)], - 16, 0); + + checkSurrTiles8(x >> 4, y >> 4, TILE_TREE); + + render(x, y, 0+((tu && tl && tul) ? 16 : 0), 16, 0); + render(x+8, y, 8+((tu && tr && tur) ? 16 : 0), 16, 0); + render(x, y+8, 0+((td && tl && tdl) ? 16 : 0), 24, 0); + render(x+8, y+8, 8+((td && tr && tdr) ? 16 : 0), 24, 0); + break; case TILE_ROCK: - v = checkSurrTiles8(x >> 4, y >> 4, TILE_ROCK); - render16s(x, y, rockTable[v] + 8192, 0, rockColor[0]); - renderRockDotsWithColor(rockTable[v], x, y, rockColor[1]); + checkSurrTiles8(x >> 4, y >> 4, TILE_ROCK); + renderConnectedTile8(x, y, 32, 16, rockColor[0]); break; case TILE_HARDROCK: - v = checkSurrTiles8(x >> 4, y >> 4, TILE_HARDROCK); - render16s(x, y, rockTable[v] + 8192, 0, rockColor[2]); - renderRockDotsWithColor(rockTable[v], x, y, rockColor[3]); + checkSurrTiles8(x >> 4, y >> 4, TILE_HARDROCK); + renderConnectedTile8(x, y, 32, 16, rockColor[2]); break; case TILE_DIRT: // render dots. if (currentLevel > 1) @@ -563,32 +455,36 @@ void renderTile(int i, int x, int y) { render16b(x, y, 0, 0, 0, 0xFF8F8FA8); break; case TILE_SAND: - v = checkSurrTiles4(x >> 4, y >> 4, TILE_SAND) - | checkSurrTiles4(x >> 4, y >> 4, TILE_CACTUS) - | checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_CACTUS); - render16b(x, y, grassTable[v], 80, 0, sandColor[0]); - renderDotsWithColor(v, x, y, 0, sandColor[1]); + checkSurrTiles4(x >> 4, y >> 4, TILE_SAND); + checkSurrTiles4(x >> 4, y >> 4, TILE_CACTUS); + checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_CACTUS); + + renderConnectedTile4(x, y, 112, 16, sandColor); break; case TILE_WATER: - v = checkSurrTiles4(x >> 4, y >> 4, TILE_WATER) - | checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); - render16b(x, y, grassTable[v], 96, 0, waterColor[0]); + checkSurrTiles4(x >> 4, y >> 4, TILE_WATER); + checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); + + renderConnectedTile4(x, y, 176, 16, waterColor[0]); + srand((tickCount + (x / 2 - y) * 4311) / 10); - renderDotsWithColor(v, x, y, rand() & 3, waterColor[1]); + renderDotsWithColor(x, y, rand() & 3, rand() & 3, rand() & 3, rand() & 3, waterColor[1]); break; case TILE_LAVA: - v = checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA) - | checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); - render16b(x, y, grassTable[v], 96, 0, lavaColor[0]); + checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA); + checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); + + renderConnectedTile4(x, y, 176, 16, lavaColor[0]); + srand((tickCount + (x / 2 - y) * 4311) / 10); - renderDotsWithColor(v, x, y, rand() & 3, lavaColor[1]); + renderDotsWithColor(x, y, rand() & 3, rand() & 3, rand() & 3, rand() & 3, lavaColor[1]); break; case TILE_HOLE: - render16b(x, y, - grassTable[checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE) - | checkSurrTiles4(x >> 4, y >> 4, TILE_WATER) - | checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA)], 96, 0, - 0xFF383838); + checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); + checkSurrTiles4(x >> 4, y >> 4, TILE_WATER); + checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA); + + renderConnectedTile4(x, y, 176, 16, 0xFF383838); break; case TILE_CACTUS: renderTile(TILE_SAND, x, y); @@ -616,11 +512,11 @@ void renderTile(int i, int x, int y) { render16b(x, y, 80, 0, 0, 0xFFDE98DF); break; case TILE_CLOUD: - render16b(x, y, - grassTable[checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUD) - | checkSurrTiles4(x >> 4, y >> 4, TILE_STAIRS_DOWN) - | checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUDCACTUS)], - 80, 0, 0xFFFFFFFF); + checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUD); + checkSurrTiles4(x >> 4, y >> 4, TILE_STAIRS_DOWN); + checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUDCACTUS); + + renderConnectedTile4(x, y, 64, 32, 0xFFFFFFFF); break; case TILE_CLOUDCACTUS: renderTile(TILE_CLOUD, x, y); @@ -644,10 +540,49 @@ void renderTile(int i, int x, int y) { render16(x, y, 160 + (age << 4), 0, 0); break; case TILE_WOOD_WALL: - render16b(x, y, grassTable[checkSurrTiles4(x >> 4, y >> 4, TILE_WOOD_WALL)], 176, 0, woodColor[0]); + checkSurrTiles4(x >> 4, y >> 4, TILE_WOOD_WALL); + + renderConnectedTile4(x, y, 0, 32, woodColor); break; } + resetSurrTiles(); +} + +void renderConnectedTile4(int x, int y, u32 xTile, u32 yTile, u32 color) { + //render complete tile in one piece to reduce strain(added for o3DS) + if (tl && tr && tu && td) { + render16b(x, y, xTile+48, yTile, 0, color); + return; + } + + int l = (tl ? 16 : 0); + int r = (tr ? 16 : 0); + int u = (tu ? 32 : 0); + int d = (td ? 32 : 0); + + renderb(x, y, xTile +l+u, yTile, 0, color); + renderb(x+8, y, xTile+8+r+u, yTile, 0, color); + renderb(x, y+8, xTile +l+d, yTile+8, 0, color); + renderb(x+8, y+8, xTile+8+r+d, yTile+8, 0, color); +} + +void renderConnectedTile8(int x, int y, u32 xTile, u32 yTile, u32 color) { + //render complete tile in one piece to reduce strain(added for o3DS) + if (tl && tr && tu && td && tul && tur && tdl && tdr) { + render16b(x, y, xTile+64, yTile, 0, color); + return; + } + + int l = (tl ? 16 : 0); + int r = (tr ? 16 : 0); + int u = (tu ? 32 : 0); + int d = (td ? 32 : 0); + + renderb(x, y, xTile +l+u+((tl && tu && tul) ? 16 : 0), yTile, 0, color); + renderb(x+8, y, xTile+8+r+u+((tr && tu && tur) ? 16 : 0), yTile, 0, color); + renderb(x, y+8, xTile +l+d+((tl && td && tdl) ? 16 : 0), yTile+8, 0, color); + renderb(x+8, y+8, xTile+8+r+d+((tr && td && tdr) ? 16 : 0), yTile+8, 0, color); } void renderZoomedMap() { @@ -1157,7 +1092,7 @@ void renderItemIcon(int itemID, int countLevel, int x, int y) { renderb(x, y, 16, 152, 0, rockColor[1]); break; case ITEM_SAND: - renderb(x, y, 16, 152, 0, sandColor[0]); + renderb(x, y, 16, 152, 0, sandColor); break; case ITEM_DIRT: renderb(x, y, 16, 152, 0, 0xFF8197AF); @@ -1215,169 +1150,3 @@ void renderItemIcon(int itemID, int countLevel, int x, int y) { break; } } - -void defineTables() { - - int i = 0; - for (i = 256; i > 0; --i) { - // Creates the lookup table for the tree tile. - if ((i & 255) == 255) - treeTable[i] = 208; - else if ((i & 239) == 239) - treeTable[i] = 144; - else if ((i & 191) == 191) - treeTable[i] = 160; - else if ((i & 127) == 127) - treeTable[i] = 176; - else if ((i & 223) == 223) - treeTable[i] = 192; - else if ((i & 206) == 206) - treeTable[i] = 112; - else if ((i & 55) == 55) - treeTable[i] = 128; - else if ((i & 173) == 173) - treeTable[i] = 96; - else if ((i & 91) == 91) - treeTable[i] = 80; - - else if ((i & 159) == 159) - treeTable[i] = 224; - else if ((i & 111) == 111) - treeTable[i] = 240; - - else if ((i & 19) == 19) - treeTable[i] = 64; - else if ((i & 37) == 37) - treeTable[i] = 48; - else if ((i & 74) == 74) - treeTable[i] = 32; - else if ((i & 140) == 140) - treeTable[i] = 16; - } - - /* - boolean up = i & 1 - boolean left = i & 2 - boolean right = i & 4 - boolean down = i & 8 - boolean up-left = i & 16 - boolean up-right = i & 32 - boolean down-left = i & 64 - boolean down-right = i & 128 - */ - - for (i = 256; i > 0; --i) { - // Creates the lookup table for the rock tile. - if ((i & 255) == 255) - rockTable[i] = 208; - else if ((i & 239) == 239) - rockTable[i] = 144; - else if ((i & 191) == 191) - rockTable[i] = 160; - else if ((i & 127) == 127) - rockTable[i] = 176; - else if ((i & 223) == 223) - rockTable[i] = 192; - else if ((i & 207) == 207) - rockTable[i] = 256 * 16 + 32; - else if ((i & 63) == 63) - rockTable[i] = 256 * 16 + 16; - else if ((i & 206) == 206) - rockTable[i] = 112; - else if ((i & 95) == 95) - rockTable[i] = 256 * 32 + 144; - else if ((i & 159) == 159) - rockTable[i] = 256 * 32 + 160; - else if ((i & 31) == 31) - rockTable[i] = 256 * 32 + 208; - else if ((i & 55) == 55) - rockTable[i] = 128; - else if ((i & 175) == 175) - rockTable[i] = 256 * 32 + 128; - else if ((i & 143) == 143) - rockTable[i] = 256 * 32 + 224; - else if ((i & 173) == 173) - rockTable[i] = 96; - else if ((i & 111) == 111) - rockTable[i] = 256 * 32 + 112; - else if ((i & 47) == 47) - rockTable[i] = 256 * 32 + 48; - else if ((i & 45) == 45) - rockTable[i] = 256 * 32 + 176; - else if ((i & 79) == 79) - rockTable[i] = 256 * 32 + 192; - else if ((i & 23) == 23) - rockTable[i] = 256 * 32 + 96; - else if ((i & 91) == 91) - rockTable[i] = 80; - else if ((i & 27) == 27) - rockTable[i] = 256 * 16 + 96; - else if ((i & 19) == 19) - rockTable[i] = 64; - else if ((i & 75) == 75) - rockTable[i] = 256 * 32; - else if ((i & 141) == 141) - rockTable[i] = 256 * 32 + 16; - else if ((i & 142) == 142) - rockTable[i] = 256 * 32 + 32; - else if ((i & 78) == 78) - rockTable[i] = 256 * 32 + 64; - else if ((i & 39) == 39) - rockTable[i] = 256 * 32 + 80; - else if ((i & 37) == 37) - rockTable[i] = 48; - else if ((i & 74) == 74) - rockTable[i] = 32; - else if ((i & 140) == 140) - rockTable[i] = 16; - else if ((i & 15) == 15) - rockTable[i] = 256 * 16 + 112; - else if ((i & 11) == 11) - rockTable[i] = 256 * 16 + 192; - else if ((i & 13) == 13) - rockTable[i] = 256 * 16 + 208; - else if ((i & 14) == 14) - rockTable[i] = 256 * 16 + 224; - else if ((i & 7) == 7) - rockTable[i] = 256 * 16 + 240; - else if ((i & 12) == 12) - rockTable[i] = 256 * 16 + 128; - else if ((i & 10) == 10) - rockTable[i] = 256 * 16 + 144; - else if ((i & 5) == 5) - rockTable[i] = 256 * 16 + 160; - else if ((i & 3) == 3) - rockTable[i] = 256 * 16 + 176; - else if ((i & 9) == 9) - rockTable[i] = 256 * 16; - else if ((i & 6) == 6) - rockTable[i] = 256 * 16 + 48; - else if ((i & 8) == 8) - rockTable[i] = 224; - else if ((i & 4) == 4) - rockTable[i] = 256 * 16 + 64; - else if ((i & 2) == 2) - rockTable[i] = 256 * 16 + 80; - else if ((i & 1) == 1) - rockTable[i] = 240; - - } - - // Lookup table for the grass/sand tile. - grassTable[1] = 192; - grassTable[2] = 160; - grassTable[3] = 64; - grassTable[4] = 144; - grassTable[5] = 48; - grassTable[6] = 224; - grassTable[7] = 128; - grassTable[8] = 176; - grassTable[9] = 240; - grassTable[10] = 32; - grassTable[11] = 80; - grassTable[12] = 16; - grassTable[13] = 96; - grassTable[14] = 112; - grassTable[15] = 208; - -} diff --git a/source/Render.h b/source/Render.h index 1b91e04..237139e 100644 --- a/source/Render.h +++ b/source/Render.h @@ -27,6 +27,8 @@ void render16s(s32 xp, s32 yp, u32 tile, u8 bits, u32 color); void renderTitle(int x, int y); void renderFrame(int x1, int y1, int x2, int y2, u32 bgColor); void renderTile(int i, int x, int y); +void renderConnectedTile4(int x, int y, u32 xTile, u32 yTile, u32 color); +void renderConnectedTile8(int x, int y, u32 xTile, u32 yTile, u32 color); void renderBackground(int xScroll, int yScroll); void renderMenuBackground(int xScroll, int yScroll); //Renders the darkness void renderButtonIcon(u32 icon, int x, int y, float scale); @@ -61,5 +63,3 @@ void renderItemStuffWithText(int itemID, int itemCL, bool onlyOne, int x, int y) void renderItemWithTextCentered(Item* item, int width, int y); void renderItemIcon(int itemID, int countLevel, int x, int y); void renderItemIcon2(int itemID, int countLevel, int x, int y, int z); - -void defineTables(); diff --git a/source/Sound.c b/source/Sound.c index aedd70c..70f7d64 100644 --- a/source/Sound.c +++ b/source/Sound.c @@ -38,6 +38,22 @@ void updateMusic(int lvl) { } } +void loadSounds() { + loadSound(&snd_playerHurt, "resources/playerhurt.raw"); + loadSound(&snd_playerDeath, "resources/playerdeath.raw"); + loadSound(&snd_monsterHurt, "resources/monsterhurt.raw"); + loadSound(&snd_test, "resources/test.raw"); + loadSound(&snd_pickup, "resources/pickup.raw"); + loadSound(&snd_bossdeath, "resources/bossdeath.raw"); + loadSound(&snd_craft, "resources/craft.raw"); + + loadSound(&music_menu, "resources/music/menu.raw"); + loadSound(&music_floor0, "resources/music/floor0.raw"); + loadSound(&music_floor1, "resources/music/floor1.raw"); + loadSound(&music_floor23, "resources/music/floor2_3.raw"); + loadSound(&music_floor4, "resources/music/floor4.raw"); +} + void freeSounds(){ linearFree(snd_playerHurt.buffer); linearFree(snd_playerDeath.buffer); diff --git a/source/Sound.h b/source/Sound.h index 4946cd7..2e36791 100644 --- a/source/Sound.h +++ b/source/Sound.h @@ -16,6 +16,7 @@ void playSound(Sound snd); void playMusic(Sound snd); void updateMusic(int lvl); +void loadSounds(); void freeSounds(); Sound snd_playerHurt; diff --git a/source/main.c b/source/main.c index 6a1e69f..cee125a 100644 --- a/source/main.c +++ b/source/main.c @@ -171,20 +171,7 @@ int main() { font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM); bottombg = sfil_load_PNG_buffer(bottombg_png, SF2D_PLACE_RAM); - loadSound(&snd_playerHurt, "resources/playerhurt.raw"); - loadSound(&snd_playerDeath, "resources/playerdeath.raw"); - loadSound(&snd_monsterHurt, "resources/monsterhurt.raw"); - loadSound(&snd_test, "resources/test.raw"); - loadSound(&snd_pickup, "resources/pickup.raw"); - loadSound(&snd_bossdeath, "resources/bossdeath.raw"); - loadSound(&snd_craft, "resources/craft.raw"); - - loadSound(&music_menu, "resources/music/menu.raw"); - loadSound(&music_floor0, "resources/music/floor0.raw"); - loadSound(&music_floor1, "resources/music/floor1.raw"); - loadSound(&music_floor23, "resources/music/floor2_3.raw"); - loadSound(&music_floor4, "resources/music/floor4.raw"); - + loadSounds(); playMusic(music_menu); bakeLights(); @@ -244,7 +231,6 @@ int main() { tickCount = 0; initRecipes(); - defineTables(); while (aptMainLoop()) { ++tickCount; hidScanInput();