From 36fc3869a2ed51db9a56ad1029487ac2cffea2d2 Mon Sep 17 00:00:00 2001 From: paulaboks Date: Wed, 25 Feb 2026 15:33:00 -0300 Subject: [PATCH] Separate sprites into their own files --- assets/ASSETS.md | 32 +++++++- assets/sprites/textures/arrow.png | Bin 0 -> 232 bytes assets/sprites/textures/axe.png | Bin 0 -> 230 bytes assets/sprites/textures/bomb.png | Bin 0 -> 251 bytes assets/sprites/textures/bow.png | Bin 0 -> 275 bytes assets/sprites/textures/cabbage_seeds.png | Bin 0 -> 236 bytes assets/sprites/textures/carrot.png | Bin 0 -> 416 bytes assets/sprites/textures/carrot_seeds.png | Bin 0 -> 223 bytes assets/sprites/textures/carrot_stage_1.png | Bin 0 -> 198 bytes assets/sprites/textures/carrot_stage_2.png | Bin 0 -> 258 bytes assets/sprites/textures/carrot_stage_3.png | Bin 0 -> 288 bytes assets/sprites/textures/carrot_stage_4.png | Bin 0 -> 372 bytes assets/sprites/textures/empty_bucket.png | Bin 0 -> 257 bytes assets/sprites/textures/hoe.png | Bin 0 -> 218 bytes assets/sprites/textures/key.png | Bin 0 -> 232 bytes assets/sprites/textures/knife.png | Bin 0 -> 199 bytes assets/sprites/textures/log.png | Bin 0 -> 400 bytes assets/sprites/textures/onion.png | Bin 0 -> 370 bytes assets/sprites/textures/pickaxe.png | Bin 0 -> 220 bytes assets/sprites/textures/pitchfork.png | Bin 0 -> 205 bytes assets/sprites/textures/potato.png | Bin 0 -> 350 bytes assets/sprites/textures/potato_seeds.png | Bin 0 -> 340 bytes assets/sprites/textures/potato_stage_1.png | Bin 0 -> 208 bytes assets/sprites/textures/potato_stage_2.png | Bin 0 -> 339 bytes assets/sprites/textures/potato_stage_3.png | Bin 0 -> 340 bytes assets/sprites/textures/potato_stage_4.png | Bin 0 -> 415 bytes assets/sprites/textures/pumpkin.png | Bin 0 -> 450 bytes assets/sprites/textures/pumpkin_seeds.png | Bin 0 -> 300 bytes assets/sprites/textures/pumpkin_stage_1.png | Bin 0 -> 231 bytes assets/sprites/textures/pumpkin_stage_2.png | Bin 0 -> 383 bytes assets/sprites/textures/pumpkin_stage_3.png | Bin 0 -> 449 bytes assets/sprites/textures/pumpkin_stage_4.png | Bin 0 -> 465 bytes assets/sprites/textures/shovel.png | Bin 0 -> 241 bytes assets/sprites/textures/straw.png | Bin 0 -> 376 bytes assets/sprites/textures/sword.png | Bin 0 -> 172 bytes assets/sprites/textures/tomato.png | Bin 0 -> 428 bytes assets/sprites/textures/tomato_seeds.png | Bin 0 -> 237 bytes assets/sprites/textures/tomato_stage_1.png | Bin 0 -> 199 bytes assets/sprites/textures/tomato_stage_2.png | Bin 0 -> 248 bytes assets/sprites/textures/tomato_stage_3.png | Bin 0 -> 303 bytes assets/sprites/textures/tomato_stage_4.png | Bin 0 -> 407 bytes assets/sprites/textures/water_bucket.png | Bin 0 -> 274 bytes assets/sprites/textures/watering_can.png | Bin 0 -> 265 bytes assets/sprites/textures/wheat.png | Bin 0 -> 159 bytes assets/sprites/tiny_town.png | Bin 5042 -> 0 bytes build.ts | 81 +++++++++++++++++++- client/assets.ts | 8 +- client/main.ts | 5 +- client/player.ts | 5 +- client/systems/rendering/render_utils.ts | 2 +- common/constants.ts | 5 -- common/utils.ts | 8 +- deno.json | 1 + deno.lock | 12 +++ 54 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 assets/sprites/textures/arrow.png create mode 100644 assets/sprites/textures/axe.png create mode 100644 assets/sprites/textures/bomb.png create mode 100644 assets/sprites/textures/bow.png create mode 100644 assets/sprites/textures/cabbage_seeds.png create mode 100644 assets/sprites/textures/carrot.png create mode 100644 assets/sprites/textures/carrot_seeds.png create mode 100644 assets/sprites/textures/carrot_stage_1.png create mode 100644 assets/sprites/textures/carrot_stage_2.png create mode 100644 assets/sprites/textures/carrot_stage_3.png create mode 100644 assets/sprites/textures/carrot_stage_4.png create mode 100644 assets/sprites/textures/empty_bucket.png create mode 100644 assets/sprites/textures/hoe.png create mode 100644 assets/sprites/textures/key.png create mode 100644 assets/sprites/textures/knife.png create mode 100644 assets/sprites/textures/log.png create mode 100644 assets/sprites/textures/onion.png create mode 100644 assets/sprites/textures/pickaxe.png create mode 100644 assets/sprites/textures/pitchfork.png create mode 100644 assets/sprites/textures/potato.png create mode 100644 assets/sprites/textures/potato_seeds.png create mode 100644 assets/sprites/textures/potato_stage_1.png create mode 100644 assets/sprites/textures/potato_stage_2.png create mode 100644 assets/sprites/textures/potato_stage_3.png create mode 100644 assets/sprites/textures/potato_stage_4.png create mode 100644 assets/sprites/textures/pumpkin.png create mode 100644 assets/sprites/textures/pumpkin_seeds.png create mode 100644 assets/sprites/textures/pumpkin_stage_1.png create mode 100644 assets/sprites/textures/pumpkin_stage_2.png create mode 100644 assets/sprites/textures/pumpkin_stage_3.png create mode 100644 assets/sprites/textures/pumpkin_stage_4.png create mode 100644 assets/sprites/textures/shovel.png create mode 100644 assets/sprites/textures/straw.png create mode 100644 assets/sprites/textures/sword.png create mode 100644 assets/sprites/textures/tomato.png create mode 100644 assets/sprites/textures/tomato_seeds.png create mode 100644 assets/sprites/textures/tomato_stage_1.png create mode 100644 assets/sprites/textures/tomato_stage_2.png create mode 100644 assets/sprites/textures/tomato_stage_3.png create mode 100644 assets/sprites/textures/tomato_stage_4.png create mode 100644 assets/sprites/textures/water_bucket.png create mode 100644 assets/sprites/textures/watering_can.png create mode 100644 assets/sprites/textures/wheat.png delete mode 100644 assets/sprites/tiny_town.png diff --git a/assets/ASSETS.md b/assets/ASSETS.md index 4d06527..fabd085 100644 --- a/assets/ASSETS.md +++ b/assets/ASSETS.md @@ -31,8 +31,6 @@ license: `free to use with attribution` https://butterymilk.itch.io/tiny-wonder-farm-asset-pack (https://web.archive.org/web/20260204234306/https://butterymilk.itch.io/tiny-wonder-farm-asset-pack) -file: assets/sprites/player.png - license: ``` @@ -50,3 +48,33 @@ the sprites and add something new! You can't resell the sprites, even if changes were made. You cannot use it in any projects related to NFT." ``` + +# Farmer's delight + +https://github.com/vectorwing/FarmersDelight + +License: + +``` +MIT License + +Copyright (c) 2020 vectorwing + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` diff --git a/assets/sprites/textures/arrow.png b/assets/sprites/textures/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4daf6d139e6284bf398fa3946c07c8cd8ab08103 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pfi@Lo9le6BY;<2(7*lclLw* zt{VrVpG!u1T)eZR#587&oz;{^5a^5$SIBl_bCC{^mp%2NJW=i?+krXp&(%&|*z(%) zj)BAh>5dyFhYx`Cew1qPHTDrUN;tBNlZ_*@O}b%?pxCW?@n?cp&Kx*!fWe>r#KkW_ z6PSztsIaxgF03#$Hc&Xqq?7V`v9sc=PL_hp7lWnGI4p`~2=0(M-eR(N2g6;}BT^2A a3=Geo`z!wL>5m3Fox#)9&t;ucLK6Tqcv)fq literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/axe.png b/assets/sprites/textures/axe.png new file mode 100644 index 0000000000000000000000000000000000000000..cd998d712297e70064a47e9bb096c6197988f0e8 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ydu{YLo9le6BY;6iC%Jctm zP{oI9m2NqYd|u3wp1v+EBWBmEMj%*t&UX?J3$5plxL`VeUqQ3Qc4g@X-_0AQnm4a| z%FdB~z4#DY0`v6#`^qnv)S9$7820F0*c#Gg@S%e7UDK}@0c^p{ygQEEPL7t;li%-t zLE49hr^BL6vMEPEk>UHHgVE0=-vX__?%po6R`MuA%5(#R2mVt}G(3t}kZWT0u+wf8 aBSX_qv!)28$=`quXYh3Ob6Mw<&;$Ue#aoR4 literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/bomb.png b/assets/sprites/textures/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..8155bafef343477dc1e680c2f0e414249fd502f6 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hdf;zLo9le6C^SYc&u@%Ha-0R z#GmHv=ZuAN8GJs!s>)^qg0>6C7HhN#q#jtk)bjt^t33aeH%m%LNJMxPnwd2uF_`fl z3cJU1)8_eub8)fxyy=T27%uDNJmsBUQ=OyD35ZafkSZpQ7_E tcn-{M)))J*)Ix+a=Vil-Cti9C46-F5R$dpX)&hOQ;OXk;vd$@?2>{^$TnGRF literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/bow.png b/assets/sprites/textures/bow.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9e5594ec92ad07e95151f4f6883a70003b6dcc GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`w>(`OLo9le6BY;6iC%Jctm zP{oI9m2NqYd|oh>=1t=1^$s__veVNDh=ojK4m0Gi9pX8Z#?i*;yL+DToP7n&3p1}5 z^E7W@&rlS+Xd7e##CY@8dtWZ`M7>o^r93@Sfo6v@ fHgQSj3nqqn&vTDY@<}@fbTNactDnm{r-UW|4OU=R literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/carrot.png b/assets/sprites/textures/carrot.png new file mode 100644 index 0000000000000000000000000000000000000000..fbfe2cfcdb98a515a0055cbe92a478e3b662689c GIT binary patch literal 416 zcmV;R0bl-!P)1v#prOFQL6D$p5b+=g5eI2#I;RM12wDP1hsM^RC1?(pXlQgWsFrjRq6Q(C zz&s2(L4&{}L*1;u;kwi7JndWl|KtDO=Y8)x36EOdPKwdKkuOM!k`(=j*)KdpwOWwo zyZ`{16Z6a-fTASD-p%msV$(b)0sxM$4Q5MSGG&?5$8Wl=4*-JrCj%P!f|MmGSRaA_ zf@glmoa6;a$Wd{)*0=lJI|u}10QwQ=m2?b48^42u92NIR6|<>B@hQyKijS*Toy85= zG3x@PV{x&w^yv^=HUHJ2SJDA63{3)<8J9p!Y33ya>Z;~=GYn0##I6Lkd)*WlFT+eL zR{}MqLFo5B;(q(m;H~rSTKd>epzd_fHGQ55Y+^bV7w7wB8vy14b4{P8yCXrZJ#aW% z;#zy)DTcqlF$5}_L;RpuJjE`6kO0000< KMNUMnLSTZ`khMqv literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/carrot_seeds.png b/assets/sprites/textures/carrot_seeds.png new file mode 100644 index 0000000000000000000000000000000000000000..b256f17401a67f98e4d908c8fc2f2bb66895c864 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%RF5iLo9le6C_wgnB626-@f_9 zz9)9qcN68Zr!yKjXFe8AIJID@=E(^uN#Eon_kg4~v0CsRVB0m<_y1#~8I3@|dThr3 z7>!rI4jG@800O@n;U1-H+y%_*VsG!9<9J&3pqsJ94X36EV?n?6pV8i@ZH-PId9#1o zv}%=$v)22c`?cTn_^_ji~G^SDSjd=oQDIH=~4*RY5|SNFTeqQ5?z3=BV;9A55Q Suw_5c#SEUVelF{r5}E*1VOt3R literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/carrot_stage_1.png b/assets/sprites/textures/carrot_stage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..27a501e01216a29b0bcf44b6011c1afe11f193c7 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`CE<( z!u)5yub)g{DJW>`6470at%X*Ydjt4r7!PC{xWt~$(69DhGOuPU9 literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/carrot_stage_2.png b/assets/sprites/textures/carrot_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f0bb010a29d1ea0034f26a709b1d60fdb837e2 GIT binary patch literal 258 zcmV+d0sa1oP)3!=R~!cc_{|EU3Kz8qFKb5DaRHAf~3~vDl&a5VI?y+0y-y%^r*nstP;0e14Saa`cUOV58 zdEf;A#4~fFqyoTlq}WZ2wm8A|B6YYrs5&IHq$OgKN>X8a5h7G=jxy!7_-NoFo|zDf zC{q+g-nbjOgFT~ng|dSg8op6dq0C;D+u&{8j(MOChAJ~@G_*EwL%JXY&^npBtA3OmS>Q;XY<6)Zs0000M)a}XNTZFI5o@!0fQ$C32wM^Bp6JCo0x%Apio6m5JDBnO`w)w z$w-zWuZZKW?`X#y&-C)%eP4gyYk@T-ge--S<*IpWow$gB%~{x^cbGeDUGMq9=lKhB zVjwhFD&x;>#Y2LNg9rd{GnFM~e+vOX>x_AV?!cm%LxW+@UYPXl>~{>UGp}PHMNI%; z*yEV=D+4MF3}}7;=u9JT;&7Wv>x{LW;Pk2*T;c;eDhhI+JlJQF+lWbSAe1a?J8(ux zZqQa7MQnRXZq0bggMHL8bqBJf_(fdp#EI!HY60i>8RMyKFO~6cYZ5mSP!fs?G=GKQ zM-oCFx%2*ff$``Wcmp0^cagq#05Y!;1mcaw?fA@!T{)AdukGU>n!8o>|6AWibB8K{ SXee(000006iC%JW}% z@yiEmKNr*%u=x}}zI2rb1ST)jOW3ewTLK7J)O}%bjw@qg1_I~W5{)j!o)@zcxe6Fl zOxg42rl&YgUr{{yNVWr5O6SBRgR{HO?K!gQ=2;h+!%Si&u0URj#m9H@Wv|cgNhvTE zbQerI^g2$7p^fo{nZP9HPF8M3wLNSG1`Db_0^QN0@p8dAU!imcrQM4%uNPNX9pG?r t(sN+H!h2*{?0L>Chj8b@v_%pO4DStm-GAHe5eE8+!PC{xWt~$(695P=VHW@Z literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/hoe.png b/assets/sprites/textures/hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..29db0451492f3dec4e31895ef6e0bbafba5eefab GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLo9le6BY;@e3OB?_I literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/key.png b/assets/sprites/textures/key.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7854cff4741a875e2edcb113b2984c472e5ab6 GIT binary patch literal 232 zcmVP)+@O9&0qi ztDX`W*Gc8uG|( iaU}Takp4ZggWw6Dqde1vm2vq10000M6btK#3oMpg&3K~G&BM5j(crA8UJXxmx~jmHGY1+(*iOu{{#N4@*y3%> p%p9eokbP`9=X!3Bi#8Sv43Bnr350Dk5(c`A!PC{xWt~$(69DXbJ}UqK literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/log.png b/assets/sprites/textures/log.png new file mode 100644 index 0000000000000000000000000000000000000000..29dc3e698a6112d15a2021b706466612ed0b6a81 GIT binary patch literal 400 zcmV;B0dM|^P)YR3?Vb#y~}A?aWoSCT=JwXm|lC3l9pR z;tCo=_F{j1feu@o-v9x`R=M_ z7FoRy*#I%&{p|&(XP1tHqD}rtKFy*$?rlk+rfg%Lq^7rB6mrS_k*S-q4cXc`+pJ^P zfej`Hw~qjT{{4kxdrx4R`N-;hl*c_YWU`HUlIAM}p``9$LbH`7#%!g{M?@5a()8WI zggmceUZuE*m5A0c4OQseS2k`;UG+-<00rRqBm@A`dMQkro>!sm!hsq^sQM+$lXOpX zvyM^VM(d?GOjwPgAIVMG27sNwp$PxL0p^i`oM+T}DFDz=J?*k+)xO<4zdF|w&SVSD u#6HbN^w7axh<_1b@~;kTk;5620pJUs#k&8}j7}f`0000KU7OaPVhO(I9NbCID#31bIEh*2@lcaUTlL8F=7c<^+JJW(^H+Y6iC%JW}% z@yiEmKlenaf;jRPwa@=IUM~OlI9d61qNDkfGe>8$+&t0HDWU$Dd5iIZ?Q2-IXTQ=r zAl-W?>>dvYgTe~DWM4fG`UWM literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/potato.png b/assets/sprites/textures/potato.png new file mode 100644 index 0000000000000000000000000000000000000000..ad88136df6f51b66781e70b0ec92d31024757aee GIT binary patch literal 350 zcmV-k0iphhP)Of1HO8TXI-Ku`#i zT7r=u6qoK70KIm>d}T1~FUV3)-kGlqZkJn3;;GSUf;-(8I$ad7*H&9?h=Xf8HCQN1 zJ;KD2i2&mDt7;%rz6AVshKs#-IgfHvP2k#2aejCphr|8?fSZRC8MzFfZGPa}yZQuS zV#(OzuT?n8O<6&C#3(lz4`yVkr_?CNj&hT`r)QSyH=|}y?py_h$}p7nz_p#?>UdiV wiP%+GF@T>vINH%Jrxvamh$K1#9sDQy20B-Xq2pDn?*IS*07*qoM6N<$g2D!ui~s-t literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/potato_seeds.png b/assets/sprites/textures/potato_seeds.png new file mode 100644 index 0000000000000000000000000000000000000000..ab36283e0da5d6e9c6bc1141b54483ab70c48bcc GIT binary patch literal 340 zcmV-a0jvIrP)5?xXqT-}y5CRSbg#^r?1)(Jl z;gZYcLfw3)yWxF*?{k0Pzvbwg%gMA<>m=WD^Y-X;Ep55Fd30DJMkfHsmv>-X?h84v znRN*f%>UFtH&@f!((wSUAMTtwAj!8@lWsN}CV7SD0u-JfF4Jsb8Vk=4rHrH5WV$f% z&QAxxxO4%ej3Xg}&SWX$$ks@2Tc5$q`)oB(i~zTrqcB;m7uD2C%XCNK`JvOtc(qys z)NetEU_RV5m+}rLo9le6C_v{H#9a1&Q!jT z|7m_>W8*{Thmt&n|CA5$+_^3(u`c#@r_%A3yriY`4Vr5<{H{+qJGJf*&;LXJ6H6J} z7=nfcE0 z@MJWuSo&11^GIyj+gpBaE5a8gG+kf!Hm2`>@E10Q9q;ty_jevM06LMu)78&qol`;+ E0G1s7XAaO7z8Qi{s5+?N!_{18iGO9a6zNiBa5B;2X#%F5bR#X zvU__+lctJiCOb3l&D$BcHq?I!cWmD;Jjsi$()yf!;bJ-!+6+Ms-&tt(?&EU|SBAw|Oj@!eXd-e`q^MEATxxg$^|h zAYxRU>`w94JvrYsVqpiLd~v(Y0I)L~rp7Mx){)}@$_uD%45Pi17qG^-DT2LJ0{e#g;3Z{jWmyJvs3oaRnMutW<6%U0EuGIOBN>!*`keq$C zGED)qWXX5F_wL@aftl;(<<_k>+EFZjD^yB5+8q46E~2`OE+}z&{1J5S%aIHN$#xAi zM~ka2^c5-d`yF6RE0ofX2mrv|TYr{^KoCi2juz+If{#4~-tC86-i;EjzY8==%Q4t~ zjpNo5J?psJhrE|Srjc$c0^ke#GE71e@(vK(z{OkP3*|u~@1mi=J)t|1KF#Y>C?FYA zWWZpy;Gcqz_?HaIN6*N+o$I*s6xf@%+Gv;R?#n?2{}ZVUV_K0>z`zxN56Ua09}?*m m53>P$&qMUtz=rGb? zb8ONZs9rTp9Bj`l{AQHfLHAA();yE-IMop+5<^=R)uLS)T-!=jTmV!q7>`(vz002ov JPDHLkV1migu^j*a literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/pumpkin.png b/assets/sprites/textures/pumpkin.png new file mode 100644 index 0000000000000000000000000000000000000000..fee4a1b9fe0596e51ece066fc7a75726c414e528 GIT binary patch literal 450 zcmV;z0X_bSP)jpO)C2;XL2L%fv zhl{95wBg-*_nrm);CR2^kN5fhzVF?ggAtk2^3tp)caIMLgjj{^E%^ZC^S0n$kuZyT z3vMoCzBpSzQ;^S>m#Ob}3wj#&wKL1&(OyYU4A-{!Y%bVn3a$^vxCI|-Cve;4xLwjB z!i0P0eHz6t8pSVC-|uWRMXX*sk!u!u=Y2iQF=4Vm0Nx;HS#}FP-XMot^<^WF%W=De z&~P-t8{}{czO)>{WWlZac=xt&e2H1KvU`;V($MST*5X`?1-5|DmZD9+Vx_N+r&j$M zy?be00|5|pV|P(>rb$4;c-4mT6lUZLRO zY;HlFY0|1yt{gm!CcK7kPU1Cua~?)4EBhHPpV#&IR>9ciT*F{|$~&p;B|v3A!`beK s2F%=?thisls}kBvrLDfYD-#Cz0csV@X4g9iV128ir>z0Jtrk2|0A4#s=IW`k$t^P&)xin_SN|d zfB*XYe`&S9aZ&|X=I8m=MO#c%C3nreF?}J665soU5(RH>oqKxM@6G8wYHQLzczr$o z)LNuLh;2vGqLTaPfkvh4IG1ULF&9{Vy|s1j>F35f7Jn#|W?((Bv0)vjpWc?Lo9le6C_wgnB7VkZ-%b> zpZMl@;%>={M`wl^8QR3`7S=o0a`uW$vRWGuv;9o?{@>uNfnmvkrqh|h=l&%paHJ

