From 64cac7578d10125e4be64ffd887c131aea508433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Ryb=C3=A1rsky?= Date: Sat, 7 Jun 2025 00:57:00 +0200 Subject: [PATCH] Fixes --- assets/backgrounds/00_water_00.png | Bin 0 -> 2438 bytes assets/backgrounds/00_water_01.png | Bin 0 -> 2434 bytes assets/backgrounds/00_water_02.png | Bin 0 -> 2443 bytes assets/backgrounds/00_water_03.png | Bin 0 -> 2570 bytes assets/backgrounds/00_water_04.png | Bin 0 -> 2564 bytes assets/backgrounds/00_water_05.png | Bin 0 -> 2554 bytes assets/backgrounds/00_water_06.png | Bin 0 -> 2569 bytes assets/backgrounds/00_water_07.png | Bin 0 -> 2603 bytes assets/backgrounds/00_water_08.png | Bin 0 -> 2606 bytes assets/backgrounds/00_water_09.png | Bin 0 -> 2694 bytes assets/backgrounds/00_water_10.png | Bin 0 -> 2655 bytes assets/backgrounds/00_water_11.png | Bin 0 -> 2645 bytes assets/backgrounds/00water.png | Bin 2150 -> 0 bytes assets/backgrounds/01_water_00.png | Bin 0 -> 2056 bytes assets/backgrounds/01_water_01.png | Bin 0 -> 2090 bytes assets/backgrounds/01_water_02.png | Bin 0 -> 2072 bytes assets/backgrounds/01_water_03.png | Bin 0 -> 2139 bytes assets/backgrounds/01_water_04.png | Bin 0 -> 2150 bytes assets/backgrounds/01_water_05.png | Bin 0 -> 2172 bytes assets/backgrounds/01_water_06.png | Bin 0 -> 2218 bytes assets/backgrounds/01_water_07.png | Bin 0 -> 2214 bytes assets/backgrounds/01_water_08.png | Bin 0 -> 2227 bytes assets/backgrounds/01_water_09.png | Bin 0 -> 2503 bytes assets/backgrounds/01_water_10.png | Bin 0 -> 2412 bytes assets/backgrounds/01_water_11.png | Bin 0 -> 2448 bytes assets/backgrounds/01water.png | Bin 2174 -> 0 bytes .../{09grass.png => 02_grass_00.png} | Bin .../{08grass.png => 02_grass_01.png} | Bin .../{10grass.png => 02_grass_02.png} | Bin .../{07grass.png => 02_grass_02s.png} | Bin .../{06grass.png => 02_grass_03.png} | Bin .../{13grass.png => 03_grass_00.png} | Bin .../{12grass.png => 03_grass_01.png} | Bin .../{11grass.png => 03_grass_02.png} | Bin .../{05grass.png => 04_grass_00.png} | Bin .../{02grass.png => 05_grass_00.png} | Bin .../{03grass.png => 06_grass_00.png} | Bin .../{04grass.png => 07_grass_00.png} | Bin .../{21sand.png => 08_sand_00.png} | Bin .../{20sand.png => 09_sand_00.png} | Bin .../{19sand.png => 10_sand_00.png} | Bin .../{18sand.png => 11_sand_00.png} | Bin .../{17sand.png => 12_sand_00.png} | Bin .../{16sand.png => 13_sand_00.png} | Bin .../{15sand.png => 14_sand_00.png} | Bin .../{14sand.png => 15_sand_00.png} | Bin .../{23tiles.png => 16_tiles_00.png} | Bin .../{22tiles.png => 17_tiles_00.png} | Bin .../{24tiles.png => 18_tiles_00.png} | Bin .../{25tiles.png => 19_tiles_00.png} | Bin .../{27cobble.png => 20_cobble_00.png} | Bin .../{26cobble.png => 21_cobble_00.png} | Bin .../{28cobble.png => 22_cobble_00.png} | Bin .../{29cobble.png => 23_cobble_00.png} | Bin .../{33resource.png => 24_resource_00.png} | Bin .../{32resource.png => 25_resource_00.png} | Bin .../{31resource.png => 26_resource_00.png} | Bin .../{30resource.png => 27_resource_00.png} | Bin .../{00iron_ore.png => 00-iron_ore-00.png} | Bin ...{01silver_ore.png => 01-silver_ore-00.png} | Bin .../{02gold_ore.png => 02-gold_ore-00.png} | Bin ...latinum_ore.png => 03-platinum_ore-00.png} | Bin ...{04iron_ingot.png => 04-iron_ingot-00.png} | Bin ...{05gold_ingot.png => 05-gold_ingot-00.png} | Bin ...num_ingot.png => 06-platinum_ingot-00.png} | Bin ...ilver_ingot.png => 07-silver_ingot-00.png} | Bin assets/items/{08log.png => 08-log-00.png} | Bin assets/tiles/{0air.png => 00_air_00.png} | Bin .../tiles/{1blanker.png => 01_blanker_00.png} | Bin .../{2dopravnik.png => 02_dopravnik_00.png} | Bin assets/tiles/03_furnace_00.png | Bin 0 -> 298 bytes .../tiles/{3furnace.png => 03_furnace_01.png} | Bin assets/tiles/03_furnace_02.png | Bin 0 -> 513 bytes assets/tiles/03_furnace_03.png | Bin 0 -> 483 bytes assets/tiles/03_furnace_04.png | Bin 0 -> 511 bytes assets/tiles/03_furnace_05.png | Bin 0 -> 505 bytes assets/tiles/03_furnace_06.png | Bin 0 -> 483 bytes assets/tiles/{4miner.png => 04_miner_00.png} | Bin assets/tiles/04_miner_01.png | Bin 0 -> 492 bytes assets/tiles/04_miner_02.png | Bin 0 -> 486 bytes assets/tiles/04_miner_03.png | Bin 0 -> 487 bytes assets/tiles/04_miner_04.png | Bin 0 -> 485 bytes assets/tiles/04_miner_05.png | Bin 0 -> 487 bytes assets/tiles/04_miner_06.png | Bin 0 -> 483 bytes assets/tiles/04_miner_07.png | Bin 0 -> 481 bytes items/item.c | 134 +++++++--- items/item.h | 6 +- main.c | 13 +- player/player.c | 15 +- tiles/belt.c | 140 +++++++---- tiles/belt.h | 5 +- tiles/furnace.c | 11 + tiles/miner.c | 4 + tiles/tile.c | 234 +++++++++++++++--- tiles/tile.h | 29 ++- tiles/tilecallbacks.c | 2 +- util/atlas.c | 1 - util/atlas.h | 3 +- util/util.c | 13 + util/util.h | 23 +- 100 files changed, 464 insertions(+), 169 deletions(-) create mode 100644 assets/backgrounds/00_water_00.png create mode 100644 assets/backgrounds/00_water_01.png create mode 100644 assets/backgrounds/00_water_02.png create mode 100644 assets/backgrounds/00_water_03.png create mode 100644 assets/backgrounds/00_water_04.png create mode 100644 assets/backgrounds/00_water_05.png create mode 100644 assets/backgrounds/00_water_06.png create mode 100644 assets/backgrounds/00_water_07.png create mode 100644 assets/backgrounds/00_water_08.png create mode 100644 assets/backgrounds/00_water_09.png create mode 100644 assets/backgrounds/00_water_10.png create mode 100644 assets/backgrounds/00_water_11.png delete mode 100644 assets/backgrounds/00water.png create mode 100644 assets/backgrounds/01_water_00.png create mode 100644 assets/backgrounds/01_water_01.png create mode 100644 assets/backgrounds/01_water_02.png create mode 100644 assets/backgrounds/01_water_03.png create mode 100644 assets/backgrounds/01_water_04.png create mode 100644 assets/backgrounds/01_water_05.png create mode 100644 assets/backgrounds/01_water_06.png create mode 100644 assets/backgrounds/01_water_07.png create mode 100644 assets/backgrounds/01_water_08.png create mode 100644 assets/backgrounds/01_water_09.png create mode 100644 assets/backgrounds/01_water_10.png create mode 100644 assets/backgrounds/01_water_11.png delete mode 100644 assets/backgrounds/01water.png rename assets/backgrounds/{09grass.png => 02_grass_00.png} (100%) rename assets/backgrounds/{08grass.png => 02_grass_01.png} (100%) rename assets/backgrounds/{10grass.png => 02_grass_02.png} (100%) rename assets/backgrounds/{07grass.png => 02_grass_02s.png} (100%) rename assets/backgrounds/{06grass.png => 02_grass_03.png} (100%) rename assets/backgrounds/{13grass.png => 03_grass_00.png} (100%) rename assets/backgrounds/{12grass.png => 03_grass_01.png} (100%) rename assets/backgrounds/{11grass.png => 03_grass_02.png} (100%) rename assets/backgrounds/{05grass.png => 04_grass_00.png} (100%) rename assets/backgrounds/{02grass.png => 05_grass_00.png} (100%) rename assets/backgrounds/{03grass.png => 06_grass_00.png} (100%) rename assets/backgrounds/{04grass.png => 07_grass_00.png} (100%) rename assets/backgrounds/{21sand.png => 08_sand_00.png} (100%) rename assets/backgrounds/{20sand.png => 09_sand_00.png} (100%) rename assets/backgrounds/{19sand.png => 10_sand_00.png} (100%) rename assets/backgrounds/{18sand.png => 11_sand_00.png} (100%) rename assets/backgrounds/{17sand.png => 12_sand_00.png} (100%) rename assets/backgrounds/{16sand.png => 13_sand_00.png} (100%) rename assets/backgrounds/{15sand.png => 14_sand_00.png} (100%) rename assets/backgrounds/{14sand.png => 15_sand_00.png} (100%) rename assets/backgrounds/{23tiles.png => 16_tiles_00.png} (100%) rename assets/backgrounds/{22tiles.png => 17_tiles_00.png} (100%) rename assets/backgrounds/{24tiles.png => 18_tiles_00.png} (100%) rename assets/backgrounds/{25tiles.png => 19_tiles_00.png} (100%) rename assets/backgrounds/{27cobble.png => 20_cobble_00.png} (100%) rename assets/backgrounds/{26cobble.png => 21_cobble_00.png} (100%) rename assets/backgrounds/{28cobble.png => 22_cobble_00.png} (100%) rename assets/backgrounds/{29cobble.png => 23_cobble_00.png} (100%) rename assets/backgrounds/{33resource.png => 24_resource_00.png} (100%) rename assets/backgrounds/{32resource.png => 25_resource_00.png} (100%) rename assets/backgrounds/{31resource.png => 26_resource_00.png} (100%) rename assets/backgrounds/{30resource.png => 27_resource_00.png} (100%) rename assets/items/{00iron_ore.png => 00-iron_ore-00.png} (100%) rename assets/items/{01silver_ore.png => 01-silver_ore-00.png} (100%) rename assets/items/{02gold_ore.png => 02-gold_ore-00.png} (100%) rename assets/items/{03platinum_ore.png => 03-platinum_ore-00.png} (100%) rename assets/items/{04iron_ingot.png => 04-iron_ingot-00.png} (100%) rename assets/items/{05gold_ingot.png => 05-gold_ingot-00.png} (100%) rename assets/items/{06platinum_ingot.png => 06-platinum_ingot-00.png} (100%) rename assets/items/{07silver_ingot.png => 07-silver_ingot-00.png} (100%) rename assets/items/{08log.png => 08-log-00.png} (100%) rename assets/tiles/{0air.png => 00_air_00.png} (100%) rename assets/tiles/{1blanker.png => 01_blanker_00.png} (100%) rename assets/tiles/{2dopravnik.png => 02_dopravnik_00.png} (100%) create mode 100644 assets/tiles/03_furnace_00.png rename assets/tiles/{3furnace.png => 03_furnace_01.png} (100%) create mode 100644 assets/tiles/03_furnace_02.png create mode 100644 assets/tiles/03_furnace_03.png create mode 100644 assets/tiles/03_furnace_04.png create mode 100644 assets/tiles/03_furnace_05.png create mode 100644 assets/tiles/03_furnace_06.png rename assets/tiles/{4miner.png => 04_miner_00.png} (100%) create mode 100644 assets/tiles/04_miner_01.png create mode 100644 assets/tiles/04_miner_02.png create mode 100644 assets/tiles/04_miner_03.png create mode 100644 assets/tiles/04_miner_04.png create mode 100644 assets/tiles/04_miner_05.png create mode 100644 assets/tiles/04_miner_06.png create mode 100644 assets/tiles/04_miner_07.png diff --git a/assets/backgrounds/00_water_00.png b/assets/backgrounds/00_water_00.png new file mode 100644 index 0000000000000000000000000000000000000000..335d90ad96af4317349f013f557da466acba94cd GIT binary patch literal 2438 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 L)z4*}Q$iB}XtR~( literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_02.png b/assets/backgrounds/00_water_02.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b68a2b41e8d10e13af28224e8c6fcd067a9a18 GIT binary patch literal 2443 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 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_03.png b/assets/backgrounds/00_water_03.png new file mode 100644 index 0000000000000000000000000000000000000000..016d1273ddd5518e2466391b7f8b13b4a330a865 GIT binary patch literal 2570 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 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_05.png b/assets/backgrounds/00_water_05.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f72cec0c0f34c18cf4c63b123304c17c4ec94f GIT binary patch literal 2554 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($0a29w(7Bet#3xhBt!>l~}di85lW>Rx|oDFfgzsdAqwXfWc4a-SrF%ob8@2jv*3~tOrl_$zHEy zc<}%K`IW1pFVAh?XS?C1$nM!9su!0nb(km+>*9+$=hcg(LG(>Xq;W1k(+yT9e-4Fz>cr;_e*^H-OgvzwNo>8R?Mc`rMvS=WJu zEy-@;X4U(z9-W>4XS&d%i<^Vjca%(G3N*aIp4WJ|RC9vi;;GedwIshhGL=Y}GxajJ zs1(d)Ijf^vFz@}%O+lx3dMU+f89Ym}lRf(A*Hv%X^LsB9EY4V)o~+}g z>lJt8kOAYIkKgy@H#8po`a$Ua8U{`Q+0cl{MLY6)oG$bf=bL`3lHD99ws@na>gU)^ zJH3pwW8GgreRcDCx5_g|<<;LKC0Ad)S>4pmP1;+-*^7x!)#jUm5kcCirKwnDV;b zlzY41Gbfx~bc%D$!)+6pUf+!|@?PTQ>2@ZoI=bp z9iLXzY*ko!v2;bxCynR5yNq9`oOSRZi^!K)yZL;+^xA_8g+@V7 z?#e!Yz`$^%M(O$N1u?sO%jUUd@F=W$e0^c4Imhwy^L^NMZ_?-tMBowpsAo;uezb57u_U+(Ky-VD*s3|tq*JmJ(08HvCM=7t;c3305i zJ;iwL?JC+L;rsL^#}=jwkrx;jGx9Wi?CJoO1ddFikB3E8Mlp?CZ+H=Y6|BtD67pMKWFaMt}g*B?tkU`+o741c8jI4_6xfhZ=Y%Xvb ziKQ=KY~1{{Bu`#uL9#T%CmYN8&YTGh66QV9OR}pEpPpVezy9wZ_4)T$*J^&)bJj(= zxhK=@4Cj=?XVo5^kSy{}lN2ys@k&f%?Ww=cCQ=M%%gVZzS}tDxCi=bW!u>5#oaC-0`< zx{hSZeVz5={Qf^FyJG&mdgr{qXJX-&88h@7CkO_o=4ml{?aaT!#LU3J!N9?h^yiY? zJHh0ekAGX858lputby@Uww3P5jiyWjf3CLIAC#-GZa>~0Ue@L>dayecG#_jFBPiD93o<7Cd!ghLrEU$mMu72lT37Pv6#?QO| z|Fkz?6Zn&p#rx~&zrx&-Rbkvy)e?MOZ9DP3AtLy>6UXk$se9wzn4WkPb^86c-6;!_ zH%89+|LOAi5*g-no7Xw7eeOhZm}~u87#@5*Zs+%>%-3>Xh3}6wDv7h}eRJU~_oqEq zRyqg0*uj$IoyWZX?}KY+@5lQzrRY81ymszs`T9TE0+*DQUAW=5mgz#~K~2q)Nx!z= z`*UtVx%t@@x9c8PzqgA#UbNLkb&=55ta+tv3wrM@d15i)sT4~??H1cR(mB5WKDf?U z>+o8$I`X-bdSFs(-5!RucV-1&i#l_6KhN#zR(!M_5Ik)EKeSEM{ z)9b>qkV6{0M=oq^Fbtk@eSPfSZ?}5w?W(NyRBf=cTzFynYF-Y<#{8$83KA>=lTroU z7v%5TRR8J0y`+gu$s#+lwi!5`_{@DTyE0TMU08uBX@N?fLVj+b?T(_7uaT2#zW%7J z{`ToXGyl<=Z;v+HH%&Uwk;QjCPcpy9Z~<@m{-4*v_y3nQdZs+}t@o}~JIofHnVaNz z(#2f*+qrjDu}l*7(F>A)tNnhlTYgSm?f)8C_SqLVWj&p1DR}y|?5gXx&k6`6zw7KS ze*V$c?9Q_j92U$<$8yYP9-A6_TJ4U5+_wf}2e!bM_iB94sJ)!>`{$>x+wcE-`+R=) zNgd8z5+#mahSJe{8;gI6I>ekyD>7kUTDg7Y{i=9ogCDo$xvpUc@Y_pGecrHw5 zI8t*^(s0MuzP-CAr@KZrEpOc>>1w>%t3rRL42Z+g!sLQxzIx zQYAIz)MrC+k5f{%gnfO>UdD;x0Geub@B7S#kzn*<{ zlQU#ed6dMpi5nCj2e>3e`_#P8&r-U+DP``y`&lWMH8nJ4<1*`QN@}dHW@{28qd_wwb4^pUXO@geCx7>DAu= literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_06.png b/assets/backgrounds/00_water_06.png new file mode 100644 index 0000000000000000000000000000000000000000..66c0c89683d830701f4cda5832451e009e16edf2 GIT binary patch literal 2569 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 A-2eap literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_07.png b/assets/backgrounds/00_water_07.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb58280ad425b4dd0671cfd966b3461d31fcacb GIT binary patch literal 2603 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($0a29w(7Bet#3xhBt!>l~}di#I3D7*>g59FfgzsdAqwXfWc4a-SrF%oI5;S977}|Sr0~b%ng@i z`0)SczQ1+lv#o!p813|&W#T>CZ0*{G-8=FVxEHwwPHE!kvg`cuXtKtYrw7>`Yrgmj z2)cGx=VmPlyKI(el&N+*<=vf~zyE%FZ~gpF|9<(6`@aXTzRT#6%)`iWs>Wzuk_dBB zcJ9~H{qrm@<<u@xEGj(pzL-{*ot763Gif_FOhOExkZc;N++Ndc!>%gC9>~xR^Q3Dwlz2 z3WKUmL8uI4((cgekInCQo6QyW`uA)3eg=nqH&uIP@42vdqNY|BcaM;i#TGdx){VQk zT23U!%kp%7zdJu;>6MH(&x@sgI7H^uJeYDV_KX)(LI`V=@iF@gvD>ck8J@c^qy9Vl z)w+DE&;=$QzOmeo&)97XW#*hB>^mXF8wCq4cm2G(IPa{k14HtqRhsXtQQ)9dqj@TMop(+pKf2XY{D5c4p{;pWU*ErR@8?18`BwY(y{fwRuIAL7 z&;BbODrB^Y8fYxNc&p;s2*2=WO51QNCSw=EbDEmrY#U2V88< zh^F$&PrtVL;fiavwMH|GGtDl|myq9AyWYzHDB<*)%39Z>cm-Di z%Z`;(Cx)Fmx#rC|-Ykw4b^Sq7Q-b%;x_BYDL95TZS-~{Ya}jgD3AuLMn{n9|qWG&qtF#+Yo;y)wBqRqL9$yj4lW_wR4-P`5ObnzL!fTMoeXJs6DSX>t0Rxnw*@q>+imNE7==ov}(oCmfS6T zlRlcy|NrFYadYuSft0j_=?V~%L)n7?kCcw z8$1i2$*BDOyU(P*&rV$IxBYiRetUJC8Bc7n3E4ku&h1Cydb2H{fyOr6DIE7 zW2>hd`YLni#4@D1aBST5=ile&#|oz$-6->|(9E~&`Bh$Y5n?%c zFON>m5$i7h=U%=0=AHve#vKc`7_?m3|EIM4vA~ttmpxZ4FK%Y*csTc&yZoD^iGLrS z+Gc*syrUsQpsUq1fk%RSGG}ClTyk&l+_%{>Bh{kmNg>8CfTtl zd3sy%??z#U6FKdAx-k)Nk8FOaeY?ELsQ1pc`F)KO&g42xX>?Q&Fm00tySbFH8ty$Z&XU ze{avX@7MKL|F+$|cg3;d3mu+*w(Jc7=b0HoF4>j_efw2nCjQn;p~;ZJ%~gtbhrtca3%XSa7}-TLe6 zckC$mXZ!trW%cvk|NnmV&X%|SUr<~7`Cp0Gw0-}LEqAP+JSFVb4V$pO>HLn#&&+-V zv1^1bHVim6UF^uCuG;))zP1)a1(lV$LJDk8H}}tZ^i@sb&*#(i>`sgt5)4O{?~?Af ztLwXQztWTUSe+&Fu^n$$DXsqFD(Qac^OG94!&14X4aL>Dwzbc-0=QbPZPIKo%;*XG zae~z?v+S>wm}+rMg3n?`h5(Kz%db|hs(0Px52?@hd~0<%qiYU-9=plo$<+^vTvnz9 zZ`{^3he5ngp2^|W_6=)%Cf0uymjC$3^3QjrWjn*q&HZ^`=GVU|9Bd828(dvQzN*!x ze^*PrVq2XR#%;X+q{Qhp0!vzgSeJe9pUay3Njv=RWp$78!?v|dF%y6J?%PuF@Je$F zgIeeGen!Cq4UBF(=ku)04nF@;?e~(8Tk|E?t}t5@rythWaP8;Q|2u!S4Qwy+#P6?se%!G*YLuY|=8{Ws@`Y_Vo;10qxfZI%M8Nm*)#O8LemRxx69lv74OC6i0Ta z_$|}+6@B|L_3y-4eQ|qh@87yD*lxBWb>&Tw86AiDlKbsLGc`oJOpHR09%J9+^7@2f z7n_gXddRX)m3yB0jAaY~L5{Zam!I@nSD%hN#Isv{>AN)^>&0|RCv8YQ eKJmn}|LhL;Cfr}%`nMI-nDcb?b6Mw<&;$TJCDp$G literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_08.png b/assets/backgrounds/00_water_08.png new file mode 100644 index 0000000000000000000000000000000000000000..5e268df6c99ab247c306b999dffd6782163aa0aa GIT binary patch literal 2606 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 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00_water_10.png b/assets/backgrounds/00_water_10.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd38442cd1c5d87be1725c72561d042ca074414 GIT binary patch literal 2655 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 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/00water.png b/assets/backgrounds/00water.png deleted file mode 100644 index db6fec35bfa78fcb914f5b154fa4901ccff209c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|>t~ zc6VX;4}uH!E}zW6z`$AH5n0T@z%2~Ij105pNH8!ku$OrHy0YJ5=M)zV-iOykA6J={*i!_!|MMIu8ccsf6ts^Jk77@T*1sO*9rn-Sk7`f zDde_p5#?a?E^hJV;DfsM8Un&{k^Uv|3cY`KA#=lJr9(kFteV+nzYq+6gY`Z|vSM zm6zRZ|Kp!eHcXD)Z?tt{it??JXN7t*;y+9ht_$H{lomEl?{O<&Z`t%-n<4O4r2`Ag zmiG%L1Rr~nvZHvOdgc9zQ#cOfOg+VZ(M*N?kq+-wpIc^GtFJs4wiO9gWj$JT+(n?} z_4a(5ef7_4Y~mR?q{99`nUc9zaQjJ~1~xB_Eru_jb2{j>MsQt!J@tG2|JjCCAHQ7= zuX_DMBI9+>H3bbe4^4{$b29vF-j~OS-ao$Tz086}No$6ME(sewy%M)Dnh6RvY1y$U z9eVsx;cniRYaMSbHeNF*|M%zf{mTFUv>6uj-}>#~#2hLi9HjE(%$icg4eu*n`>^-oNu-NI`36ockH@@rdZ+Yzasa>Uc)A#EwThhAX2#2QLMIT*qF^xc2bJR5ly?oBN*3j7@G{D@4CG_B1r1PvQ=P@}R@?c;{V!HzrsiD!a7m%9^rxu5`p2w}hAHQ+ zsQ-`(nd!SN6S(Os55iyXiAE^OQo@6cMXTjALek%^WQ*Dj1HG!F9ec5QET5MdEN z{%h51iP!QD*~h+%Zj|GFEz93zJAb~@=i7goO$_>)x8w^b7lq{A-}mv)-@pC&UW!YX zE?Cs`IKupj)9;?F8-L~$1xfvUeq#InzrA~MTh6}}KVi6Twb&aQPF-QA1UdG)IWr`` z)~QeF4KVw5`}V7UF@@zO%UgFj@Wd6g*oA2(d40Lpso7+G{x|zI>&K=Imu?(TdUi}i z`GvS!ZorTF|9g0!&9U(NlKWtJ!SB;<{~NOG3;aENwpf0Q5)8f5`zF7^nd?P^rMjkz zTSKI=;kyfor#!=3@4dA6Y%{ZJ!PmCu!kN;A`UYwnx4YeXU}1HSd0pF`Ih*IT%;7XN zI5*j1y+EAi7fvoiw*rIBp-qO@CrC~-wBy+M!14MYgT*J=OA4&&oHQk;Zh0l>bfAct zA2{pq0%jF&UgRhM+!T=XH%Y>&y42wRi*UfJXr zv$v>zwZ=-+X`m|3k|!KVfwE z%!;>SzQ}$eXnWl6 z^Z>JP=2tf+UUG;#Xe+|Yn9aMNWsRQovf|@4d!6Tdzfb;?Jhy-16yc>J%Ow9ZI_Ai6 V$nZ_JXJBAp@O1TaS?83{1OUxv?jryI diff --git a/assets/backgrounds/01_water_00.png b/assets/backgrounds/01_water_00.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb6d1983c8c3bb7751e78ab4a8612cf6099c1ee GIT binary patch literal 2056 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c(%hpZ9ce45_%~I_-M6w7bZ$ z@1EAi(Jhnr%v`qZ6>Ia{BN0v#zaI!Nv#BUvQFZB-J3F$J@RIoujM{Z_d!>*(<_ljJ}wKty{>+C5~?RGCK%UH@5RyDt&B|qz*s9j3c6A}K@HSeCV zTLc_6OthTJt#piMcMan%ma1)fLAEpB%-U>PclwJ%rLAE0>Yd^b-OX#Bg{)s=t?#0FUNxcGmtQ+QRjd!)p1e~rO~0<-lzhs=3q2+&FK=uRk2~=vLgib_b(8dYoalhlhF-Cr3Q3%pd^+1$;4NaSN*$Gb>w{nFI;dnZQzu7|o8X9P~UCiv0JGa=-vZeOKq zr-8+WBIi@eh=^f4bqEpZN(jEy3e+-*o z!n$R1@>FX9gXwQxI)$D)Gm|%dlXRQp%9B?P?EHOc-5hQemUn0P>RF`NXZUQ}`sP&n zstT1wXY;4&=fv0Nef@mok^4&RYftwJYxo|oQ#(0ZDuDm&k!gybm1~j~e3-I}>GqC` zIn(QAR@6NH^V;Htk+v;^pwyby?dLv;FRx-Y-yXJK$soloO89%6QdNNi^PK~_L5m~b z91;wfQum!)g+lk6B*+*c5v!|YqD$Xv49Kx}jLg#5eqyuNEYUl`jhwY%l`F5;PA z$ivom`&|0l8d5@S0*^Xx`f_o8lF^}wrRLX}k1W`6g4t8h^v)&WrkR2(SDz7Zjp}}H zsqn~jV#bP|G^Wx;wF@TdE4fu4ae0%_dBXT@LK<`Fsy7VJ6fPB_Zi!o{ZS{m^AGL--(z^NXq#A@;jZU;pFg=vMJA zLVU@Za=!QvbNv_dHKx4GlJY$(Yxq&rspDE_;ASq~m5PrYlh@WPeSBxCeu>O$Z3!)h z(?0j-+8d_SoIlyOf``v#4QFqobjjKB9(La4ik9W8jYP^^e=c}wcym$;Js>P z3tn2ZtnOshx|}FrIn#_Oxlht)XSUzE*3~PX+G=-BY}yzY`f|pz2`kt6l&#=5a$X~# zusGVl@w4#m+V^um9NX8s=1_5)*~8zC39}cTG&S6v*P>Q0G_&vTGIdFllW9EAb(JDW{wea#OrIaYsHSqd~IZ2$C$yNaiV=;!NK_W zE%&a>O1y8cTBz`+x@%r**`~Z>+ngt_R=PZSr{F2hNe39WE32$tuW-VKHA(p2O{aH< zwarAcTs-#01~GqYJn@Zpn})frR>DW0QpbbFrQCPpo@O4C7V*lTeMr$E$Je1#B>BwA zipi^)RF7)s|KFYafs0*(wV=7~v8=b?t2H6r2{%t__^57~)AXCs?#?ULyWM4+l7SDO z+3)`PgS*KsS>~gwgvQ!)z6WA|Ty3ZdTI^^crYF0hS26hW=l>D+r?eIpeEt3IWqipr zucGW%6I$eURTUc+UUxR0ozg%10h9WrU+hfd{PEEA(luSTQyXU`ocFQgyj$1Q zbW!!>qXvr`F?TGQwHBxSQkxO-?0?h>%_DC4tip`!RnC>azkPpyxPM=e%RYzqchV2F z^1WEY7s7Dl$f>K_SDWkj9pek#ddYe3M)}ys3Ng0Z>uQ>>rS9{;q}1p$(c%96_0Cec zI>E`c<=rMP;~u1JV>g*EB(CK&WkCQ}{mcKxYfgwBn(^@3-|Y_UT@!ZNS+3mq{MEU9 z$2&@v-;6zamY6?bO8O-%W5+4!zeTQ1XhGwaggCd?Jj@UMoqJSNeqZ{$bYh;P^wy=( hr4HpMgr5An&+HH*HiNH6fPsO5!PC{xWt~$(69BSW+P44z literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_01.png b/assets/backgrounds/01_water_01.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6d96cc286980ac7b13c73b57f32a82c7612cbe GIT binary patch literal 2090 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 CWbNkw literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_03.png b/assets/backgrounds/01_water_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8774d1910404a37c49d9ac76b531ecdf67c13dd9 GIT binary patch literal 2139 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($$D0#X#hE&|Lo%S+VI$Z4N zZ{fdj`iF$;XGJX9`aY}iU?h)F#f&M*Vcd&FTf)rrj|e2oh^_x9R-k3Pa@H*S^1Aia zTA|ycV%NUgJ*WEJPJd(d{**=9k8;zWPPVO1obI2xPhH4#;)-Zv^{|&YCI7a{#hE|i zHQuYJ^jay({F1ETZG%a&GbJM?vl~TSJ|6bciGRSxBrN{Nt})R)leRJ=j!3miCL#ZX4mYTK6Bl~J4(TO zT(0R=o}E{nde0`HPMzQRv-q(mf{7`c7Q4Sz+Nn9ocjoKBy{5H~boO#i>;K~6+xI^6 z+Lh!;i7uC573m}DvP>s@{EysHx;XV^qsJGQn$u^#g)TfTuQb*BlhGd!VgHoE`QJGe zxNnEOY~B3jT;wm)0K4fM+d8g({lLt7C1oFXM*_Rusp@t5o1JIg4qZ3dmcQ3mFn7je z|2xOt=RLjt;H~q#fH^botBEe&!QIf9&o^i3_QspW)vp{Lu;-uCI%n#|EXEqROHH}E^aGwuxbgc=__v#de~*Rtts=A_cH!X-`;pne0fNIKi|v+&$+yA zopZQgdxKZu`umuO&Fkk(J%3~C%jZV>SXtlfG{0W=p~H^Zu6AZtlU?o6W;fkGjzI;? zlOOYQzD(A-`!@Ttc)}~;o=qXEjVExW+$cCy0x*o;}c36gt@#Wd!>=(O7T`OY%oow76U zAKvZ3yGO#=RDNe;hpA(KQRV0VX5X%FUG%YCOX(g9<4U#4%SG(3-n*RL^VdgEXB%JA zgsa>e`X%2f$7`*KcFAtrt;@|EB&S&Jes*$C=uS4SSfQ&QSVhvdoi%tpkzK&;fPDMx zvK4=({F?H8%BqtmN_VoSHa(mrIC&=D)x*xeJm>!jNzf`W`qULN!Bu*0^~qqLiaX|$ za`!Etx$x#mym z%|DKr?_exnIFoVJsqm@S4dgk~&Uz>*>MogZ^U}Jr`+3gH`_yasQzF$()aLewMkVe5 zy({{6k1d_JVxs<8k)L)=AFtm1UX$-@>#Eyy-~OY^nzSDKkh<3>Ay{S$Ii8icghky-p$(+VAQnh+|(6iFGaXk^{s3V)o}bNar&IryDp#e|Gu4= zSNk^akLA6;>kYqd?kK+zxWrXmVQK(_lIVn!ui4~Qp6Ix4ywp}8dB)3yKAVfHGEDDP zMu$GozWQTdXk9ByVB_{%yNtH;zFW2Nrtgb{baR(Qjw(!7F21|CGdTN~W!=OxH|PFW zkXR#Vd|$a%jrp+V;sq=URr9s~FS5C|HeKmt2>;GmM~`#tW(wOn_h_m7qplBKWiKjFy+tKW4*8N7tuFWZRkA9eOo6TlwH_rQNQAN~>B}Q@@9-KX)i- zb0^Ein*L0mn8L^W6W<*Ysp@l#HwdXYU22m3ta8H_k*$n{0v`_dv531nc|ULt>0p`r zM|)p}McquH1rs`XcX26mf7Rd8Yus+Q@BMn=f@LceR!TnZzw=8xLDBKpTy1N~WwTkD z4W9TtYE4Xd*YoeNw#}jiD*wWl-1s#$djBF9wTm6$o^$v)o3ncFSzTBV{^DG5l0q5d z_WpStA>7L)M1OqZuJzn-;m4$$f1H&HyX~LUIKA1}8eU%>t$ePFe``>1KF`N9f-cFK zAB1=Qk1qQ-M@K|QK=2{2-T|?Fj(1MV3IsTqP2b-u89s}Vufd?~J(FA2z0h}VS(7(& z*nRBD43OBo&$cgQ-JN68*B`fJxt4Hc#qEy~{~2aFzpL#{Iu4M!JzNCdoTDmw%i4K63I(MQ*V}jcQ#jyB~aUwyo&r+E+IFrhI?pp~A^( zi>EK(w`l0zGIQp(lJPLT=f(|pKUevnqc|>6g5xw30>l%wDPGu<`Dn&A)Hh>z}!^&WHCO``yN} WuqP99_AoFoFnGH9xvXiGXzRHCMp}L6t?4@t z=4U&bxXga;5Bu|H z?uRw^Z#|u#l6agaf5IUi+mOySj-ZMo9?dbS#xV;n}9*RR4$s)q5{~ld1;?vMGReF$GFF-B^VPM+`^c@ZW#)F}5;4CN_x#G&Vq7`Pa>*Xa zb%pn|KU~=L?T+4FrLFsG)E1WtK3#3ZW|(MZ ziq5xqYX0xkOf8#fH*@>jrp>w~{&3Z-TcupiGv$A2FQ0god#e1T-oCR3CMj-?oqC^b z>HbA(LD3=#t#fY+1_qhylrto4cp78-NI0nYfVJ_2m%20WFASbFd1C3z+gy74wy&2z zofGXUKWnmgn`Fe4ymrMECoP|C4f365boHC~ch_CZH+F4fIHEcCr*?iw;_PXP$9k@~ z?$O-r9C~B&OuP9#v6f3*C!Hy)JDD59lE2rXi*3i`b9!vw zc$V|A*B_2Ww4C`i=aP2ljn>Zny7e2ipTFq8^6$^Ko~^BYVpk6cbV&= z<(HgapE7j&`iObnqq`ehi?h?jBRqN)-@H~Y$-kgxDj~msd3#)&+#iMxpQ`5{>K88k z{@8q8#j`cmmw*31uQ#do<-6!s=C}PiU(7bxN~NB%S6(pRqAxYMq3ulm@8|ckSe%Z` zn*09rn`zO1FZP6PJ+|oeoJ5xv?Yp*4Pv!f=TK^f`6|9;4`tqj!dl&8IxURN2*tOhI zvrTICo@=Rxv(G3_cG&VvZ~pUa@iXR+nip%`7Couvq@e$-fnTt3?bpsr!Gi0%U23mz zMYCIKmNQJR$zI_jUVnO}?Waky#h;A+xlCbDHOejiWS1SZOm5?q2{Kv^bFXapynBV& zjvtBzj}MsdeDXLV=kB@9T+&iJJkr;n^L|@#XnxhyZC{f(uUF1Y%}%dAc=Y_jrT$C{ z)ZPWL-Q1Y*vRm=f*Y!Vdi6?EUdBXW-;nW<1mJeyEd_qDmECmOAhZYxeEKc5jZtka@v+A0*_jq&X z|DAgM#Yru>6`4)4HxCIYPYIm9>lY8t+)t}F&R*{KvikQg?}y(~R*9~zo10q~>UrZ{ zit@vPD%Uj?0*fP#Iu|UPSD5*ZW2Vr(H@z2G9bUZIDI2iqxnD?PyX=BZx%rH19JczD zN0zldtN++o|Im1!va;}JF~#8M4?4!N|Ib`VDD40HSv57a?)q(4ohzj?)xR!3usuIz z)60|BqqlTe+!TxAmesyHG5GiNeScf3C2tkIT+qHWbP?}fIpNbAc;B#{T3F6y#3Fpt zxY|Kx&;PnbB`TA1XTIt(@V$ECT&9{tuGYkNx1JVDg&$RZf9}Pmu+&}aJI|U-Y@U3x z#cbxCB@Vo;8X{$Xt%ELGFwQ!VRGB@M&!qR3OqJuQj&Hn7sTsddZS?r!nsh)oxj59J zt$hCDd7>@aPW(LgpV;0%5<4^VX7O=>70b#maE1$y(|3cu^1bs5Q?8m99`9L~ zl&mHoxHsa)dWIMC?VFj;pO@CUx~MJqlH}Ce;w#^E6f`*b-Tb}$VD8Y`h`Tw7lFJDeQ{GeIPed-U@4`<)@b2JKu);Pap-E*jW z-s)F(F0p+&biv1K_P-kc_qPQKUV6zLKC-H}(R=xt1sh-5&gr<}>AUpJ-rxe`$EADU zH2q?GX24K1DfvyYh4~Nu2N#$%7dSTe2}JG@{vNUD!a0B0^UqC7PM&prkeC}@9w7OT z>-mX^A2z+dH#P1hZ%}dl0z+m_VJ+h=-Trewz4#UT==+(ar>%`{f1DogIH~>iviomu zg!kt}#Qw@$^)q|jx8jtq>hG31JnhW?V|K9nOMB*tK3%t&rHnJB4A}Q9bj^LXQ(S46 znsM&G1&%A&!aNR@Ea;yaA;goiG}_4Cp)v1k@q=?Wf83F?-_|hY?|C`b9rvDE8Ke{` zJhIK57BQJ=%YsX@7hid>dYw#@^i9s0F2`r3Y??hU>P6exEMNYA^H#H_RV&?g6VypK kuw~tz4V$cuZvJQfQkUBm(@>Yjz`(%Z>FVdQ&MBb@0C-_5umAu6 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_05.png b/assets/backgrounds/01_water_05.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e5b0e9aa4b906f3beb0cf542a22a85e24d7391 GIT binary patch literal 2172 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($$ID5J{hE&|Lopw7oI8yA` zdExZ;#h!0wRbFawe#g0!(NN2YV^ZeZJO>w^oen3a?!KgT!j)09^wzew^H!B*$vsPa z7C-mC-SVteVRMz*Yp*?xzW?jmwKIpjC0}=Bc)Lg`1)aaTpKaOv&Ks*buC940y!y*A zk2SBA{d+R*`mF1`AS}2}^5nLTHIg5<`Fve_sF7#=tHa(^1&%JOe|=c=PDlEu?Cw9; z=I!0|zV^bKncmsYocKf6`+r%^_W#tieG(trBq9wrMH}7Pl6I~$QJmkU;;L8q*_7iR z-(1$ron>vL#^&YGxmg{_UOf-q{$bmwn8fem}A0;+ji4H-FHK{yjH6D=l6v z>WQ|HwASSxY%_~a{NJwKCn@ZoS|YpO?V;<2qKT_ygguYluG+E8T6@Q|m+MTwo|d^GMk0X-)QPi z-}`5>vwuxJ^Zn~XR$GgF7rE{itB&#eh)$F(=;J!GWKl0i=-V8Be)E`q-38mdpYQwB z8e5g?y!Ow!zSlQ)bqK9F?=SW4bpAn()=8fw^3!(liiWawwHh8}-~3|^+Yj}!h06M& z(;w;H{~;&$cBc8NfbA}p+tM4azKPC$b>_tTlM$!A_*1GH*zJ}}?lWqi?kRP-fmNWU zy#MVdRog4>tKwvh!qf#dPM9RP1o{? z6Q5>v?TX>q>nmIh_treDb=5E_%7U|RdQkQXeq^;sqeX*G_ z{Ze#6_>pS2tjnnd?8aQ@)3^W6?RhKNxvaZ#qoLzZ0k5OxUpnIO7Wda*3OI$TXoJUkEzS`Zz~4& zZqtx)i_V%c`Sle?3AcE)Xdj!(hp{TxuA~Q=&g5w3FyCuYkj!SPZkA3g`<)k<3 zHH}|KuPKPG%-;8DXF%1?M;kA6Z2u9#XtmEfr%NC(ZMT-w=_3!4U+}-4d-VLnr|U~v z7n&w*UHITpKtWu;ku&cEMa!8>Y<$Q#>ur_bE=@86w`W5q7Udr{Ubo}Pk z`=iR^Ct9p}aBCKK$y}Wu4L81>k=&!?xP7K~!-M%YDP~i5_}M&OB4k)DbWtNHWlw&n zeOmVZ%r8>nN2h+j()a1XEQ1-Z_dYvUd0cP4@L`Yq6E4CXCq>>Ko;dNg>H9f9wC0~V z87%3%Ddh8pn78~5lKbi(&bPTBkY{bYqp&!;#nen+qS=9*T0LFiYe(N4!q3FX+B z%I9Zf4~mruAAYlP*~Ghw@qdb>I6qJE%H3FCeErYlwb@hkdOyx@E>7nv|I@RsJL0an z*#picEGrh?{de>F%~$E^|MqVFAjqt@`NI{hH;tyYDx6FLGdd?Gng;LLQ&{}_-o1L4 zJ^GKB=UqEHU5B4lhoNo8JogP@YFW1eKBybsDyp+6uiN8NGeca0)nebL?268Z(_L(8 z7AT1G=?OHxT;BT5e(tH6pFfyC;rJNfESD?X{I9Wnxr}p;$=yhax`KDw?_M2ry|ZwZ zT}##E#IF%HjX-M*d;-b$vN!>H34Gq<1V=@G6x^sLy*~$tc}x z`AFZc?Y*1VTLtYvS*||@A{7QAGuYjeb8i3EpBTVBE2_Ig`9*ovE0tzOnLf(5JKe8q@B~ElBZ| zn`m)m5tCAF`G00f4ThxEZd<$_g>VL}n6|%S!NOf3EoKuJ=wDxa@>fSu*G|!dRdyjP zoWEZG5ijMRz1yj~gGIa}*Kco7((@I(Z#b3aCM0}3)9M)9D`o%T{NBYTn+~k>F)e8^ z{~(<6P+GFE{oOUib!TrMcdMJRUPScaQz`uzQEK<+iR1z4!0w!Ko8pF19?-^hM~Z-n+%m_kHTDeExi)^!L7oxbS5y^L7auijF&a0Uhj22WQ%mvv4F FO#oLKB0c~B literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_06.png b/assets/backgrounds/01_water_06.png new file mode 100644 index 0000000000000000000000000000000000000000..bf251e5446a9e9dbae36422ac3fc1e4e97361fc2 GIT binary patch literal 2218 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($$6neTihE&`#o%S*~|4kpJZt68Z_hp}PvBG3q!F3%0 zH|N!)_`lRWi)YH*klQl5mR^$m9kl<(|A<%hT3_qU{PqY3Tlbo|E=m05 zbtrz?#%)|zegApn&v{>S!nEIZ^ZB(O+m)__&1`?X)PBX8>q-Htil1ZV6}fIud8|7# zU==iGnJ z`H0mHHhCk4ht<3kYqcy>X`AhWf|%>lcv4t=3mRbU-&R@c7CL z!sMzr$Di)p#n%hQoB5kf+Wx6p zUlp8a_2#nNLPNv0>lSN|>{2^&!`8HFdgKBAb^bgymb|MjxU!sPI@o!|pzXL#`RyxF zTh4}@NI1zNucp3FO<3Bf(0!>{;i}ur;Wex_4heRJf1hnFU^V$QPi1QukDTFyutnM) zGJNh*hoV^uSImyANs6s8DR`z9?C?Ky59`T~-Q`V*U*eaVPhjZvO*{DL zz=i2EBz10X)cTlm#aDI58fFdM;#7@gGm`3AuYLGi@h`J1k3Cc8?F)&HZS(YAh^;+r zp>^!Txh)NfYJV!VgBJ3=)G|C~F;QTyxrDx{SNArT1x>3G9=GNnUzZw6pkYF&F#E>O%QwT-9z zw%8xY)tH;Tw>+)y%8BqluTJJj7zJz;&Q)p_&t2%|b79gIsm=*}vdq5XT{d2<(pw(% zWGpN@_dT&F^MCy5_Wxlsf2T0_wv-39gc~g5xWHo^AYoC=%sHhq)Frw#yZi2R4=y(` zqi3sD&Y!@_birRs!lGI_Z_=`BovZajo(X3AWgWY^pj$XTRn3<3$BrDf?zXP52=3^NqUO4^0*5ne#1{Z zFJlsnYQ3k<%WRw0FTtGtoUJXdsaJ8&=WDI(=PYKgKJe(;ErGR#eX+ae@7%k5rf0aP zSN*i->I#pn7GH|}&@ySogyN?&<1Q+0Gf%pjc)jY9?URNlU+fZi9W?%3>b@L*WV-Ct zlarb{%#VxBTTrs&nWb7YYm0aB<^H^2yCGAOz^t2v>6z5}mvgL(SobYj z>9ap9xMGRvx%NpfQZrpwm&E^id8xF3Mekl3_p@2=BTuZman&N$D~osEh01>RRV_Ef z>b}UWS>W38v1grhROPgJh1{1nPmN-goUGehlzB&@&DF@sULo-1M|-{8x+{;pAKCF5 zURHXvHs|f{i}&vsKU}cdeuo&(_I+g~8dnqqnf%ts>F3HGR-3!N{vgkjuScKpygYx> zVdAHq*?r>soVRwcgzqe9GW~q)hu{I$vX4*n7Co3Ab~)ASAWvJ5YbAOX1^0)V_f@eLfxv8ekG4N ztq1*5?@nW BKPmtK literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_07.png b/assets/backgrounds/01_water_07.png new file mode 100644 index 0000000000000000000000000000000000000000..08d2bc3930d01eabed77830e3e904303cb6d9ea2 GIT binary patch literal 2214 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($$nGjk*3WBlS6rE9{Q1gEyG_gc=gd@2{}$0# z>bgV6N%i-sxWxbcxA*@E?9D$BaI|Y{>ISW5)6==1S0Cav4BB{XS6G%aPx{$~)z2>2 zizBU|0f@> z5&y1JezVBh=+2{#fM6EsteR-I>2sfS$!Ol3xQRoorQWem_x9y>K2d*pX&3Xqtb&;* zI{LEt#82omsXFefxXv@hr~c$Q8y&fQ^P~RdW&NDXvDJ0Q+Dr4JCijQDVq~59eDkgk z2P*}2PE|zrmA-kYzIRb)&W)G8GhfU)Z29o~X^+?)zD<{Q_mpY|WXVj+@Y~t@W$)yZ z&+_%k?)h%pSG=xv-7)!B(RBtVyFW~_+>+q?_D1;kx2xIDeMuJ7=$N>t^4~s3C#UWM zO8&y(JET;llz7Fze$=1!EAQyJH&)l}KA)Yt>PnwfvX-y*rA3_YR(b+hxG}UkCzj>q0#Zo|SH!o*0~YsN)}?*?K|0QD^(I-F;W)erZ#Q zTyoO2G?97J&vo|ga%l^coI`n&cd$*;+Ua*c?Q__w(gBQTNYRe2{bJhdi`LrQ0%*ZPtJKuIGH;dodgDMe|OA3KZ-9$)dx4^%4L zdTpJ|hwKZcCnh=fTr+AF7oUA!g#TZR#gEIczyF_^HE*eSpDV}Rr*DoJO?I!fV)yFH zj}YH>GUaIa*Qp7iOU-QOrfKdePpO%CqHX%x*R!p~GR|6mi-*rtl1^y9=&91gW z6_U{tKbA_y2Y2!|z2e;ME4fnepm4$M?%8iYPVN5t(sZ4~UhfCaA~H^W*DMv{Zv4zm z{QrC3!Jqqzx1Tu}eJ1|stQT{3q$oM+w||(fwrRP+1s=tdt@{pIr|oD7|5V^F)7E8{ zIB(a6K7WrXo+VRe#w^_ZXYu{h8CRdoUAX(w+J!yymN0gyzumabxOT?Mee-sF-;w{p z>^P6u+?4itCsy?;>{ubZz$m*&yi+rR=g5iUxvQV75?z@xZQra_wXB_tUd`QiDk5jQ zPqZ|wkMhyCdAg1xW$ndH%arp~z|bQ$G2;`OhW( zP^;)*!I~9juNwR74(0{C^xq;iK`~o7LTt^M&%Zh@YAuj_=CSYn9p5n7f^5m<+uzPi zpL{l7{geJmrrFAk=DTb-C75NuDE3{{V!D>CzE}Iu={1&;@kb*Ki`B0Q9j=U*vDKS( zuxX)E>a`{=(XGKwyN^lMJ!0IOlR!Iu7_k0)j4jqW`EcijcYy)SGLdM(g% zWZs?>)BvqRY%$ z_twKzpUtL^CCcSPXtYG@?`QKq?4KsITZ7A}^v)E0M(vGSO1>LdBVH^xTk)A^?x~2o zAJT5Ct-B-_^ig0>Hs8IYtp|9;lec9sU67Gc-Kb=9nkmm9QIqks%e!KyVg;t-i|3@d zyh`W)nRhu}G{KkS)uy{_@1rNGP6*6f`ToxFGy{J=lbiK#BhPy%Sf6?{{r^dqYmL(C zaj83wPFlLQC;e2_@t3#HG2zf+=6>c8R)6Eb=75vt ztG7>$o3?rRxi`gisat$SB;U{3^VghXwj8&O@`WE7O$xHxTYEf`GbXWS@7OXm>T=MI zGq3jN&f9HkaB=EIsg$RS?m1m-)4y1#_pZ|BXX(oqwqaE(|GL%BOX+8vyk7L7siUS2 zkM>Unwql+XrMsf~zM}nyxfMkP4n|F?T#~anY^9*jjD;oA7Rm|{d2??rkh|uV_VVhF zKaCyN0+hr*CSRNAXK>3fWrLqzRP#%gMe$F=IL|6ho^_)o!8Xfl7hk4z@~wu3)Q8gx yj!4D(*6x@&^ZHVOST(`pn)6x0aztzYh_5ne_w_#Y_5uR~1B0ilpUXO@geCw2)kJFm literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01_water_08.png b/assets/backgrounds/01_water_08.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a4828cd74c3df208b5fb36a4f41f59c3ee3973 GIT binary patch literal 2227 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 literal 0 HcmV?d00001 diff --git a/assets/backgrounds/01water.png b/assets/backgrounds/01water.png deleted file mode 100644 index df8c4d11706560317ccc23faf229057c8dd3d0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2174 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|>t~ zc6VX;4}uH!E}zW6z`$AH5n0T@z%2~Ij105pNH8!ku$OrHy0YJ5=M)za%rE8~v8-|Vkk>!`XA)x7$0wR;w;gSTTyVR@J2QnOW| zYou;}ZQb7@Ok1w+UGt*Uzy1sQnOPlO7=B!r|9||a#fq&)r)x_W zOYyaEEH#a*+vBWxrIxvz!+mX&=o-@_J%69Jb!_;*jc?vpg|`dp*S&IO5j~o9SVzC- zwC79ViB8izr{r$cIAEN>b8FjWd43E3PZl3|l1h>q!j{i6e3o+Ctjgl{SJs9V{ic)F zxL8*lIp})7@NLM=jUSH4vuk?&TfQmmub?xG(l48EXTh9$WAQv3NOpFWk~AzyE*V>4V923%1L@zf!CI z+~s$J#~t;*kGp@SxK`I5e%<+|&z4bAF6EE?tLWIz>yLVf*6_>{4VhXf^Pn$RdRuNy zea(X3eqsk}te98=zH>hkE_V+VKN0n~#>RnV?XfA1$LFq5VA}RJCtu%YpB1Y|=qCOr zyNvDjpRf~~+buLRV{M0|mHMKt()Ta^swhdk%el_2)FiU>jrbp%3t1k4i}*JQmePnQu@~%ofr1+7ZCkpbCE}*^~8c1ib`8PHD5Y+)l|F3(Bji` z{eS7!6ILhhVM>_nU&D1u+j04Af3MpPqEU|K%Kv>1?bp1caq~p`gr|NssaLaV|2a&2 zy`*NJ;aBdt(_JU*D}FJ5%jwolZ)b2VpR*#&=esPYdrm|6FPSO1%EuS{aB&G-ow3hp zZO-jukDs$&y0;_GdanMlLWQ+XV$U8gh?DYhem$wkW6PTaR`rPuGlcJ!`l>A z!&0KQf#YvQf~ER|2Yv6XFIp=$ol!V)G3w;R9*O;Pe7f`so+WISKOzvaPmtec-WKEL zAddw-jjIi++btDkURvMcdvmC0{k?ZR=k>QpMM*!l@Cg0#!Xq}y@qU2dp3-f57Dj#e z{;<8B2$jsyT9?Y-%Yb6Qj1va{Yq}1oSw4#?v3^0N|P^5YwytVy&rx(snUooaPNo$(vkq4{h$Aq+>q2??~qkVU{Hm zk{>KRP-4S0lX)BO+sPtN|8NLgi*Q+4s=9vqck^R~2E}@+EE2UBs+XUBF4eBFH22DB zKke2qZPtqVYUk+W)8aZzcC4K4#wS_&t_H4Iu%2n{<9ADb>x(UAPp{Jvj6PVL^!U(& z$&bRn$)B1cy+T3GMa|Hv(!_4Ry!TI~6MF(y39K`ax#+0&gLBi{3X91O8mA8_3kV*o zoV1s*b8bz*$_sowT@U6wSLh1b-h0p5(CX;=6t=5cE>5~HSjv}+C5wGH-j%?2=4bD< zQ%}Fn{ry}$Q2xn|32z(r36^bmFTHB(#p?7g2j@&Sd@iJ`b|8YxzXFFQ#mt zOk3st$usACxAt)l{qgU${$u zCUI0POSJNwZF>YW-WgHr+7ng{kQ#-!m!FHzO&EttJn~$-*ck1d|SGVn6-=7w=MnG=L^QMW#>QxHUxz2~$99LN1 zyTiImVV{nzvgY}uGdw~@O_$8Nw5A=Kb8bJQPlXqM!jlEn3=9kmp00i_>zopr0EMs` ArT_o{ diff --git a/assets/backgrounds/09grass.png b/assets/backgrounds/02_grass_00.png similarity index 100% rename from assets/backgrounds/09grass.png rename to assets/backgrounds/02_grass_00.png diff --git a/assets/backgrounds/08grass.png b/assets/backgrounds/02_grass_01.png similarity index 100% rename from assets/backgrounds/08grass.png rename to assets/backgrounds/02_grass_01.png diff --git a/assets/backgrounds/10grass.png b/assets/backgrounds/02_grass_02.png similarity index 100% rename from assets/backgrounds/10grass.png rename to assets/backgrounds/02_grass_02.png diff --git a/assets/backgrounds/07grass.png b/assets/backgrounds/02_grass_02s.png similarity index 100% rename from assets/backgrounds/07grass.png rename to assets/backgrounds/02_grass_02s.png diff --git a/assets/backgrounds/06grass.png b/assets/backgrounds/02_grass_03.png similarity index 100% rename from assets/backgrounds/06grass.png rename to assets/backgrounds/02_grass_03.png diff --git a/assets/backgrounds/13grass.png b/assets/backgrounds/03_grass_00.png similarity index 100% rename from assets/backgrounds/13grass.png rename to assets/backgrounds/03_grass_00.png diff --git a/assets/backgrounds/12grass.png b/assets/backgrounds/03_grass_01.png similarity index 100% rename from assets/backgrounds/12grass.png rename to assets/backgrounds/03_grass_01.png diff --git a/assets/backgrounds/11grass.png b/assets/backgrounds/03_grass_02.png similarity index 100% rename from assets/backgrounds/11grass.png rename to assets/backgrounds/03_grass_02.png diff --git a/assets/backgrounds/05grass.png b/assets/backgrounds/04_grass_00.png similarity index 100% rename from assets/backgrounds/05grass.png rename to assets/backgrounds/04_grass_00.png diff --git a/assets/backgrounds/02grass.png b/assets/backgrounds/05_grass_00.png similarity index 100% rename from assets/backgrounds/02grass.png rename to assets/backgrounds/05_grass_00.png diff --git a/assets/backgrounds/03grass.png b/assets/backgrounds/06_grass_00.png similarity index 100% rename from assets/backgrounds/03grass.png rename to assets/backgrounds/06_grass_00.png diff --git a/assets/backgrounds/04grass.png b/assets/backgrounds/07_grass_00.png similarity index 100% rename from assets/backgrounds/04grass.png rename to assets/backgrounds/07_grass_00.png diff --git a/assets/backgrounds/21sand.png b/assets/backgrounds/08_sand_00.png similarity index 100% rename from assets/backgrounds/21sand.png rename to assets/backgrounds/08_sand_00.png diff --git a/assets/backgrounds/20sand.png b/assets/backgrounds/09_sand_00.png similarity index 100% rename from assets/backgrounds/20sand.png rename to assets/backgrounds/09_sand_00.png diff --git a/assets/backgrounds/19sand.png b/assets/backgrounds/10_sand_00.png similarity index 100% rename from assets/backgrounds/19sand.png rename to assets/backgrounds/10_sand_00.png diff --git a/assets/backgrounds/18sand.png b/assets/backgrounds/11_sand_00.png similarity index 100% rename from assets/backgrounds/18sand.png rename to assets/backgrounds/11_sand_00.png diff --git a/assets/backgrounds/17sand.png b/assets/backgrounds/12_sand_00.png similarity index 100% rename from assets/backgrounds/17sand.png rename to assets/backgrounds/12_sand_00.png diff --git a/assets/backgrounds/16sand.png b/assets/backgrounds/13_sand_00.png similarity index 100% rename from assets/backgrounds/16sand.png rename to assets/backgrounds/13_sand_00.png diff --git a/assets/backgrounds/15sand.png b/assets/backgrounds/14_sand_00.png similarity index 100% rename from assets/backgrounds/15sand.png rename to assets/backgrounds/14_sand_00.png diff --git a/assets/backgrounds/14sand.png b/assets/backgrounds/15_sand_00.png similarity index 100% rename from assets/backgrounds/14sand.png rename to assets/backgrounds/15_sand_00.png diff --git a/assets/backgrounds/23tiles.png b/assets/backgrounds/16_tiles_00.png similarity index 100% rename from assets/backgrounds/23tiles.png rename to assets/backgrounds/16_tiles_00.png diff --git a/assets/backgrounds/22tiles.png b/assets/backgrounds/17_tiles_00.png similarity index 100% rename from assets/backgrounds/22tiles.png rename to assets/backgrounds/17_tiles_00.png diff --git a/assets/backgrounds/24tiles.png b/assets/backgrounds/18_tiles_00.png similarity index 100% rename from assets/backgrounds/24tiles.png rename to assets/backgrounds/18_tiles_00.png diff --git a/assets/backgrounds/25tiles.png b/assets/backgrounds/19_tiles_00.png similarity index 100% rename from assets/backgrounds/25tiles.png rename to assets/backgrounds/19_tiles_00.png diff --git a/assets/backgrounds/27cobble.png b/assets/backgrounds/20_cobble_00.png similarity index 100% rename from assets/backgrounds/27cobble.png rename to assets/backgrounds/20_cobble_00.png diff --git a/assets/backgrounds/26cobble.png b/assets/backgrounds/21_cobble_00.png similarity index 100% rename from assets/backgrounds/26cobble.png rename to assets/backgrounds/21_cobble_00.png diff --git a/assets/backgrounds/28cobble.png b/assets/backgrounds/22_cobble_00.png similarity index 100% rename from assets/backgrounds/28cobble.png rename to assets/backgrounds/22_cobble_00.png diff --git a/assets/backgrounds/29cobble.png b/assets/backgrounds/23_cobble_00.png similarity index 100% rename from assets/backgrounds/29cobble.png rename to assets/backgrounds/23_cobble_00.png diff --git a/assets/backgrounds/33resource.png b/assets/backgrounds/24_resource_00.png similarity index 100% rename from assets/backgrounds/33resource.png rename to assets/backgrounds/24_resource_00.png diff --git a/assets/backgrounds/32resource.png b/assets/backgrounds/25_resource_00.png similarity index 100% rename from assets/backgrounds/32resource.png rename to assets/backgrounds/25_resource_00.png diff --git a/assets/backgrounds/31resource.png b/assets/backgrounds/26_resource_00.png similarity index 100% rename from assets/backgrounds/31resource.png rename to assets/backgrounds/26_resource_00.png diff --git a/assets/backgrounds/30resource.png b/assets/backgrounds/27_resource_00.png similarity index 100% rename from assets/backgrounds/30resource.png rename to assets/backgrounds/27_resource_00.png diff --git a/assets/items/00iron_ore.png b/assets/items/00-iron_ore-00.png similarity index 100% rename from assets/items/00iron_ore.png rename to assets/items/00-iron_ore-00.png diff --git a/assets/items/01silver_ore.png b/assets/items/01-silver_ore-00.png similarity index 100% rename from assets/items/01silver_ore.png rename to assets/items/01-silver_ore-00.png diff --git a/assets/items/02gold_ore.png b/assets/items/02-gold_ore-00.png similarity index 100% rename from assets/items/02gold_ore.png rename to assets/items/02-gold_ore-00.png diff --git a/assets/items/03platinum_ore.png b/assets/items/03-platinum_ore-00.png similarity index 100% rename from assets/items/03platinum_ore.png rename to assets/items/03-platinum_ore-00.png diff --git a/assets/items/04iron_ingot.png b/assets/items/04-iron_ingot-00.png similarity index 100% rename from assets/items/04iron_ingot.png rename to assets/items/04-iron_ingot-00.png diff --git a/assets/items/05gold_ingot.png b/assets/items/05-gold_ingot-00.png similarity index 100% rename from assets/items/05gold_ingot.png rename to assets/items/05-gold_ingot-00.png diff --git a/assets/items/06platinum_ingot.png b/assets/items/06-platinum_ingot-00.png similarity index 100% rename from assets/items/06platinum_ingot.png rename to assets/items/06-platinum_ingot-00.png diff --git a/assets/items/07silver_ingot.png b/assets/items/07-silver_ingot-00.png similarity index 100% rename from assets/items/07silver_ingot.png rename to assets/items/07-silver_ingot-00.png diff --git a/assets/items/08log.png b/assets/items/08-log-00.png similarity index 100% rename from assets/items/08log.png rename to assets/items/08-log-00.png diff --git a/assets/tiles/0air.png b/assets/tiles/00_air_00.png similarity index 100% rename from assets/tiles/0air.png rename to assets/tiles/00_air_00.png diff --git a/assets/tiles/1blanker.png b/assets/tiles/01_blanker_00.png similarity index 100% rename from assets/tiles/1blanker.png rename to assets/tiles/01_blanker_00.png diff --git a/assets/tiles/2dopravnik.png b/assets/tiles/02_dopravnik_00.png similarity index 100% rename from assets/tiles/2dopravnik.png rename to assets/tiles/02_dopravnik_00.png diff --git a/assets/tiles/03_furnace_00.png b/assets/tiles/03_furnace_00.png new file mode 100644 index 0000000000000000000000000000000000000000..f944de7348b813226fa7257bffc1a9164d20768c GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V0hx` z;usRq`gZz7t|kMKw*M!mI5u5SE|LAhvG;%Nc|jJ|XJTcSXRc}UJNvKuPhQB4n|1Zu z<`!RhSCAw4Fmd*S>f3XY4yR4lHG0jlMN^xhA^X+!&vHBy?9XqNnsa8?ikW|z+}s&% z%?1_@Z8rL~ZQ!W>8T-REvd%y9? zK8II7VphkAA1iaOVQ<^?aOVx?7ga|z|HjLgu+K|a>$3lwO#CVa1_lOCS3j3^P6VBGEL z;usRqdUg74FJ?!Pw*4MGfy|7iDiac1be!MhG(|*aEYufRQ^WLj%eCbjCW&klOG;Gk z@I5ubsCSaWL2kiCPt>A({0^-%-l??v-`O)W=gyq_`R&b_#`B(D?aep&m1U;$Ek=3$ z>$EFDDN+rWynTP~xf!&6u0+-~`w7?OIhZbFUAdKd_mZQ{{4Z5*RgNVG^EYZ=6=RS$ z4Yl%L5d3lF)LWc0wg}B-RFDgMeCebX!^{|m+y57?;Rp{g7eCq%l6CcaBior@dvBFZ zey--}W9heGGef;X#~;DP8gti_Jz`K0o24W+>(z~wE)zl?egD%Ze4+k=U`l`EqvE~G zb$|V5@%jJ%;=f(n{+~NI^=KJCqa}CS)QY@MKMbqy7Vr7Y!giPO_scJD_+CsBI4^#E zo6fe_bHWqu=En$qlMp!n`(!0kkmU51BL^Oqu{0EIWH|8lvJFG^?p!7Dyu0jeS3fR0 z_0q^Pdv}H2Z)dBYTnB!phFSN2W^udA=$|LDry}C!GGoW22X^cGb)R#VY<_sq!^4i> z&U?3}y2(?;wATNyc|6mLdxEV;78Lz``-A;u Y`hxe4|G)P#FfcH9y85}Sb4q9e0IGfOivR!s literal 0 HcmV?d00001 diff --git a/assets/tiles/03_furnace_03.png b/assets/tiles/03_furnace_03.png new file mode 100644 index 0000000000000000000000000000000000000000..872f487e0c1d042202aaef0e3b2a18aa96611186 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V4Ume z;usRqdN=yVoswa16h}n2S9e!O@Bz>1N`72=|G4TK7r*-}D*KoFk(P+K`^y)L zBDyk`I!&43R$_7ginab;<1oD+I@7=a$|*NB58obII?&(>M*;GM;Nmq$i~0JMO*cv-d5- zv5p?m$2=+fIQzHFTxPvb=AHY+`fHk=w|k8f)~FVdQ&MBb@09#7WA^-pY literal 0 HcmV?d00001 diff --git a/assets/tiles/03_furnace_04.png b/assets/tiles/03_furnace_04.png new file mode 100644 index 0000000000000000000000000000000000000000..970416e0a7ceb07c8347ff48692e230c8f38dfb1 GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>VBG2H z;usRqdUyJM@52rv$M;W+O5zpy<2cnz`;m(4b{*G}!WTjR84Ew@7hH+_&!ztI#UlmT z7?GEkHa?Nx5aO~bXrYsjw$&W{r+vH4+@A97_x|)QR&S^Oy}i5Bb=T(BI4t@eci?7l zqx$P*S03GAVR-QF;`CqDwcl=S%iS1Y`LYgtc%s`-_6q5uhaP&?_Ybj?exv# z>gJc~{tba%a*Nf5V`A`ybpotLRYe7_&0XFD2xXzrwp+>VfZ;Yb>wVJ=W6I zQpaR}wqeTeqdqITI0J8Sw#X+~zbvrtSe&-k%H&aTo~M_qb>oeh9}2qXzSQDP>p#UD z{{3>${yL^Y;|CX2o2Q>Y@pp>2SlZ1q+4E|qzEn4`;B{Aad|s(=a_j1Ezt8?uXK*4UvqOt!J8fY_8{# TCE9%q3=9mOu6{1-oD!MVBGBK z;usRqdNq8b7qg>4t@`uAEC&OxDIJ0vCoPDbr4Xi>^N7D=YJ9@XE5G=grbgU~=xFU# zGSgID+M6WM>CqB=?sTWv>xwszk^x$f~+_xW#bWL{bJm-$9so(O{g+rR5Sj!8~<-n?z<%Z5igPM@^ZXJOd$ zBj?Kb1K-;Z{|iY`;QM?uk-=f*1GNaFJ2nPw)pC>1b~66@us3}vtMWSCtLycRuJf%c z^7t2~P^KE^_y{Fe^9(D*bF`K^hSMOFX z_4jXLJ>LG)XFeM>*pP=RnKSnG-pOvvXedY z{<95*0lk86c_O&4T3r_w622nbB`X+uc;y~uh8wxpf@D1^5A5mF(A5wQ>g!+4De^b{ zd*#bLb!?Z?91eZcR9+wQ;Oi5^Qn$;(XFi|a_GjA5bcI)KS7$7E!7Ae?f3EX&G>Y%^!Ze2*A9Ip!Dl5$Jxw2+)MV~3QZih~^*H|c{I)N18MRLzFkoO{ OVDNPHb6Mw<&;$Uo2Idn0 literal 0 HcmV?d00001 diff --git a/assets/tiles/03_furnace_06.png b/assets/tiles/03_furnace_06.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bd2a9195d51ceb0c6e1fd76827a64ffc2c1634 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V4Ume z;usRqdUv{^_hAQ-$r9emHdPgG{=Iqp3Czv%nBIKA(6$IT1aKeV?&GSy^ zhH85oGc^1=ApWi2`P;3PF^m5-@|-SXU`TvWKYeivv#VY16t2Aswq>ZkSt!oLaIYq8 zmAXKvk6G|MhgsLMHZwH1T^0JaeYPCKg3DVO8Or^8K1?vp-on1(QT6&D{xgwo+k_vT zxa?BxW!ad)H0^D}z7C}<^Sv2&85hK9E{@Z5FFRd&p{TxZ{hWq7OAT)nK|#NgQTjeD%_q*=x;Kb>R8tYmbh?&l5#8F$;pMd}YOvNm5| zVPvh#yy(RG>PLH*&U2WU|i;&jN&iRZrd zG8u+WZuH@GwR*p0HABg5-FsH0mfxSBVOj0NzA#_J#pmj>IQE6<3D?r^Xmg)Bu;bBU z<>$waojg$aZSv;1u0r0KNvoc131TSRI$d$&l(xEuUUR>{Qau~=E`0fklMSm?5XPup`@cJIGb&)mFn?HlEm2d^GJZRb!Fa4IOtTCi+e%(p*XAHrko%~pg; z3$HD_${^7goiNjET4c$ugfH99*`ydp^Ofv~Jyps6AvZueQ=$I$R`*!HAw_**KnQ9MrD>q9EpMTJ{K1u)J^7l*4&FWlV zOm|AbyUN17>@kilFKv{RO!hIPH0}BPuw0ynfq{X+)78&qol`;+0JRz8 A-~a#s literal 0 HcmV?d00001 diff --git a/assets/tiles/04_miner_02.png b/assets/tiles/04_miner_02.png new file mode 100644 index 0000000000000000000000000000000000000000..98c4e9a776d253896592dacfe637ecf4d1c90805 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|ito z;usRq`gYoW@52rv4f{o2#!q;l#Me5BZ>pajW3=PZn+MMxT^VBa%YMfWPBHcAd`Smw zH5T#Bj8Sn4zTzh;rBxEvUYzlMi~Xgri^mk@ZQd1CR=)rE?(S(vmm~I0C8?{9EGf=j z+L1TIXu`^cp3imfvo3gRUYU9I$!>dfv$#|%j_joxC5Pu!$+paEoZ0X-G4jH`HQ9_- zpY9%6!80dsfAJ?N_8 zd+zghKTg;1`n~34P)Jo>V0Oz%Q@Z_)Q~Il&rRk3?ODk)B%W6tJwV4;3{`Eu5 z+LgK!+>TA$B%~wCm38lA%-mOx^u)LKGb^}r3{o+rgn z{YI?9Pxid#O3NE_*A{=P4zlj)EwZy{@Na(Rq1-y#T<+caiEnqu?tJvKh=0RH?Pn*< z?6#Mh1W0Q&T$_7WvUd8m`z!&<7ffyJjdpNyyb=7nwqk~Wf&4OaLq}H$k(FkR=eBeF sjTgAfuCnkhdsP$1U|i_w z;usRq`gYoW@52rv4g1AD>Sq*8-g!(9%-r$ zaFI3IIfctN&^k0@<%LMua|?HFUg;UtZN~TWLB;gbr*|K(ejmrDr1VelkYuo`p1FCE ztI#Yx*_l#?J1e&bGcUNF`T17viSl~Cnk}bF1l-nX2+gwlYQL%`yj{Kvnp|F%Q9_Ec7=7{%slkhGzISndcL;IarK<}FGN;yWZd-4S>0l` z{YHJ+6Mdr>GrA^evq~zn_9kdAof;W&lR;|1`ALS?UWEDPtk&#*{~?WG%c;to)hB;_ zT$&xb)Imzp^_a)T7>yN`_C>z0ynn~swcpt$z@*6HzFaM;?DFM#@q&IXd%yj8oF8M# z@a%-hjWFTcS}QGQ{Jj#{e*cj5i7-p~HwUIW+Focpbl19{fBT7VcURx}P*lq>Lq%&> zzV!V2mLF|oPc`OUeRJBcH*Pua0+k06er#6eO$YuN-09lOW>>7gcjHHGC;R;5V4Uyi z;usRq`gYo0@52rv2kJ#X>Sq)PvM*fXeDtL11NIdb);o4uO!adA&n|9$@X?b?jv{xO zm0nFaxirMU^=-&PMW^&qi}ojei+^UgO1J-cP&obc>FWOS_i=niM*jp4O5MF?^Y$cRtU1-|u3#Nuh1c2Gdq4t$*pfzWIu=fz(F1X{~pbe~oGB ztGRBj#e95rzRX(xAPwCK*Go*j7?1qC#?^X>=|`(}Y22*kC9j^!&sCbrn42bgd)2~T z|LXJqet6gLX-!yoKun}pGvjFVsx? z)9=4osXM`Kl7>|9nNY2)cd6^n-hE^C+??O5MSw%`hPBDXv@qqjuA&e7cVye~{qbGE zcEINj)9tL}Xj4=6%eSqv%}tInWPdFxVvuM1dV@jh`uaQf;}ma~zkf1mdAIBVmHI{P z+dg*oHlLWhkf}g=nYop3m7lmnZ$o~Ck=YIjq3Xle!(`N4&K&;oOKla$Vx@Cm7a9w! s{Lj7VcZ15--wp~LCUetMmK?LraoY69UevRQfq{X+)78&qol`;+0DLLe?f?J) literal 0 HcmV?d00001 diff --git a/assets/tiles/04_miner_05.png b/assets/tiles/04_miner_05.png new file mode 100644 index 0000000000000000000000000000000000000000..c80d002629fa3553eab5dff73c9e5136a01ac027 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|i_w z;usRq`gYoW@52rv4f{L3=zA0hvM*fXeDtL11O639Zyr2*bY+OlU-_6jEZvj6*#iss z#RA)XV!c>{ulR6H}f6w+_b-Cq<6F=NJ)~lYHap#Uk z?!v5HB`Ss@J9pmBWxnv*?&F)XCwJx>o5iR~wglc1TD43)j(w$jf=!Bz2G^#u2ll=)$>!d-7g+}@(<+Ri=us@279=DlZ7d)4{x ztV4Ume z;usRq`gWS3_hAQ-hW%n6#Z`8AurFNFeCecWg6Jv>>m55SrgkmhI7*mL^n-QCl_-;3oF68a~&=)RJwuDE&k z?TlTDvYkCsV)ooFWOz|}%cflV)7|-#`NBHc62-Q+E|Z>k-SLg!j1Q9XqODh!f1J|a zS0gSZ+Bo^FdEa&8lyvcnCC;8V845RUbt)?p{MD*m8aKx{>guJ4-5#zE=hr{FCHiHh z<@=rb^(WKQ-Q3a?SS^d$r0z$r5m8&Xfyv~+43%`fi)$lylm+L-Z!K6Ib!h8s9r-!G zZv|^kaBDg-(^zN9=~eGt*Ll{~wRhiUZxP^7ykWoT!speE-~MzJ=)5}jxc@oN6^4jL z&4RaT>tX|IH|)7`vpU{sZV4Usg z;usRq`gYnzZ>B(r1NB}%#4EP6G%Gw$u-GcIq_MNuIof-&MBiV2-CV~@R~`v)zI7M6 zS`geVQ4wS*sUdC=e%Q3){nCdoGoP5=;g@@VxBC9?d&j@mzTeHx$oQY*cBZ$g4&U{n z)J0udJdsk0g*&e1Ga0=2Ua|RB(%bW#=fxuVwoTK%9q1ZcCHLc9qv-UXo^c$#XWC;@ zj?7A5!mjt-e&>zei5{t)TC3i;GQaudIL}3k+wT$A%name, tile.name); + memcpy(&item->animation, &tile.animation, sizeof(tile.animation)); + + for (int frame = 0; frame < item->animation.frameCount; frame++) { + for (int a = 0; a < ORIENT_DIRECTION_COUNT; a++) { + SDL_SetTextureBlendMode(item->animation.textures[a][frame], SDL_BLENDMODE_BLEND); + item->beltAnimation.textures[a][frame] = ScaleTexture(renderer, tile.animation.textures[a][frame], + TILE_SIZE / 2, TILE_SIZE / 2); + item->beltAnimation.atlasRects[a][frame] = allocate_16x16(item->beltAnimation.textures[a][frame], + renderer); + if (frame + 1 > item->beltAnimation.frameCount) { + item->beltAnimation.frameCount = frame + 1; + } + SDL_SetTextureBlendMode(item->beltAnimation.textures[a][frame], SDL_BLENDMODE_BLEND); + } } - ItemRegistry[itemRegistryIndex].type = itemRegistryIndex; - ItemRegistry[itemRegistryIndex].isTile = true; + + item->type = itemRegistryIndex; + item->isTile = true; + item->animation.divisor = 1; + item->beltAnimation.divisor = 1; itemRegistryIndex++; } - + // Skip ahead to avoid overlap (tile items use lower indices) itemRegistryIndex = ITEMREGISTRY_SIZE / 2; - iterateSortedDir("./assets/items", (DirEntryCallback) registerItem, renderer); -} \ No newline at end of file + // Load sprite-based items with animations + DIR *dir = opendir("./assets/items"); + if (!dir) { + perror("Failed to open item asset folder"); + return; + } + + struct dirent *entry; + while ((entry = readdir(dir)) != NULL) { + if (!strstr(entry->d_name, ".png")) continue; + + int frame, indexItem; + char name[64]; + + if (sscanf(entry->d_name, "%d-%20[^-]-%d.png", &indexItem, name, &frame) == 3) { + // Success: you now have index, fname, and frame + } else { + fprintf(stderr, "Invalid format: %s\n", entry->d_name); + } + indexItem += ITEMREGISTRY_SIZE / 2; + + Item *item; + item = &ItemRegistry[indexItem]; + memset(item, 0, sizeof(Item)); + strcpy(item->name, name); + item->type = indexItem; + item->isTile = false; + item->miscVal = 60; + item->animation.divisor = 1; + item->beltAnimation.divisor = 1; + + // Load the texture + char path[128]; + snprintf(path, sizeof(path), "./assets/items/%s", entry->d_name); + SDL_Texture *tex = IMG_LoadTexture(renderer, path); + if (!tex) { + fprintf(stderr, "Failed to load texture %s: %s\n", path, IMG_GetError()); + continue; + } + + SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND); + SDL_Texture *beltTex = ScaleTexture(renderer, tex, TILE_SIZE / 2, TILE_SIZE / 2); + SDL_SetTextureBlendMode(beltTex, SDL_BLENDMODE_BLEND); + + SDL_Rect mainRect = allocate_32x32(tex, renderer); + SDL_Rect beltRect = allocate_16x16(beltTex, renderer); + // Assign to all orientations + for (int o = 0; o < ORIENT_DIRECTION_COUNT; o++) { + item->animation.textures[o][frame] = tex; + item->beltAnimation.textures[o][frame] = beltTex; + item->animation.atlasRects[o][frame] = mainRect; + item->beltAnimation.atlasRects[o][frame] = beltRect; + if (frame + 1 > item->animation.frameCount) { + item->animation.frameCount = frame + 1; + item->beltAnimation.frameCount = frame + 1; + } + + } + item->animation.divisor = 1; + if (indexItem + 1 > itemRegistryIndex) { + itemRegistryIndex = indexItem + 1; + } + } + + closedir(dir); +} diff --git a/items/item.h b/items/item.h index d963ce3..ad4892f 100644 --- a/items/item.h +++ b/items/item.h @@ -42,10 +42,8 @@ typedef struct Item { ItemType type; char name[20]; uint16_t miscVal; - SDL_Texture * texture[ORIENT_DIRECTION_COUNT]; - SDL_Texture * textureOnBelt[ORIENT_DIRECTION_COUNT]; - SDL_Rect atlasRects[ORIENT_DIRECTION_COUNT]; - SDL_Rect atlasRectsOnBelt[ORIENT_DIRECTION_COUNT]; + OrientedAnimation animation; + OrientedAnimation beltAnimation; } Item; diff --git a/main.c b/main.c index 994c735..db90671 100644 --- a/main.c +++ b/main.c @@ -139,6 +139,7 @@ int init() { initAtlas(mainRenderer); + loadBackgroundTiles(mainRenderer); loadTiles(mainRenderer); loadItems(mainRenderer); setupTiles(); @@ -506,6 +507,9 @@ void processKeyboardHeld() { setActivePlayerSlot(&player, 0); } } + if (keyboardState[SDL_SCANCODE_F9]) { + player.inventory.slotCounts[player.inventory.activeSlotIndex]++; + } if (keyboardState[SDL_SCANCODE_Y]) { if (player.cursor.canReach && player.cursor.targetTile->type == TYPE_BELT && player.inventory.slotCounts[player.inventory.activeSlotIndex] > 0) { @@ -586,6 +590,7 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[]) updateItems(); updatePlayer(&player); updateTiles(); + animationStep++; status = render(); if (status) { return status; @@ -655,15 +660,15 @@ void genInitMap() { // [Same as your original terrain generation logic...] BackgroundType baseType; if (terrain < 0.30) { - baseType = (humidity < 0.5) ? BGType_WATER0 : BGType_WATER1; + baseType = (humidity < 0.5) ? BGType_WATER_SHALLOW : BGType_WATER_DEEP; } else if (terrain < 0.35) { if (humidity < 0.3) baseType = BGType_SAND4; else if (humidity < 0.6) baseType = BGType_SAND2; else baseType = BGType_SAND7; } else if (terrain < 0.7) { double grassVal = (terrain - 0.35) / (0.70 - 0.35); - int idx = (int) (grassVal * 8.0); - if (idx >= 8) idx = 7; + int idx = (int) (grassVal * 3.0); + if (idx >= 4) idx = 3; if (humidity > 0.6 && ((rand() & 0xFF) < 10)) { int flowerIdx = rand() % 4; baseType = (BackgroundType) (BGType_GRASS_FLOWER0 + flowerIdx); @@ -679,7 +684,7 @@ void genInitMap() { } BackgroundType finalType = baseType; - if (baseType != BGType_WATER0 && baseType != BGType_WATER1) { + if (baseType != BGType_WATER_SHALLOW && baseType != BGType_WATER_DEEP) { if (oreNrm > 0.86) { double sub = (oreNrm - 0.86) / (1.0 - 0.86); if (sub < 0.25) finalType = BGType_PLATINUM_ORE; diff --git a/player/player.c b/player/player.c index 6b74a74..a9109fc 100644 --- a/player/player.c +++ b/player/player.c @@ -179,9 +179,9 @@ void renderPlayer(Player *plr) { plr->cursor.heldItemRect.x = plr->cursor.windowX; plr->cursor.heldItemRect.y = plr->cursor.windowY; //itemTex = ItemRegistry[itemIndex].textureOnBelt[plr->cursor.direction]; - SDL_Rect itemAtlasRect = ItemRegistry[itemIndex].atlasRects[plr->cursor.direction]; + SDL_Rect itemAtlasRect = ItemRegistry[itemIndex].animation.atlasRects[plr->cursor.direction][(animationStep / ItemRegistry[itemIndex].animation.divisor) % ItemRegistry[itemIndex].animation.frameCount]; if (itemAtlasRect.w == 0 || itemAtlasRect.h == 0) { - itemAtlasRect = ItemRegistry[itemIndex].atlasRects[ORIENT_LEFT]; + itemAtlasRect = ItemRegistry[itemIndex].animation.atlasRects[ORIENT_LEFT][(animationStep / ItemRegistry[itemIndex].animation.divisor) % ItemRegistry[itemIndex].animation.frameCount]; } if (itemAtlasRect.w != 0 && itemAtlasRect.h != 0) { @@ -197,8 +197,10 @@ void renderPlayer(Player *plr) { // } // SDL_RenderCopy(mainRenderer, itemTex, NULL, // &plr->cursor.heldItemRect); + char nameItem[80]; + snprintf(nameItem, 80, "%s\n%s", ItemRegistry[itemIndex].name, OrientStrings[plr->cursor.direction]); SDL_RenderCopy(mainRenderer, atlasTexture, &itemAtlasRect, &plr->cursor.heldItemRect); - renderText(mainRenderer, fonts[2], ItemRegistry[itemIndex].name, plr->cursor.heldItemRect.x, + renderText(mainRenderer, fonts[2], nameItem, plr->cursor.heldItemRect.x, plr->cursor.heldItemRect.y - (fonts[2].size * 3 / 2)); } } @@ -223,9 +225,12 @@ void renderPlayer(Player *plr) { SDL_SetTextureBlendMode(atlasTexture, SDL_BLENDMODE_ADD); for (ItemType i = 0; i < ITEMREGISTRY_SIZE; i++) { - SDL_Rect itemAtlasRectd = ItemRegistry[i].atlasRects[plr->cursor.direction]; + if (ItemRegistry[i].name[0] == 0x00) { + continue; + } + SDL_Rect itemAtlasRectd = ItemRegistry[i].animation.atlasRects[plr->cursor.direction][(animationStep / ItemRegistry[i].animation.divisor) % ItemRegistry[i].animation.frameCount]; if (itemAtlasRectd.w == 0 || itemAtlasRectd.h == 0) { - itemAtlasRectd = ItemRegistry[i].atlasRects[ORIENT_LEFT]; + itemAtlasRectd = ItemRegistry[i].animation.atlasRects[ORIENT_LEFT][(animationStep / ItemRegistry[i].animation.divisor) % ItemRegistry[i].animation.frameCount]; } if (itemAtlasRectd.w != 0 && itemAtlasRectd.h != 0) { // if (plr->inventory.slotCounts[i] <= 0) { diff --git a/tiles/belt.c b/tiles/belt.c index ccd4165..1b09468 100644 --- a/tiles/belt.c +++ b/tiles/belt.c @@ -10,63 +10,97 @@ #include "../items/item.h" #include "../util/atlas.h" +void generateBeltFrames(SDL_Renderer *renderer) { + SDL_Texture *baseTexture = TileRegistry[TYPE_BELT].animation.textures[ORIENT_LEFT][0]; // Base belt tile + SDL_Texture *oldTarget = SDL_GetRenderTarget(renderer); + const int frameCount = TILE_SIZE; // 32 frames, 1px per frame = full seamless loop + + for (OrientDirection dir = ORIENT_LEFT_DOWN; dir < ORIENT_DIRECTION_COUNT; dir++) { + double angle = 0.0; + bool isHorizontal = true; + bool reverse = false; + + switch (dir) { + case ORIENT_LEFT: + angle = 0; + isHorizontal = true; + reverse = false; + break; + case ORIENT_UP: + angle = 90; + isHorizontal = false; + reverse = false; + break; + case ORIENT_RIGHT: + angle = 180; + isHorizontal = true; + reverse = true; + break; + case ORIENT_DOWN: + angle = 270; + isHorizontal = false; + reverse = true; + break; + default: + continue; // skip diagonals or unsupported directions + } + + // Step 1: Rotate the tile once + SDL_Texture *rotated = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, TILE_SIZE, TILE_SIZE); + SDL_SetTextureBlendMode(rotated, SDL_BLENDMODE_BLEND); + SDL_SetRenderTarget(renderer, rotated); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + + SDL_Rect full = {0, 0, TILE_SIZE, TILE_SIZE}; + SDL_RenderCopyEx(renderer, baseTexture, NULL, &full, angle, NULL, SDL_FLIP_NONE); + + // Step 2: For each frame, render 2 rotated tiles with wrapping offset + for (int f = 0; f < frameCount; f++) { + SDL_Texture *frame = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, TILE_SIZE, TILE_SIZE); + SDL_SetTextureBlendMode(frame, SDL_BLENDMODE_BLEND); + SDL_SetRenderTarget(renderer, frame); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + + int offset = reverse ? (TILE_SIZE - f) % TILE_SIZE : f; + + SDL_Rect dst1, dst2; + if (isHorizontal) { + dst1 = (SDL_Rect) {-offset, 0, TILE_SIZE, TILE_SIZE}; + dst2 = (SDL_Rect) {TILE_SIZE - offset, 0, TILE_SIZE, TILE_SIZE}; + } else { + dst1 = (SDL_Rect) {0, -offset, TILE_SIZE, TILE_SIZE}; + dst2 = (SDL_Rect) {0, TILE_SIZE - offset, TILE_SIZE, TILE_SIZE}; + } + + SDL_RenderCopy(renderer, rotated, NULL, &dst1); + SDL_RenderCopy(renderer, rotated, NULL, &dst2); + + TileRegistry[TYPE_BELT].animation.textures[dir][f] = frame; + TileRegistry[TYPE_BELT].animation.atlasRects[dir][f] = allocate_32x32(frame, renderer); + } + + SDL_DestroyTexture(rotated); + TileRegistry[TYPE_BELT].animation.frameCount = frameCount; + TileRegistry[TYPE_BELT].animation.divisor = 1; + } + + SDL_SetRenderTarget(renderer, oldTarget); +} + void renderBelt(int x, int y, int w, int h, OrientDirection dir, SDL_Rect playerRect, SDL_Renderer *renderer) { int px = x * TILE_SIZE; int py = y * TILE_SIZE; - Tile *t = &tileMap[y][x]; - - ItemType tileType = t->type; - - SDL_Rect src1, src2, dst1, dst2; - - if (dir == ORIENT_LEFT || dir == ORIENT_RIGHT) { - int offset = scrollFrame % TILE_SIZE; - - if (dir == ORIENT_RIGHT) { - offset = TILE_SIZE - offset; // reverse scroll - } - - src1 = (SDL_Rect) {offset, 0, TILE_SIZE - offset, TILE_SIZE}; - dst1 = (SDL_Rect) {px, py, (w - offset), h}; - - src2 = (SDL_Rect) {0, 0, offset, TILE_SIZE}; - dst2 = (SDL_Rect) {px + (w - offset), py, offset, h}; - - adjustRect(&dst1, playerRect); - adjustRect(&dst2, playerRect); - - SDL_RenderCopy(renderer, TileRegistry[tileType].textures[dir], &src1, &dst1); //TODO CONVERT TO ATLAS - SDL_RenderCopy(renderer, TileRegistry[tileType].textures[dir], &src2, &dst2); //TODO CONVERT TO ATLAS -// SDL_RenderCopyx(renderer, atlasTexture, &TileRegistry[tileType].atlasRects[dir], NULL); -// SDL_RenderCopyx(renderer, atlasTexture, &TileRegistry[tileType].atlasRects[dir], NULL); - } else { - int offset = scrollFrame % TILE_SIZE; - - if (dir == ORIENT_DOWN) { - offset = TILE_SIZE - offset; // reverse scroll - } - - src1 = (SDL_Rect) {0, offset, TILE_SIZE, TILE_SIZE - offset}; - dst1 = (SDL_Rect) {px, py, w, h - offset}; - - src2 = (SDL_Rect) {0, 0, TILE_SIZE, offset}; - dst2 = (SDL_Rect) {px, py + (h - offset), w, offset}; - - adjustRect(&dst1, playerRect); - adjustRect(&dst2, playerRect); - - - // Rotate to make the belt vertical -// SDL_RenderCopyx(renderer, atlasTexture, &ItemRegistry[item.type].atlasRectsOnBelt[ORIENT_LEFT], NULL); -// SDL_RenderCopyx(renderer, atlasTexture, &ItemRegistry[item.type].atlasRectsOnBelt[ORIENT_LEFT], NULL); - - SDL_RenderCopy(renderer, TileRegistry[tileType].textures[dir], &src1, &dst1); - SDL_RenderCopy(renderer, TileRegistry[tileType].textures[dir], &src2, &dst2); - } -} - -void updateBelt(Tile * tile) { + SDL_Rect dst = {px, py, w, h}; + adjustRect(&dst, playerRect); + SDL_RenderCopy(renderer, atlasTexture, &TileRegistry[TYPE_BELT].animation.atlasRects[dir][ + (animationStep / TileRegistry[TYPE_BELT].animation.divisor) % + TileRegistry[TYPE_BELT].animation.frameCount], + &dst); } \ No newline at end of file diff --git a/tiles/belt.h b/tiles/belt.h index 6573d73..27f347b 100644 --- a/tiles/belt.h +++ b/tiles/belt.h @@ -11,8 +11,7 @@ struct Tile; -void renderBelt(int x, int y, int w, int h, OrientDirection dir, SDL_Rect playerRect, SDL_Renderer *renderer); - -void updateBelt(struct Tile * tile); +void generateBeltFrames(SDL_Renderer *renderer); + void renderBelt(int x, int y, int w, int h, OrientDirection dir, SDL_Rect playerRect, SDL_Renderer *renderer); #endif //FACTORYGAME_BELT_H diff --git a/tiles/furnace.c b/tiles/furnace.c index e10ebac..8cf38ac 100644 --- a/tiles/furnace.c +++ b/tiles/furnace.c @@ -25,6 +25,13 @@ void updateFurnace(Tile *tile) { if (targetOutItemType != TYPE_AIR) { if (tile->miscVal == 0) { + if (outItem->type != TYPE_AIR) { + if (tile->audioCh < NUM_SYNTH_VOICES) { + audioData.synthVoices[tile->audioCh].volume = 0; + } + tile->fixedFrame = 1; + return; + } tile->audioCh = getAvailableChannel(); if (tile->audioCh < NUM_SYNTH_VOICES) { audioData.synthVoices[tile->audioCh].volume = 255; @@ -34,6 +41,7 @@ void updateFurnace(Tile *tile) { audioData.synthVoices[tile->audioCh].waveform = WAVE_SINE; audioData.synthVoices[tile->audioCh].frequency = 200; } + tile->fixedFrame = 0; } ++audioData.synthVoices[tile->audioCh].frequency; if (audioData.synthVoices[tile->audioCh].volume < 255) { @@ -43,10 +51,13 @@ void updateFurnace(Tile *tile) { if (tile->audioCh < NUM_SYNTH_VOICES) { audioData.synthVoices[tile->audioCh].volume = 0; } + tile->fixedFrame = 1; tile->miscVal = 0; inItem->type = 0; outItem->type = targetOutItemType; outItem->offset = -0.5f; } + } else { + tile->fixedFrame = 1; } } \ No newline at end of file diff --git a/tiles/miner.c b/tiles/miner.c index 61e54e5..61ec5f3 100644 --- a/tiles/miner.c +++ b/tiles/miner.c @@ -23,6 +23,7 @@ void updateMiner(Tile *tile) { if (targetOutItemType != TYPE_AIR && outItem->type == 0) { if (tile->miscVal == 0) { tile->audioCh = getAvailableChannel(); + tile->fixedFrame = 0; if (tile->audioCh < NUM_SYNTH_VOICES) { audioData.synthVoices[tile->audioCh].volume = 64; audioData.synthVoices[tile->audioCh].phase = 0; @@ -36,9 +37,12 @@ void updateMiner(Tile *tile) { if (tile->audioCh < NUM_SYNTH_VOICES) { audioData.synthVoices[tile->audioCh].volume = 0; } + tile->fixedFrame = 1; tile->miscVal = 0; outItem->type = targetOutItemType; outItem->offset = -0.5f; } + } else { + tile->fixedFrame = 1; } } \ No newline at end of file diff --git a/tiles/tile.c b/tiles/tile.c index c8ba568..e28e07c 100644 --- a/tiles/tile.c +++ b/tiles/tile.c @@ -2,6 +2,7 @@ // Created by bruno on 4/24/25. // +#include #include "tile.h" #include "../player/player.h" #include "furnace.h" @@ -73,57 +74,189 @@ void generateTestMap() { } -void registerTile(char name[20], SDL_Renderer *renderer) { - const char *dot = strchr(name, '.'); - memcpy(TileRegistry[tileTypeIndex].name, name, dot - name); +void registerTile(char fname[20], SDL_Renderer *renderer) { + + char name[21]; + + // Load animation frames + int frame = 0; + int indexTile = 0; char texturePath[80]; - snprintf(texturePath, 80, "./assets/tiles/%s", name); + + if (sscanf(fname, "%d_%20[^_]_%d.png", &indexTile, name, &frame) == 3) { + // Success: you now have index, fname, and frame + } else { + fprintf(stderr, "Invalid format: %s\n", fname); + } + strcpy(TileRegistry[indexTile].name, name); + snprintf(texturePath, sizeof(texturePath), "./assets/tiles/%s", fname); + SDL_Texture *texture = IMG_LoadTexture(renderer, texturePath); - TileRegistry[tileTypeIndex].textures[ORIENT_LEFT] = texture; - TileRegistry[tileTypeIndex].textures[ORIENT_RIGHT] = createFlippedTexture(renderer, texture, SDL_FLIP_HORIZONTAL); - TileRegistry[tileTypeIndex].textures[ORIENT_UP] = createRotatedTexture(renderer, texture, 90); - TileRegistry[tileTypeIndex].textures[ORIENT_DOWN] = createRotatedTexture(renderer, texture, 270); - SDL_SetTextureBlendMode(TileRegistry[tileTypeIndex].textures[ORIENT_LEFT], SDL_BLENDMODE_BLEND); - SDL_SetTextureBlendMode(TileRegistry[tileTypeIndex].textures[ORIENT_RIGHT], SDL_BLENDMODE_BLEND); - SDL_SetTextureBlendMode(TileRegistry[tileTypeIndex].textures[ORIENT_UP], SDL_BLENDMODE_BLEND); - SDL_SetTextureBlendMode(TileRegistry[tileTypeIndex].textures[ORIENT_DOWN], SDL_BLENDMODE_BLEND); + if (!texture) { + // Stop loading frames if the first one fails, or after all valid ones are added + if (frame == 0) { + fprintf(stderr, "Failed to load tile texture %s: %s\n", texturePath, IMG_GetError()); + } + } - TileRegistry[tileTypeIndex].atlasRects[ORIENT_LEFT] = allocate_32x32( - TileRegistry[tileTypeIndex].textures[ORIENT_LEFT], renderer); - TileRegistry[tileTypeIndex].atlasRects[ORIENT_RIGHT] = allocate_32x32( - TileRegistry[tileTypeIndex].textures[ORIENT_RIGHT], renderer); - TileRegistry[tileTypeIndex].atlasRects[ORIENT_UP] = allocate_32x32(TileRegistry[tileTypeIndex].textures[ORIENT_UP], - renderer); - TileRegistry[tileTypeIndex].atlasRects[ORIENT_DOWN] = allocate_32x32( - TileRegistry[tileTypeIndex].textures[ORIENT_DOWN], renderer); + for (int o = 0; o < ORIENT_DIRECTION_COUNT; o++) { + SDL_Texture *textures[ORIENT_DIRECTION_COUNT] = { + NULL, + texture, + NULL, + createFlippedTexture(renderer, texture, SDL_FLIP_HORIZONTAL), + NULL, + createRotatedTexture(renderer, texture, 90), + NULL, + createRotatedTexture(renderer, texture, 270) + }; - TileRegistry[tileTypeIndex].type = tileTypeIndex; - TileRegistry[tileTypeIndex].breakTime = 15; + printf("Bound %s to %d orient %s\n", fname, indexTile, OrientStrings[o]); + TileRegistry[indexTile].animation.textures[o][frame] = textures[o]; + SDL_SetTextureBlendMode(textures[o], SDL_BLENDMODE_BLEND); + TileRegistry[indexTile].animation.atlasRects[o][frame] = allocate_32x32(textures[o], renderer); + } - tileTypeIndex++; + TileRegistry[indexTile].type = indexTile; + TileRegistry[indexTile].animation.frameCount = frame + 1; + TileRegistry[indexTile].animation.divisor = 1; + + TileRegistry[indexTile].type = tileTypeIndex; + TileRegistry[indexTile].breakTime = 15; + + if (indexTile + 1 > tileTypeIndex) { + tileTypeIndex = indexTile + 1; + } } -void registerBackgroundTile(char name[20], SDL_Renderer *renderer) { - const char *dot = strchr(name, '.'); - memcpy(BackgroundTileRegistry[backgroundTileTypeIndex].name, name, dot - name); + +void registerBackgroundTile(char fname[20], SDL_Renderer *renderer) { + char name[21]; + + // Load animation frames + int frame = 0; + int indexBgTile = 0; char texturePath[80]; - snprintf(texturePath, 80, "./assets/backgrounds/%s", name); + + if (sscanf(fname, "%d_%20[^_]_%d.png", &indexBgTile, name, &frame) == 3) { + // Success: you now have index, fname, and frame + } else { + fprintf(stderr, "Invalid format: %s\n", fname); + } + strcpy(BackgroundTileRegistry[indexBgTile].name, name); + snprintf(texturePath, sizeof(texturePath), "./assets/backgrounds/%s", fname); SDL_Texture *texture = IMG_LoadTexture(renderer, texturePath); - BackgroundTileRegistry[backgroundTileTypeIndex].texture = texture; - SDL_SetTextureBlendMode(BackgroundTileRegistry[backgroundTileTypeIndex].texture, SDL_BLENDMODE_NONE); - BackgroundTileRegistry[backgroundTileTypeIndex].atlasRect = allocate_32x32( - BackgroundTileRegistry[backgroundTileTypeIndex].texture, renderer); + if (!texture) { + if (frame == 0) { + fprintf(stderr, "Failed to load background texture %s: %s\n", texturePath, IMG_GetError()); + } + } - BackgroundTileRegistry[backgroundTileTypeIndex].type = backgroundTileTypeIndex; + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE); - backgroundTileTypeIndex++; + printf("Bound %s to %d\n", fname, indexBgTile); + + BackgroundTileRegistry[indexBgTile].animation.textures[frame] = texture; + BackgroundTileRegistry[indexBgTile].animation.atlasRects[frame] = allocate_32x32(texture, renderer); + + BackgroundTileRegistry[indexBgTile].type = indexBgTile; + BackgroundTileRegistry[indexBgTile].animation.frameCount = frame + 1; + BackgroundTileRegistry[indexBgTile].animation.divisor = 1; + + if (indexBgTile + 1 > backgroundTileTypeIndex) { + backgroundTileTypeIndex = indexBgTile + 1; + } } +int compareStrings(const void *a, const void *b) { + const char *strA = *(const char **) a; + const char *strB = *(const char **) b; + return strcmp(strA, strB); +} void loadTiles(SDL_Renderer *renderer) { - iterateSortedDir("./assets/tiles", (DirEntryCallback) registerTile, renderer); - iterateSortedDir("./assets/backgrounds", (DirEntryCallback) registerBackgroundTile, renderer); + DIR *dir = opendir("./assets/tiles"); + if (!dir) { + perror("Failed to open tiles directory"); + return; + } + char *baseNames[MAX_BASE_NAMES]; + int baseNameCount = 0; + + struct dirent *entry; + while ((entry = readdir(dir))) { + char *dot = strrchr(entry->d_name, '.'); + if (!dot || strcmp(dot, ".png") != 0) continue; + + // Check if baseName already stored + int found = 0; + for (int i = 0; i < baseNameCount; ++i) { + if (strcmp(baseNames[i], entry->d_name) == 0) { + found = 1; + break; + } + } + + if (!found && baseNameCount < MAX_BASE_NAMES) { + baseNames[baseNameCount++] = strdup(entry->d_name); // Only store base, not full file name + } + } + closedir(dir); + + qsort(baseNames, baseNameCount, sizeof(char *), compareStrings); + + // Call registerTile on each base name + for (int i = 0; i < baseNameCount; ++i) { + char fileName[64]; + snprintf(fileName, sizeof(fileName), "%s", baseNames[i]); + registerTile(fileName, renderer); + free(baseNames[i]); + } + generateBeltFrames(renderer); + +} + + +void loadBackgroundTiles(SDL_Renderer *renderer) { + DIR *dir = opendir("./assets/backgrounds"); + if (!dir) { + perror("Failed to open backgrounds directory"); + return; + } + + char *baseNames[MAX_BASE_NAMES]; + int baseNameCount = 0; + + struct dirent *entry; + while ((entry = readdir(dir))) { + char *dot = strrchr(entry->d_name, '.'); + if (!dot || strcmp(dot, ".png") != 0) continue; + + // Check if baseName already stored + int found = 0; + for (int i = 0; i < baseNameCount; ++i) { + if (strcmp(baseNames[i], entry->d_name) == 0) { + found = 1; + break; + } + } + + if (!found && baseNameCount < MAX_BASE_NAMES) { + baseNames[baseNameCount++] = strdup(entry->d_name); // Only store base, not full file name + } + } + closedir(dir); + + qsort(baseNames, baseNameCount, sizeof(char *), compareStrings); + + // Call registerBackgroundTile on each base name + for (int i = 0; i < baseNameCount; ++i) { + char fileName[64]; + snprintf(fileName, sizeof(fileName), "%s", baseNames[i]); + registerBackgroundTile(fileName, renderer); + free(baseNames[i]); + } } void setupTiles() { @@ -144,10 +277,19 @@ void setupTiles() { } } TileRegistry[TYPE_FURNACE].outputLane[FURNACE_OUTPUT_SLOT] = 1; + TileRegistry[TYPE_FURNACE].startFrame = 1; TileRegistry[TYPE_FURNACE].needsTicks = true; + TileRegistry[TYPE_FURNACE].animation.divisor = 8; TileRegistry[TYPE_BELT].needsTicks = true; TileRegistry[TYPE_MINER].needsTicks = true; TileRegistry[TYPE_MINER].outputLane[MINER_OUTPUT_SLOT] = 1; + TileRegistry[TYPE_MINER].startFrame = 1; + + BackgroundTileRegistry[BGType_WATER_DEEP].animation.divisor = 16; + BackgroundTileRegistry[BGType_WATER_SHALLOW].animation.divisor = 12; + BackgroundTileRegistry[BGType_GRASS_FLOWER0].animation.divisor = 16; + BackgroundTileRegistry[BGType_GRASS_FLOWER1].animation.divisor = 16; + BackgroundTileRegistry[BGType_GRASS_FLOWER2].animation.divisor = 16; } uint16_t getBreakTime(int type) { @@ -205,8 +347,11 @@ void renderAllTiles(SDL_Renderer *renderer, SDL_Rect playerRect) { adjustRect(&dstRect, playerRect); BackgroundTile bt = backgroundMap[y][x]; - SDL_Texture *tex = BackgroundTileRegistry[bt.type].texture; - SDL_Rect atlRect = BackgroundTileRegistry[bt.type].atlasRect; + SDL_Texture *tex = BackgroundTileRegistry[bt.type].animation.textures[animationStep % + BackgroundTileRegistry[bt.type].animation.frameCount]; + SDL_Rect atlRect = BackgroundTileRegistry[bt.type].animation.atlasRects[ + (animationStep / BackgroundTileRegistry[bt.type].animation.divisor) % + BackgroundTileRegistry[bt.type].animation.frameCount]; if (atlRect.w != 0 && atlRect.h != 0) { SDL_RenderCopy(renderer, atlasTexture, &atlRect, &dstRect); //SDL_RenderCopy(renderer, tex, NULL, &dstRect); @@ -237,11 +382,18 @@ void renderAllTiles(SDL_Renderer *renderer, SDL_Rect playerRect) { renderBelt(x, y, tileSize, tileSize, t.direction, playerRect, renderer); break; default: { - SDL_Rect atlRect = TileRegistry[t.type].atlasRects[t.direction]; - SDL_Texture *tex = TileRegistry[t.type].textures[t.direction]; + char animationFrame = ((animationStep / TileRegistry[t.type].animation.divisor) % + (TileRegistry[t.type].animation.frameCount - + TileRegistry[t.type].startFrame)) + TileRegistry[t.type].startFrame; + if (t.fixedFrame > 0) { + animationFrame = t.fixedFrame - 1; + } + SDL_Rect atlRect = TileRegistry[t.type].animation.atlasRects[t.direction][animationFrame]; + SDL_Texture *tex = TileRegistry[t.type].animation.textures[t.direction][animationFrame]; if (atlRect.w == 0 || atlRect.h == 0) { - tex = TileRegistry[t.type].textures[ORIENT_LEFT]; - atlRect = TileRegistry[t.type].atlasRects[ORIENT_LEFT]; + tex = TileRegistry[t.type].animation.textures[ORIENT_LEFT][animationFrame]; + atlRect = TileRegistry[t.type].animation.atlasRects[ORIENT_LEFT][ + animationFrame]; } if (atlRect.w != 0 && atlRect.h != 0) { //SDL_RenderCopy(renderer, tex, NULL, &dstRect); diff --git a/tiles/tile.h b/tiles/tile.h index d9f7ce4..a3f4d65 100644 --- a/tiles/tile.h +++ b/tiles/tile.h @@ -49,20 +49,14 @@ extern unsigned long beltFrames; #define ItemSlotCount 4 typedef enum BackgroundType { - BGType_WATER0, - BGType_WATER1, - BGType_GRASS0, - BGType_GRASS1, - BGType_GRASS2, - BGType_GRASS3, - BGType_GRASS4, - BGType_GRASS5, - BGType_GRASS6, - BGType_GRASS7, + BGType_WATER_SHALLOW, + BGType_WATER_DEEP, BGType_GRASS_FLOWER0, BGType_GRASS_FLOWER1, BGType_GRASS_FLOWER2, - BGType_GRASS_FLOWER3, + BGType_GRASS0, + BGType_GRASS1, + BGType_GRASS2, BGType_SAND0, BGType_SAND1, BGType_SAND2, @@ -86,23 +80,25 @@ typedef enum BackgroundType { BGType_END } BackgroundType; +#define MAX_BASE_NAMES 512 +#define MAX_ANIMATION_FRAMES 32 + typedef struct TileTypeReg { ItemType type; char name[20]; - SDL_Texture *textures[ORIENT_DIRECTION_COUNT]; - SDL_Rect atlasRects[ORIENT_DIRECTION_COUNT]; + OrientedAnimation animation; uint16_t breakTime; bool itemMoves; bool allowedInItems[ItemSlotCount][ITEMREGISTRY_SIZE]; bool outputLane[ItemSlotCount]; bool needsTicks; + char startFrame; } TileTypeReg; typedef struct BackgroundTileType { ItemType type; char name[20]; - SDL_Texture *texture; - SDL_Rect atlasRect; + Animation animation; } BackgroundTileType; typedef struct BackgroundTile { @@ -127,6 +123,7 @@ typedef struct Tile { uint16_t audioCh; MiniRect rect; int neededUpdateIndex; + char fixedFrame; } Tile; @@ -138,6 +135,8 @@ void setupTiles(); void generateTestMap(); +void loadBackgroundTiles(SDL_Renderer *renderer); + void loadTiles(SDL_Renderer *renderer); extern uint16_t tileTypeIndex; diff --git a/tiles/tilecallbacks.c b/tiles/tilecallbacks.c index ecd1ee2..64d6193 100644 --- a/tiles/tilecallbacks.c +++ b/tiles/tilecallbacks.c @@ -9,7 +9,7 @@ const UpdateTileCallback ItemTileCallbacks[TILEREGISTRY_SIZE] = { [TYPE_AIR] = NULL, [TYPE_BLOCK] = NULL, - [TYPE_BELT] = updateBelt, + [TYPE_BELT] = NULL, [TYPE_FURNACE] = updateFurnace, [TYPE_MINER] = updateMiner }; \ No newline at end of file diff --git a/util/atlas.c b/util/atlas.c index f839269..2d54609 100644 --- a/util/atlas.c +++ b/util/atlas.c @@ -10,7 +10,6 @@ SDL_Texture *atlasTexture; int tileIndex16 = 0, quadrantIndex16 = 0; int tileIndex32 = 0; -#define MAX_RECTS 256 int allocatedRectCount = 0; SDL_Rect allocatedRects[MAX_RECTS]; diff --git a/util/atlas.h b/util/atlas.h index 85b4a3f..5d79913 100644 --- a/util/atlas.h +++ b/util/atlas.h @@ -5,7 +5,8 @@ #ifndef FACTORYGAME_ATLAS_H #define FACTORYGAME_ATLAS_H -#define ATLAS_SIZE 512 +#define ATLAS_SIZE 1024 +#define MAX_RECTS 2048 #define TILE_SIZE 32 #define QUADRANT_SIZE 16 #define ATLAS_TILES_PER_ROW (ATLAS_SIZE / TILE_SIZE) diff --git a/util/util.c b/util/util.c index a08f080..f6c3ba7 100644 --- a/util/util.c +++ b/util/util.c @@ -11,6 +11,19 @@ SDL_Window *window = NULL; volatile bool running = true; +const char OrientStrings[ORIENT_DIRECTION_COUNT][10] = { + "LEFT_DOWN", + "LEFT", + "LEFT_UP", + "UP", + "RIGHT_UP", + "RIGHT", + "RIGHT_DOWN", + "DOWN", +}; + +int animationStep = 0; + bool debugMode = false; bool itemViewing = false; bool renderAtlas = false; diff --git a/util/util.h b/util/util.h index b30f61f..87bdcae 100644 --- a/util/util.h +++ b/util/util.h @@ -6,6 +6,9 @@ #define FACTORYGAME_UTIL_H #include +#include "atlas.h" + +extern int animationStep; //The window we'll be rendering to extern SDL_Window *window; @@ -16,7 +19,7 @@ extern SDL_Renderer *mainRenderer; extern SDL_Rect screenRect; -typedef enum OrientDirection{ +typedef enum OrientDirection { ORIENT_LEFT_DOWN, ORIENT_LEFT, ORIENT_LEFT_UP, @@ -28,10 +31,28 @@ typedef enum OrientDirection{ ORIENT_DIRECTION_COUNT } OrientDirection; +extern const char OrientStrings[ORIENT_DIRECTION_COUNT][10]; + extern bool debugMode; extern bool itemViewing; extern bool renderAtlas; +typedef struct Animation { + SDL_Texture *textures[TILE_SIZE]; + SDL_Rect atlasRects[TILE_SIZE]; + unsigned char frameCount; + unsigned char divisor; +} Animation; + + +typedef struct OrientedAnimation { + SDL_Texture *textures[ORIENT_DIRECTION_COUNT][TILE_SIZE * 2]; + SDL_Rect atlasRects[ORIENT_DIRECTION_COUNT][TILE_SIZE * 2]; + unsigned char frameCount; + unsigned char divisor; +} OrientedAnimation; + + SDL_Texture *createRotatedTexture(SDL_Renderer *renderer, SDL_Texture *src, double angle); SDL_Texture *createFlippedTexture(SDL_Renderer *renderer, SDL_Texture *src, SDL_RendererFlip flip);