Y|NmQ^O$^qiBsFZTl%656F7|fkBKFmc2F?;d zuw%XQkqf56tXsC+`TuzGajA|a3_R+YnLFJVaq1=~By>25?I_EAUNlF~VcHQkj+2+= a85pX?j9E`C4!#X^IfJLGpUXO@geCyjbyolY literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/pumpkin_stage_2.png b/assets/sprites/textures/pumpkin_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf03d1d98d35214df5a625770fac6d0d8560854 GIT binary patch literal 383 zcmV-_0f7FAP)Chn%lk4Wa>$Au}^1INTBphG3>5^~hlljlnh9veaHD zj%#~mQxkjU+IRhb-MhjcO91p%gTggF9^XZ8H7L6KfYUA&uHPR<1>p4nTJB*U2RyxH zCE0Wd8={ifBnG*aR}NbBmw6m`nw_tK?IS;`0|=$8 z&98+8Jlsk)Gpi2JSy?&L28`}r}A4l z)p|6O7?g^N@-SQ!=csOd9tU15S8^-yW?Co9L-@SQyva1rCJ%p@LVsw%?PJwj9}Me* zVY>9EaoVNgiogN2PQ}f0z{|Z))VxsTMN%pnHDZi_G4NW?To-}Mzt9Bdp#`;%KEWm0 dxasl-lvhpzs#bJqX>002ovPDHLkV1kf>sQv%| literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/pumpkin_stage_3.png b/assets/sprites/textures/pumpkin_stage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc60a49a903e39bc1ce8e120e6fa3543bd279c59 GIT binary patch literal 449 zcmV;y0Y3hTP)L^wh@JWnW9TieBnD%jCh;0NkUU z;JiCcaog`{D%RCU<1kCu?5qj76Vp?0>3B@(c)V6YA{;0arTxh#rJ4^_+Xgqa9yhff zv<(m7w%^lqV(QfW)fvdOY}K|wwQX>*`?jh;2-D*loGl+XZ|c5@1&{R<)uw^9Jqv&^ z9JDaESJ|9_1Pk=8jE-Pq_^AAu$}fny^hTY!cT~E(5QHAbzZ;0Erlx zUN8rw-DJCegb(8ox*g(_7?Ww)YX4OxR?@)>-63??5Sc z;={?&YR?%+oPp%5>1S1%JhRaK}1Va28B!e2{u(zh7g>I z1VPafk|H&QzlPu4ue;OwPVc?n`@Y}zJ@{$>@q;-*2;I#)&8u$}5**bB=oOu4Q@%Tn ztpP+l!d4*>7;t=@7d<+P9J6%#)_^_`vvk#`0i;&*BHDz$H3$sxevE&;2kI|-31XIx zA4gJF}nUR$8jIux-*EOR6;h$fivpo)(2DBSaZtFB>v)V*PMFcqbLPzgJ$z zW!?_4!?}yd=<;Y%^}!g5m4fQ!@8c->e+?SC!P<0>^~3o5e5!S|*b(0_SfVoq!)&Yagl^ps}A04D$S;R+v0VaC-9V2R${x zWBnU|rCL&vKzbzBl;`t%q3DL^-Vo1qYG_5~uBA(kV_*CLx23L$lS{n*00000NkvXX Hu0mjff;-b6 literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/shovel.png b/assets/sprites/textures/shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ef7841fff2876b234c5d904a13032ca59249bb GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J3L(+Lo9le6BY;rzh z^0XMXQ%MDeJ)g`}H5Rj5lhRcK@Y1TyvCWL<@ebT&Mgv?27$ z-}i|cJf;sg-ToYAxMpx*+Kd8KgEbdV95`@bgInj^#)rSMEv%p1^I!Ao!!f55d*@r2 o3Y9S45oKZUW9GQ&W6Hqr#>%?v^l{}ppdT1KUHx3vIVCg!0LDaOvH$=8 literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/straw.png b/assets/sprites/textures/straw.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd2b42a899378d13bf899fd0a59d8f4a3889d9e GIT binary patch literal 376 zcmV-;0f+vHP)%@9Zn z4OG%ixDL|Vq)q4`{?omj^Zn=Cb1wXcY)chsvAtbDMK11SmTJ(L!3!mA3EzG^%-F8f6^UN7o8?L4>XqFpUac5Hg+3=?x}QF3q4nT1Xe? zCE>U}id@7CB21&g{qr!^MXJH|)tPW!-T~0H62JzW`Gm`sA)4(vpRYcSJH`v5RZQ0k z^ac|twFBEyh4=Qs6VPneIX&FxYZ!9(;QkaGEmpZPgKnoLrn5PwQ31x7M+e;AJW@V6 z{)H3Dt;3G%1E9zuUJ#+kAwVj;bp}hL1)K@yrE`M;Zc|Gg29Jc<1aZXny#mRaztIMFZ>flP59{ zl)TJp`}HDV&8rP+{xfn*^Ct0tfbZ^k#s&rn{^uh0Hux&8+tYBF`-ItL5e9~%r<9-g TPuZ^lw4TA!)z4*}Q$iB}{*6Ba literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/tomato.png b/assets/sprites/textures/tomato.png new file mode 100644 index 0000000000000000000000000000000000000000..9f080ea7e7e4dc5f9d5c9339c0debde83aeb3426 GIT binary patch literal 428 zcmV;d0aN~oP)(xHt;FgN1;;i}VSE4kfyYxCm_!9g5%} zQV>$J2saM##-vHxGv(%-??3;!CxHb~K57N?@?sIJ+A0!}vK2^~6kMJK8ZO|12N-S$ zd$z(qf1B?>clB%)7Ieds?=2|WX~T&(4XYkZoDoG^Ai5$F@oa@^htHi-6Vt3lW8~uS z?dd)MwVOvgTOqoFi8BJAu)Be3D~h(@j53!Ww~WWnxy(Dz)+f%0PN|7hJ}1rt1vaur zXjt{&!rV+G3^%lUy!3?3zjAHuV7OsUDnA+};o!a3XYF8*!Qpn|46p_aSm(XhXQ-^~ zOVrRb9M27ZDh$O6Qu)B&cQ8<2GezQ|VI4KG`o9I!tOnQCPB>%!b=p`0mdfX9{KDPm zeR2zt`cEY-5bGR|T>M~~)u2;qW)|wsK-4`Yphaq8mFcx=5QyMR0UZsip8AdBppIV` W7o8{!PWgBM0000he8 z=d2y$GJ$6MBrC3?tm^wX-3;ecY~;Bcuy(e;#I<=9j1!NiAK030J>58CXYviE%QbIr zoqPJCNFvXP-$PgTyT^`)5e#k$Mg|T{L9d?)11;G6|MR&wN2H}C*v{1JiImnpoSAw< iL^zdUU4g_N1_rY`8sLx=zX literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/tomato_stage_2.png b/assets/sprites/textures/tomato_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb613fb9c02ec1f8adf46e563c1feba8788dc190 GIT binary patch literal 248 zcmVs0ky=EAUCA3Bm}- z3Fuxin6D>N0=@=mid3cGOhMf?OV6a9Z!y1f`C*H{Ag7Reb9OxH`K_%m-B6$8`R=3u0000!3Ut;+BMpKE0lr*>>+5EnlqrZ4uu(eoZWzs5YzbQ zy?OKAz+YBB_@y8G@*Awvgb?%nNG86&oOgl&gqSh;Zv+62kC4WM!H~v8ugD?7X%E;c z2w>zQL^G8y?%wKo+QV$~fHbDUDOQ>YUrz21RZQ1x>(HGB`oS-vuA66@BZ#=(K_eg{ zI)d0<#}fx;-5g?@Q}$pcLx|bQw>x-xO=Xfa1AH7>7ZRfp(AEH)^UG{&6pcxB>!z*R z!i#`&{$UNu0_Vx#xW+G+^K+*kTSB)Qf8zXKeFAa}gTgrc!Dave002ovPDHLkV1go$ Bi7@~G literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/tomato_stage_4.png b/assets/sprites/textures/tomato_stage_4.png new file mode 100644 index 0000000000000000000000000000000000000000..40cf8df419006de561d026094d167b324edeaec9 GIT binary patch literal 407 zcmV;I0cie-P)3CMO35T#9O9ix(?t;cAmmH#y~lfxgTI_ysTk%;#qc+0nK+=@i1ro{FgKV3 z;1_HFs*UK(?|YW!S#bdXRaS_eFz@@P4=R(8y$74~eF)s71ECkKDthJ@*)hn^O#nky zWrZp$gGo3r5o!@|t^OkxAML{LdzJtwINM=+YzDXoqbVH zy3nN?fqeewlAJ2X5KrEpnK^c%xVUiQBi_f`^(_FENyyBxk6qv z9nlkH$5fWdQhME#YFsFA>F6677m(8Hu5$A~^95i2oVh1J0(}4g002ovPDHLkV1gF5 Bv(5kj literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/water_bucket.png b/assets/sprites/textures/water_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9d33f9c2a7bee5b537cd1cf519ad936c29c921 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`H$7b(Lo9le6BY;6iC%JW}% z@yiEmKNr*%u=x}}zI2rb1ST)jOW3ewTLK7J)O}%bjw@qg1_I~W5{)j!o)@zcxe6Fl zOxg42rl&YgUr{{yNVWr5O6SBRgR{HO?K!gQ=2;h+!%Si&u0USOkNwYh!kEiiXBh05 z+40!Cp|P=XVfO9VHEdIo1(Odw^NC@YE#svV!D0B&w4ssl(NW>|{|pTb9FiDSWv}e? ze8l6B5^nOgiqD^2BGKUl>k9^D9uHOxHlUDS0P`-XE@R=N3=AK`{B_qq-1!6ONd`|> KKbLh*2~7a_O=m{{ literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/watering_can.png b/assets/sprites/textures/watering_can.png new file mode 100644 index 0000000000000000000000000000000000000000..ae58c96e68bbd32dd93901ef82d75aa0e6afdfdc GIT binary patch literal 265 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 diff --git a/build.ts b/build.ts index 16c5167..1b80b04 100644 --- a/build.ts +++ b/build.ts @@ -1,4 +1,5 @@ import { copy } from "@std/fs"; +import { createCanvas, loadImage } from "@gfx/canvas-wasm"; const BUILD_FOLDER = "build"; @@ -7,8 +8,82 @@ function clear_folder() { Deno.mkdir(BUILD_FOLDER); } -function build_assets() { - copy("assets", `${BUILD_FOLDER}/assets`); +function build_fonts() { + copy(`assets/fonts`, `${BUILD_FOLDER}/assets/fonts`); +} + +function next_power_of_two(value: number): number { + return Math.pow(2, Math.ceil(Math.log2(value))); +} + +const SPRITE_SIZE = 16; + +function calculate_atlas_size(count: number) { + const raw_sprites_per_side = Math.ceil(Math.sqrt(count)); + const raw_size = raw_sprites_per_side * SPRITE_SIZE; + const size = next_power_of_two(raw_size); + + return { + sprites_per_side: size / SPRITE_SIZE, + size, + }; +} + +async function build_atlas_from_folder(folder: string) { + let sprite_count = 0; + for (const entry of Deno.readDirSync(folder)) { + console.assert(entry.isFile && entry.name.endsWith(".png")); + sprite_count += 1; + } + + const atlas = calculate_atlas_size(sprite_count); + + const canvas = createCanvas(atlas.size, atlas.size); + const ctx = canvas.getContext("2d"); + + const atlas_info: Record = {}; + + // purple and black missing texture at x:0 y:0 wow ! + ctx.fillStyle = "magenta"; + ctx.fillRect(0, 0, 8, 8); + ctx.fillRect(8, 8, 8, 8); + ctx.fillStyle = "black"; + ctx.fillRect(8, 0, 8, 8); + ctx.fillRect(0, 8, 8, 8); + + let index = 1; + for (const entry of Deno.readDirSync(folder)) { + const sprite = await loadImage(`${folder}/${entry.name}`); + const row = Math.floor(index / atlas.sprites_per_side); + const column = index % atlas.sprites_per_side; + ctx.drawImage(sprite, column * SPRITE_SIZE, row * SPRITE_SIZE); + index += 1; + + const id = `bworld:${entry.name.replace(".png", "")}`; + atlas_info[id] = { x: column, y: row }; + } + + Deno.writeFileSync(`${BUILD_FOLDER}/${folder}.png`, canvas.toBuffer()); + Deno.writeTextFileSync(`${BUILD_FOLDER}/${folder}.json`, JSON.stringify(atlas_info)); +} + +async function build_sprites() { + for (const entry of Deno.readDirSync("assets/sprites")) { + if (entry.name.endsWith(".png")) { + copy(`assets/sprites/${entry.name}`, `${BUILD_FOLDER}/assets/sprites/${entry.name}`); + } else if (entry.isDirectory) { + await build_atlas_from_folder(`assets/sprites/${entry.name}`); + } + } +} + +async function build_assets() { + Deno.mkdir(`${BUILD_FOLDER}/assets`, { recursive: true }); + copy("assets/ASSETS.md", `${BUILD_FOLDER}/assets/ASSETS.md`); + + build_fonts(); + Deno.mkdir(`${BUILD_FOLDER}/assets/sprites`, { recursive: true }); + await build_sprites(); } async function build_client() { @@ -23,7 +98,7 @@ async function build_client() { async function build() { const now = performance.now(); clear_folder(); - build_assets(); + await build_assets(); await build_client(); console.log(`Built in ${(performance.now() - now).toFixed(2)}ms`); } diff --git a/client/assets.ts b/client/assets.ts index 40cb99b..9f3304e 100644 --- a/client/assets.ts +++ b/client/assets.ts @@ -1,4 +1,4 @@ -type Asset = HTMLImageElement | HTMLAudioElement | string; +type Asset = HTMLImageElement | HTMLAudioElement | string | Record; export class AssetManager { static instance = new AssetManager(); @@ -47,6 +47,12 @@ export class AssetManager { this.assets[key] = await resp.text(); }; this.loading_promises.push(promise()); + } else if (src.endsWith(".json")) { + const promise = async () => { + const resp = await fetch(src); + this.assets[key] = await resp.json(); + }; + this.loading_promises.push(promise()); } } diff --git a/client/main.ts b/client/main.ts index 6f005a4..8f7f361 100644 --- a/client/main.ts +++ b/client/main.ts @@ -62,9 +62,12 @@ if (!canvas) { InputManager.initialize(canvas); AssetManager.instance.load("bworld:assets_text", "/assets/ASSETS.md"); + +AssetManager.instance.load("bworld:textures", "/assets/sprites/textures.png"); +AssetManager.instance.load("bworld:textures_info", "/assets/sprites/textures.json"); + AssetManager.instance.load("bworld:player", "/assets/sprites/player.png"); AssetManager.instance.load("bworld:roguelike", "/assets/sprites/roguelike.png"); -AssetManager.instance.load("bworld:tiny_town", "/assets/sprites/tiny_town.png"); AssetManager.instance.load("bworld:ui", "/assets/sprites/ui.png"); await AssetManager.instance.load_all(); diff --git a/client/player.ts b/client/player.ts index 139bf07..3d5fe9c 100644 --- a/client/player.ts +++ b/client/player.ts @@ -32,7 +32,10 @@ export function create_player() { // TODO: actual player ids player.add(new PlayerInventory(player.id)); player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:pickaxe", 1, 1)); - player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:bomb", 5)); + player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:sword", 1, 1)); + player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:axe", 1, 1)); + player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:hoe", 1, 1)); + player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:watering_can", 1, 1)); player.get(PlayerInventory)!.container.add_item(new ItemStack("bworld:bomb", 64)); player.add(new Camera(-100, -100)); return player; diff --git a/client/systems/rendering/render_utils.ts b/client/systems/rendering/render_utils.ts index d297885..84ca9f8 100644 --- a/client/systems/rendering/render_utils.ts +++ b/client/systems/rendering/render_utils.ts @@ -107,7 +107,7 @@ export function draw_nine_slice( export function draw_item(ctx: CanvasRenderingContext2D, item: ItemStack, x: number, y: number) { const sprite_region = get_sprite_region(item.type_id); ctx.drawImage( - AssetManager.instance.get("bworld:tiny_town"), + AssetManager.instance.get("bworld:textures"), sprite_region.x * 16, sprite_region.y * 16, 16, diff --git a/common/constants.ts b/common/constants.ts index 82ed2e0..d0c8846 100644 --- a/common/constants.ts +++ b/common/constants.ts @@ -4,8 +4,3 @@ export interface SpriteRegion { x: number; y: number; } - -export const ITEM_SPRITES: Record = { - "bworld:pickaxe": { x: 7, y: 9 }, - "bworld:bomb": { x: 9, y: 8 }, -}; diff --git a/common/utils.ts b/common/utils.ts index e34f0c7..240b62c 100644 --- a/common/utils.ts +++ b/common/utils.ts @@ -1,4 +1,5 @@ -import { ITEM_SPRITES, SpriteRegion } from "./constants.ts"; +import { AssetManager } from "../client/assets.ts"; +import { SpriteRegion } from "./constants.ts"; export function point_inside_rec( point_x: number, @@ -14,6 +15,9 @@ export function point_inside_rec( point_y < rec_y + rec_h; } +type TexturesInfo = Record; + export function get_sprite_region(id: string): SpriteRegion { - return ITEM_SPRITES[id] ?? { x: 0, y: 0 }; + const textures_info = AssetManager.instance.get("bworld:textures_info"); + return textures_info?.[id] ?? { x: 0, y: 0 }; } diff --git a/deno.json b/deno.json index 9e2729c..55f8078 100644 --- a/deno.json +++ b/deno.json @@ -15,6 +15,7 @@ }, "imports": { "$/": "./", + "@gfx/canvas-wasm": "jsr:@gfx/canvas-wasm@^0.4.2", "@std/fs": "jsr:@std/fs@^1.0.23", "marked": "npm:marked@^17.0.3" } diff --git a/deno.lock b/deno.lock index 4e69697..f10b053 100644 --- a/deno.lock +++ b/deno.lock @@ -1,12 +1,23 @@ { "version": "5", "specifiers": { + "jsr:@gfx/canvas-wasm@~0.4.2": "0.4.2", + "jsr:@std/encoding@1.0.5": "1.0.5", "jsr:@std/fs@^1.0.23": "1.0.23", "jsr:@std/internal@^1.0.12": "1.0.12", "jsr:@std/path@^1.1.4": "1.1.4", "npm:marked@^17.0.3": "17.0.3" }, "jsr": { + "@gfx/canvas-wasm@0.4.2": { + "integrity": "d653be3bd12cb2fa9bbe5d1b1f041a81b91d80b68502761204aaf60e4592532a", + "dependencies": [ + "jsr:@std/encoding" + ] + }, + "@std/encoding@1.0.5": { + "integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04" + }, "@std/fs@1.0.23": { "integrity": "3ecbae4ce4fee03b180fa710caff36bb5adb66631c46a6460aaad49515565a37", "dependencies": [ @@ -32,6 +43,7 @@ }, "workspace": { "dependencies": [ + "jsr:@gfx/canvas-wasm@~0.4.2", "jsr:@std/fs@^1.0.23", "npm:marked@^17.0.3" ]