From 2e44b95059e7071415dec71dc911e68e0c2f76a8 Mon Sep 17 00:00:00 2001 From: Natty Date: Mon, 1 May 2023 03:42:30 +0200 Subject: [PATCH] Initial commit --- .gitignore | 2 + Cargo.lock | 401 ++++++++++++++ Cargo.toml | 7 + assets/bike.png | Bin 0 -> 2129 bytes assets/blobcat_basic.png | Bin 0 -> 788 bytes assets/cloud1.png | Bin 0 -> 744 bytes assets/controls.png | Bin 0 -> 584 bytes assets/grass_bottom.png | Bin 0 -> 840 bytes assets/grass_top.png | Bin 0 -> 804 bytes assets/hit.ogg | Bin 0 -> 18987 bytes assets/house.png | Bin 0 -> 4869 bytes assets/logo.png | Bin 0 -> 1470 bytes assets/lose-life.ogg | Bin 0 -> 38120 bytes assets/miss.ogg | Bin 0 -> 70096 bytes assets/particles.png | Bin 0 -> 1394 bytes assets/plutostardust.ttf | Bin 0 -> 74716 bytes assets/projectiles.png | Bin 0 -> 1495 bytes assets/road.png | Bin 0 -> 5181 bytes assets/shoot.ogg | Bin 0 -> 21159 bytes assets/sun.png | Bin 0 -> 753 bytes src/assets.rs | 171 ++++++ src/config.rs | 4 + src/game.rs | 1091 ++++++++++++++++++++++++++++++++++++++ src/main.rs | 70 +++ src/menu.rs | 135 +++++ src/particle.rs | 363 +++++++++++++ src/sky.rs | 88 +++ 27 files changed, 2332 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 assets/bike.png create mode 100644 assets/blobcat_basic.png create mode 100644 assets/cloud1.png create mode 100644 assets/controls.png create mode 100644 assets/grass_bottom.png create mode 100644 assets/grass_top.png create mode 100644 assets/hit.ogg create mode 100644 assets/house.png create mode 100644 assets/logo.png create mode 100644 assets/lose-life.ogg create mode 100644 assets/miss.ogg create mode 100644 assets/particles.png create mode 100644 assets/plutostardust.ttf create mode 100644 assets/projectiles.png create mode 100644 assets/road.png create mode 100644 assets/shoot.ogg create mode 100644 assets/sun.png create mode 100644 src/assets.rs create mode 100644 src/config.rs create mode 100644 src/game.rs create mode 100644 src/main.rs create mode 100644 src/menu.rs create mode 100644 src/particle.rs create mode 100644 src/sky.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40d9aca --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/.idea \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8677a23 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,401 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "audir-sles" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea47348666a8edb7ad80cbee3940eb2bccf70df0e6ce09009abe1a836cb779f5" + +[[package]] +name = "audrey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b92a84e89497e3cd25d3672cd5d1c288abaac02c18ff21283f17d118b889b8" +dependencies = [ + "dasp_frame", + "dasp_sample", + "hound", + "lewton", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blobcat-delivery" +version = "0.1.0" +dependencies = [ + "macroquad", +] + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "dasp_frame" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a3937f5fe2135702897535c8d4a5553f8b116f76c1529088797f2eee7c5cd6" +dependencies = [ + "dasp_sample", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fontdue" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0793f5137567643cf65ea42043a538804ff0fbf288649e2141442b602d81f9bc" +dependencies = [ + "hashbrown", + "ttf-parser", +] + +[[package]] +name = "glam" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hound" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" + +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", + "png", +] + +[[package]] +name = "lewton" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d542c1a317036c45c2aa1cf10cc9d403ca91eb2d333ef1a4917e5cb10628bd0" +dependencies = [ + "byteorder", + "ogg", + "smallvec", +] + +[[package]] +name = "libc" +version = "0.2.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" + +[[package]] +name = "macroquad" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3790f7fd2e4c480108cbfc86488f023b72e1e0bb6ffd5c6cba38049c7e2fbfc" +dependencies = [ + "bumpalo", + "fontdue", + "glam", + "image", + "macroquad_macro", + "miniquad", + "quad-rand", + "quad-snd", +] + +[[package]] +name = "macroquad_macro" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5cecfede1e530599c8686f7f2d609489101d3d63741a6dc423afc997ce3fcc8" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "miniquad" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46381fe09fbf91bfa402a3e4fc26a104c9130562d51f89964c46adbc00591496" +dependencies = [ + "libc", + "ndk-sys", + "objc", + "winapi", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "ndk-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "ogg" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e571c3517af9e1729d4c63571a27edd660ade0667973bfc74a67c660c2b651" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "png" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "quad-alsa-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66c2f04a6946293477973d85adc251d502da51c57b08cd9c997f0cfd8dcd4b5" +dependencies = [ + "libc", +] + +[[package]] +name = "quad-rand" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88" + +[[package]] +name = "quad-snd" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c954bb70493a2872775b74b663a767686e6d96d242e789d6a92cc4ebd2a64e" +dependencies = [ + "audir-sles", + "audrey", + "libc", + "quad-alsa-sys", + "winapi", +] + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + +[[package]] +name = "ttf-parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b322eea --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "blobcat-delivery" +version = "0.1.0" +edition = "2021" + +[dependencies] +macroquad = "0.3" \ No newline at end of file diff --git a/assets/bike.png b/assets/bike.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7438ca6d62506ddb58851ee60d9e673a000ad5 GIT binary patch literal 2129 zcmV-X2(I^uP)EX>4Tx04R}tkv&MmKpe$i(@I4v4t5Yx$WWau6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?K>DYS_3;J6>}?mh0_0YbgZG%FATG~G5+ ziMW`_u8P4|1TcbL2#CqdGUg;H3D5C$4 z;Ji;9W<^;gJ|`YG>4LUIyFxmCKd}FtaLCdni}yGaYWU0$`>*& ztDLtuYvn3y-IKpCl+#z1xlVH!2`pj>5=1DdqJ%PRL}}GYv5=zuxQBnJ>6gf*kgEhn zjs;YpL2mlN|KNAGR(^8AO$x<mpj1VlOdaOQ}WXk@_FF>jJ_!g4BP@eYi@6?eVjf3Y3eF@0~{Oz zV+G1y_jq@AXK(+WY4!I5T$pm6NAgbv00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~u9T7Je4(VAv000JHNklv;PhBX)7nL)hfQ)%ZS^Sd!N_1xjH)IWVigRAo~8$D z%}Soxot;@pJG0*p1hF+w!TP@U_RXSsA_BRF;VrNezD~SL$Q3;;3wSH-7JvKA`<;K? z)q1TFyq$JuJ`vGpAAhC&dN6>+1lj-nkKe)oc@^Ij^Z*u@|M!>f8aMH%0G9Ii(&zLG zaSj9IkY88MbiYl^xB}olfJMkM-oyx~01g`?cLtc7o8x&A`8F}OLyu^O9vPc}U;;Y~ z5IlOH`;>l`J_i#xvj_ZxUwBAN@@M6~^50*uQPADpU8WMFvd(%_uv;vASx6$jRl9(& z3F3qe#COsJg3J$_z}ao!O0CYHynLm+e*gMa_p?6*6BKL`e{o`rp1gcTCx;FC=aY|E z8b+~_58vaov_@3<+W4iMy$^8t!9%w@;;{GzmjIaoxa6T+pbXJkO)h&s8?=A@s`FK#-ELF6-KOK?V2 zcm1J@6Jxa4F^H%!T%Vs|(@%H!I(B zM^pJfdtZciN_H2Uo108A%T42jd;kB|Hl%B!b_7AZ&b@$QvB;;Urlj{Bg4aGcIH1$h zQ){=JEUJWip2r1ZM%_O!jZaNL7(ny(LRaY(2&m8ln8as_VzJ2M9<~dP&jd!`Qf8~} z0{Y$MD_{S?aC(5aGOa3}X*>V`0000OLK6rw4(0J9m+UzIf=+5lbW`>Fek zf8zN78u3DUOTH+>k1BP(fA87(CBWG#kkWJzQ4gSUawqb1FsYp!Vo9?CN?&!LsmM>$he+GyUQTY;}5uciXE*l^`7ACDp zAz=YYB%tScyz?{fV|=EFnhW6jKIhxtaNqZxYBae>yeN@Vjt4{D24X%y&cJ*C00000 z000000000000000003EMVPOFuHh~FX0+;|MP=?tkXti2pD(mCc0ZR^t>Ihk_Rv9XR zBNc#%s8*}-R;#7Fei+~8X(I)j#4nXf)M~Y;*=*AC@-j=qD7XYT%Erb9%D;gDGBY0_ z$mnLXN%QmbtW+w|MXA}eiseCi2 z(&=E0c+OmytN(dc;dCyly-gQU&PE*od!zSIYRL z@gPGzfGC?uq>W-2dCe00000NkvXX Hu0mjfSyWP)EX>4Tx04R}tkv&MmKpe$iKcp%Z5j%(|WT;LSL`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLx;QDiNQwVT3N2zhIPS;0dyl(!fWKa5su>&yRLwF{ ziMWu-t_q=71Tl;*^kG_JramW%NqCO0d-(Wz7vovp=l&c$O3q|}PavLUx?vG-5KnJf zI_G`j2rEho@j3CBK^G)`x%kia6AAVPqQDoQBBLX1|86cZ`hk9+tB9luB}nOr3> zax9<%6_Voz|AXJ%n)%5IHz^zkI$mu1V+0880*#t&e;?a+;{*si16NwhU#SB#pQP7X zTJ#9$-3BhMTbjHFTnGy0}1(0>bbuerT7_i_3Fq^Yaq4RCM> zj20++-Q(Sz?Y;ebrrF;Qi}iA`y7dPt0003?Nkl`bU@}mI~lfdd_bCM^M8Ac2N;MW8BU|S*6^SYJqMuT$Kc@v+o%mpS(BDhE?Gz`mK zKl?(nb2;|?rySxeM9004l~`J8t@Nd%`lfD=H@xfpxNBRG^+Pe~BlP)EX>4Tx04R}tkv&MmKpe$i(@I4v4t5Yx$WWau6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?K>DYS_3;J6>}?mh0_0YbgZG%FATG~G5+ ziMW`_u8P4|1TcbL2#CqdGUg;H3D5C$4 z;Ji;9W<^;gJ|`YG>4LUIyFxmCKd}FtaLCdni}yGaYWU0$`>*& ztDLtuYvn3y-IKpCl+#z1xlVH!2`pj>5=1DdqJ%PRL}}GYv5=zuxQBnJ>6gf*kgEhn zjs;YpL2mlN|KNAGR(^8AO$x<mpj1VlOdaOQ}WXk@_FF>jJ_!g4BP@eYi@6?eVjf3Y3eF@0~{Oz zV+G1y_jq@AXK(+WY4!I5T$pm6NAgbv00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~u9TNx^vI~l60002@NklPoO1eAtHV~j57cLyq=Hf`|r=R#Y-`l2?)u@MDUpPK1WUw z$pSdpzH7y2xkX?qc?-A*Nx+_a7ST=4_1Smr<_@omm3Ww-n3G8k9L@Y0&>Ds4KndiN z9Vm^w#RV)q`&uJtYFaK~Bd9`v)|skuKoxLD#M%TDyAK>H;u4*ZTB%qAnuuYXqbJW? z*-t8BNkneqzuPx%0!c(cRCt{2+e>nTFc3vilFBaFAB*z-Scfx6iJ~xyPI!oze(#KZKyNv0q$nQ=vQbV#n;J3p0?|mwdN(lx&VyM79@9tJ(-wcdxL2Y9_+*@d@l zt5$B?w(RRX;kDiYs{rR10>;2R2W5Eg0o+r)5meI%zp@z-lR)PPfO7=EIRfCENdQtW zH=ti;r-3}^F_{FQ_a!9a*a&h?bsAVx=~FSUSOqx85C8xG00000000000002M9DV^6 W+zy~`6A66)0000EX>4Tx04R}tkv&MmKpe$i(@I4v4t5Yx$WWau6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?K>DYS_3;J6>}?mh0_0YbgZG%FATG~G5+ ziMW`_u8P4|1TcbL2#CqdGUg;H3D5C$4 z;Ji;9W<^;gJ|`YG>4LUIyFxmCKd}FtaLCdni}yGaYWU0$`>*& ztDLtuYvn3y-IKpCl+#z1xlVH!2`pj>5=1DdqJ%PRL}}GYv5=zuxQBnJ>6gf*kgEhn zjs;YpL2mlN|KNAGR(^8AO$x<mpj1VlOdaOQ}WXk@_FF>jJ_!g4BP@eYi@6?eVjf3Y3eF@0~{Oz zV+G1y_jq@AXK(+WY4!I5T$pm6NAgbv00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~u9StxYB>rJx00043NklJ0RYVP3ESsjuFtP=7FnN+yUyuRUh1pQ zKF8sX)h?RH(KzE4FFfuq^atIz1%MfbED6<1lCv^13~|OSmZ7>-FKs@}KIaE#%g(7q zG)hb%x_O_Ibwwv_(cOGgHcg>_HSoBq z(E1}lv&wC29e^_57%o>5r!M=chW5s2Yz@eIgml?y8`}4Ru4CHD5ePW|+m*rLG{tsh zniGJ$>2Hov<)6`6YgX$2fM1-bvS#Gr*F{9X$jeL6HGp1Xs?35syqzk^L%;`ljJ-@D S&c7r80000EX>4Tx04R}tkv&MmKpe$i(@I4v4t5Yx$WWau6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?K>DYS_3;J6>}?mh0_0YbgZG%FATG~G5+ ziMW`_u8P4|1TcbL2#CqdGUg;H3D5C$4 z;Ji;9W<^;gJ|`YG>4LUIyFxmCKd}FtaLCdni}yGaYWU0$`>*& ztDLtuYvn3y-IKpCl+#z1xlVH!2`pj>5=1DdqJ%PRL}}GYv5=zuxQBnJ>6gf*kgEhn zjs;YpL2mlN|KNAGR(^8AO$x<mpj1VlOdaOQ}WXk@_FF>jJ_!g4BP@eYi@6?eVjf3Y3eF@0~{Oz zV+G1y_jq@AXK(+WY4!I5T$pm6NAgbv00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~u9Stx!82yE?0003qNkl< z2!QS+Q-sP2a0zd*(UkGs1&*udXd*z~jfmQa1P>0j zIK@QTg!@-lX&h-U=kLT-?Q|2TF|!({=1kYc!XHGmZ~$1&c49j3N9tUPk|b2x+9$|d zD7tZ_ua5nzI9Y6(F|}32Nn4|*>0MFkx1?Nj<4RxEK1oRNjfaMwCX;V@;+iy)VHk#C i7=~dOhG7_{Ry+VIx0&qvplj&>0000*xCw`;Q$fhRD!2OU}o?t?(aSxk6%-c9H6SRBfoJ@t+_o z#{D}8I@KHaV*f5_zyHpEEdD!5p!Ma2(+?Pm|M9;s#gwm~lngp(D=Lq_vcLKm?_`BR z^WynDB`;BwC=$IYO6J8B9VtIkR&n|mFY|O=MfHzPpE`27HrD?ZQoz^G*dx!-kRTd3 zBUbTz_)=>L1fdY56UK&g996~+o$rfz!*M>xf8-Nc9p|k+tjsQ+|8~PmE)Rzw7{X(M zS_VE*8W+=!VbLwsy=fKsl3`w;t#C6fXzs63Wv89f&J(8>V|UYn4+enoL(&|6BeTfA zF%WzU1~%uo)eHRL?rM6RtJg$NT;MgR5}yusF3Ysbf~o%-NP z{0CQ%7hNC{=;B{`D>|M3ul4A`i%0(NtMvFn93%y_yjjJ)StZOY65gzi4}3x41qjTk zv?$(Jot#~he6waBShH&tx6Z5XeyMut+ez?GI|NC^TwfLU7NAB^!fJKOftuGotjYTj zkit)q|MOD+f?vQu_&rB28gW`utNsO9aPU~HkCuUa{U*?X=zGlTTaOVbMjTx)X7J=9`w^JS*xQ$Uy_c3cYZjGA=g`+jZ-jOQPK>O8bL=PGA@giK z=vT4Q88~uZ3+_F*)cJ|)JtjD^p6`mDc~AZI^S)t=kso$1&Zd0~?yx@SI`Ll6VQ}>S zlz0E>Zjk@ne`Oyjm^b|fHs537z1c!FF!@e?$FAD9LOOcI3$cT{np?7RM;Z!>*wI6^ zrWYgUL68}J!NuQhUa<1lTs+uri@P0j^-kgk@&3)YXEFWLNe`NVhyfSJrvNT)p84eM zn#*Z9Cx&M3mF^ijUz8g=^tD8RN#&Kd%BbuYLSk`L-;NyyQt{6d_qp)5jELobT7UZm zw=i@!SeFwMij!U|QI{O3J9Y3EXFhtT@$kl(KYaM+A3kjUmzOR7m9hRIIS>#U^9z|g zZ?KDRb~oh9gT9{NZzZRSd9#gst4;X&6=B{={M|n%@Bd5ka#&_za$a%x;pOl%tE?l% zsfSlnj;xj(S+6^C|Jsp5@4R{N+BX98wb=aO!!!RRIerllq_sTCX@~!pcV?NM)BJZ9}2x%Bqak$(Drk(}eUVTWy)ustDKVyqV{tevCp^`E?b`P1wF*YzKg zlU*$YE0CPbYT-Xgj$6#l0Mc|NKJPDIkMXr-K+xLEm;ZSJAjsW{y#7Lu6c#0{7p1Hh zC6uUN`#(zzxVoO4x0(zHdjW#jfPZ{}efFZzjn|5&DRRm{(Du$CGTDSbneV+ z%j%N;|J4NFmh<*ef9HzM*wD;Xb46+Av9FuQUo?N>+#Xe}mR#x|Ejs*Rxxy-eDAaTP z>t_OK4ut!v{N3;VMX{Wm*YP-~-TB7bPXPHw|)Bv5t2-t^F~b&e7|yB~6Jno3PtT3rootiE?mkbG=Zp-VSLP(l+)Ip!1qy5T(6pxX z_Tb>Xq7#?Sua%ydfS^fAAo$zS_hMYTAgH0W$nPv<=ETlpH7$ZcW|=)Ln^9yFKj|Jg zALqkr77KGP80=|JVuo_X^NyPHMZmMTla@Pj-Y))x3lyT?(EwTzxExUsctOp#V`nsEYsK1tB_)Q~;{`>G;8le+~c;FU*60{i<0!af>$6G3kl3Cj03%L-F0^wpRzZ{V-U}nEtVMaqCNVEyO zB%PcclU%+VYNbO`Y=Bv|s8o(5X2m|?onI+E(pt1Aiy4|Z8ave8&|Y-nZc%Pp^zNa1 zow4kOg52DRlnaT}zVqixPb^wddG3U7qdSamK4022l@?tV8#{xQ)#T3?6&c0zpL7>r zo?(^U1rFE`P9)5i?trAnDFy}b z1#}1W90qh3f71QJajRK;;k~6jdEvqVBj|4eOXzO`Z_0lga7xI22H%;P8jS_T`NxO? zm4SKA*MLFozCh>C^J@L0D4_w;n89}@0LPEUKMw}F47$+#BWoIMEC9SSbg#5Fp|&Vj zIWmI{oEMnEcTUV;Jz%u$;5INk`_SN8sa>4L#9qTr zoLWp9{^?2aJ?#l#vVVD~X~Iti(HoTzo;z7(xiENjZh7+s9o{2Bb};ZyzBTR2A;4ka z!(L3>`CR{nucuHR!v+@uzrJ8D$bI^c3*g&V(w^|XnQD3LkbgYi^ef8!_6R%$Fy{+y zc(DO?``bGJ8H#d)zPSUH#|)hh{ife;@FL(wgM0h@o%{Ue9#GG}LBWf_^I~3H@IL@F zL**|n_+R92e*Lx=M_^+v01y54Ldh_P@nU>K|x%>@!h=YyHgm&Z-`SY_r`z$-C+ zmTVHA4e?WZrRb!1Uc1lFHGbB`%8)C576+=(V4q>#_s;-ed-1)}1|WZcyC>GQW#c|9 zEH?*G&u|C){cL>q&>CRzdF=`D{558gH31wo&tQ7Hal)r9o0z%>Bw_9X%U}cKu1UzE zmDPafX-`~!kEORSzjvY3*bKTfeRm$ypBPV>2in7jMVcpPu5nJ>P5BTwZS%D6l!4j& zU5#I;&8^~j&WXkMApCcq88mVg+0*>)7cj!e>En+(W2SZX+kfab8#5pP#)n8k4a-+>a7Q&(PjrS}8q<=Uzb>roSG=CJ|`q~wtNcR#kiy6%R$f!`2l2oe6CavzYe!7 zwDFsB6Gw!yOu2`I#s3498XqT}eIpDs+_r=#li<-!uk zS4N@;r_Y~dS{R6lg6(U8A~7b3{m8D@3s|$gs0ik@z{;Uj7n9zjlp(#mTmi>usOE&m z&Gw475tD35+#nkk@X#k*$)km|ve)FfnFB`#Ed@$BgGaXiryP=JnIit)2$}8hjflF9 z@SQUpOL$Xh@O@k61Zyh1siJg}Q&D9L8+#}lH;D6g-18YyPECe4txxMx;y+${1`o3W zZ>$Gtni?J=f!&I^E&lBjifKAb7=OS z%pA{GjfD+cd=(P$M1D7iHJm^0Y$$H}csf4HvM!C_CTJs`Uu52Bi0CTb>GXLgIYTeD z#vdDOzL5;qx;2uO-Bo%@6JOW#`=7Tr$*c-8HLx`@G&H+~wh)A6lcmfI7@7-f!wE`g z;5;K}$E+4XDq(mtD29iYEnrY(3lfBhTDnQrT)Q50?7GY6a!;mq-94&3$!gMLb3;+PqjpCMBK3ChVw#8X zxi+3o;kD#QX}A}jRUo01MxIzM9ZC|T6y9SAkPD!+&dm;J&2BH;*m7KLFe9ks7(!~R zfnWnCqB#rQ45@xP_>8sVmA%k6yZE}&an_j6IOX5zS(bIfj5atsa5$tTzdL8l^9Jjp80w7EEN7@Vwnwz+04j&2F5JG7DD>?0~1EYIvn*zl1TkMKS7j`(j9=Y8ke zr`H#24}W;(VJ#M~@~f>?a1$c=t33dyinf?6e2EmBB| zNHQ$22>)D!=xJ=8NDlXeNE377fbLYA8FR4Jm8?3JxP3k(W4F2YQfQ8QMej1B$;ITL zjREe=xsLH=i~ zXh&UB*xa(Q%Drry(!UzKQ?u&pn+dx$KuZ(Hh6h~4b-aD7K>Zi!u3iQ6EzexcMIv)D zhIMYYA*QyM)ClEw*R*se$rppHV%PxN8Ig+;5+g${Fmw|T-MN~R9_CQTDf^6HPF_|s z@0IuAB=euI^9#a1)5+g>h`MZbqK_(4^2R2@#V6xgl$urJi4$?GojZ4W(B$s)Gtbs8 zYft8POSFo+mCx2j9x|KmTEhaHN+WtMuB*KwByeZGYPjXA$u5HyFptHxe)^rRMK$7? z)V&ngv1&}?hVr+pXPG8F(uOxyVgiJA7CYCkWl}ya6p%>ORC^d1B_-x}Lj=x<#4IE_ zqf)UTse+|Ep5U<;6J;S*asH83X8WLlzJ%7}HW!m4M?z~q87D7Nq{kNHHupha%8x9_ z4^DDizI*d^8S9e|HcC}qKS%8x_4AX%R54Y0Cm;ndSf5dwpvibW7%-fxl-uLF>kX~z zdT08@S_2egySb$!lPC;AOSWh5 z;06QAdRYF2VjseT1H-B?M6}7Z zCKx|-=>+Ig3-#oA{ zB))!V3^3GcXG=?dL_|;end#EJLt`W97X8MC7O+^8PlQCCObzV1JA2fxpE49hC3!d2 z|FmW-^-Y&f9GL+ss-m+F=%!KI=sF#ANp13Nf&18v58!*H|@YS zmT5{sYwCxY^K&qk;T8)+7T66^>F{bSOzXvgXBS9?ac^rY5h)_ir&U7b=Jdlb9ul?o zQ~=eAUh7ZnXKH2~&diCA72OZw^L?|0JsT7GYvKs+i0>11w|3po$x3;LSQm{OUL4Py zW{l~zK7-Fxx`qT+8K)%Sf!Sv!OHUb7mjBuz{$LetUqX51YK%)J!P%QRTv9!)wUvfq z(eqUjnjA>_uD1+@@w?7N@-TSrW8y3}PuaIC1I7fo?l2ySB9$r>g9Y2_bfu_X_*9jC zbi4I(|8ZsELA{1YGJo$d8GQSfPeZ}CAI>blREVyQS~Blc8Xt6Hb;HiP){nQ>rqd3p zfRYtY7^ieIN16i0!oU9eR1?n{2Y+i`gE{>SGq5ZDfp50IZp?A-C^zw9v}cnxh4FSv zV|MW{bBzHwzBrCd#Yjcy+r-U}t6%~ez_@ZR8Iu)YRHzq)`+(uliO<4Okl+}CQ$*x) zq_+bOhyhMr-)fFUvmH~kr%|9y3?l#RPbMP<>gq-o-7Q= zNkfCrojlP}cjGmcZxWbh&r!yj@ueFB52r^7-_e>%5h5cg6b11not|vs(T;UXqURVS zvu75AbwLW`ZDQ6yLwC7Fwt7B-*YgFWj4gXBg+~fy@C0a}r8_KezP^S`wbuv)R3t6K zz)h>9(th@=pHu{G7QY2Te9vQ>?QjG&FuPEV2 z%1Pg-F?={RJ8*SY8?Rjx`P2c2#&^dN^#Rew!jhkEGKV+Bc}?jq3hNx^)W7Iyrf}i21##zP&rguP__;pFEIa zYZL{K>1SM1+TcS?>-`pMMX9PQ&l9KF!74oIn?9aimCOx4X#^77H_vlw6P%fu%+(^N zFL}IQs{+QLxQopaJ-0jr#z7pudT`BPE2)jz8z0+RylJgKvBsbn1sEku) z2y2X3pD%Bk$Q)1A#A}*5Q#A+2StU*D?rB`xTrk#9JhgGkS#fozWgtO)st(9^Nz+3C z@S>*fCm4S`+2mW6x>WfU$rv zz9wT09b>S7OFp8nVs=Hc_NE^58A_TezUuhRpA^}-*4+c{f&w>2%c?>{h#G+bVbn*4 zGDsOAI*dY`-N!>o)J#3?txd7W)=P75@yM+GI87w|97ftOfoLAB56hsM9lD|zl~)J# zD2v$Yl3#sqX`OPo_RlJEev*{D_l+phFq>EZTECH*xI-K4vH5;yWQ=K5GcKSwwYQTK zHaM(RBR*nb)OjYy?$*|dx;Y^&n&>hAWz|?F>KQ#!2u2cLcO$I3^yF6sfvcw(H#p9U z**MGM_C;=ApRhN;fMt=~k1A;}5tA!4&_s;cIgIv}Zt^Vcw^qI&^byj^U_7DWc8Cw{ z5Yb54!q7?yt`k8Nl-ZWFX@(Itr3FS>tJ>lAtl_2J0eWx}=_eOIFu&bPg1Y~h*cW{q zf`07J<5ni9CyHV&mpacUx|$Csu*N3zQ^0YXJzKc*ka*3ASw^lIOJ+El6j7#k)cFNQ zP1P}q72~c<#kiq#mTtIkGfRDHHW>-`h%yt5DHDd-NtfZ*C2MZj6M~MF1n)7r!Y4N# zjIRIex!a9~Q<^F`0!zfGb9BUDn7MM&Fq3xXnM+^^TkY30WvU8&BG{w&1Cw&7K&()y z;EYKD&lUa`F*<3W^*c;@hMU>sa5%E1s#SFuWo)!B#IgZ&{FDTkrj`IoW?p#VWM;(p zMuaROHL%3qlp2qgY*syXhg8hjE4jQ-`W@K#nOw{`;Av0tR2OS z?;JX5oN-m`9Lo#_zRRgpZm_DUM5RhupVn3yb6!nwx_AcSt{}g8durwP?F(X`fK0~c zwBv@P&osp)h3d7VfPG7*v90yx z9NpUItV^2gt z_5rhP-$W5oL*wTXZ0_SiT*koWwn*lNLik(&7EgU$F<*~MfHox+!25-BXYtuN2~1MJ zk0CcfsZ_`-X*M}Zsz(KI*;EY9h-U=AaMqNB_5u5tlq=yKb3@je#US9?BxSiN`^>W+ zPtt6_0@Z&m!V3iM4=)^{tdfD@M?zB!x&xZM z=*qS_u1D7D1`1SoVUQvt&#T*e$&hjgC3wf-f><@x*;>oFP`*-6Ql($GH7Kgj?Q27* zjkXwdT#zcxNrIF`u?QK8aoqCa6*P=ie4H3u5iP|MgRL-?$4*X{4X?!1nzEut;43N# zHT~Y&`2DI+<~w#!vNekMUlV7c@cp47C+|-l$;=4&2IPzY4jx$iASVUvZ~iy-%P;%! zOx(YD+rRlAFU`;Tcb@kfKhi~p#1}x5|2UXw8WGTXp}5=qw{7wHZrsGF>lz5iZp!qF z?>d~K@{}Vt^x8b2zHU^ctlPrZj)pfKKDCiIKPv_BN_h6vsD3o~2H&!-_Ds6;$5eYX zV|{f^L@aQ!jXJGblo=76GPZj6Ppa>n`}v{kuMi^!j>Q(-8Xn7ybFTZY5ouq3)H!?9 zW#f#RDvH&UHV!XDFuHPWe~-rj^s~NnjXB9tKREqP%JrF@X>reJx~YwTaSO*7P8#!x z^1}XuAS%SNV2>i$^NQgr$C#d?O2Mbf2>lG`Qsiw z)ivVO0*#2(bsbj8!j+M|ni~~YB@fon(!n-O2|#%yr4!DPs9GdEyif(Gv+!}HR)0h9 zn|#2?7}tvLdQ@LM+;yGT8>1;nSz5Tyjl1>{Ys!+7hl&e4PJwHbacx-n#udWhx$_AJF-LBR zF$Awf%>uZZEDtqu_QmE(EqtM`-!7)Q(KdcY)&hxvJtAOtD+)w_5Apfg&|-ZRm2l%> z)jGQbiWXYTW^=b#u-F#KAZIHc!w43s*hGRPJibR-R-ohv#8ELIF>;)#h>TUa)vA>k zqPs>;r9tMLB~lo(m(M9sdWAqhqw9WO~3VElSrbayhEV)NU-45(23dOPEke4oedC^a82LF+pZ=K$#b-h6Ic3P~IcR z>?RRa0-)#Yk|#(I1Fw>UFV21p<=9axRz>Avl~4=P#$Z&1AXp$-5Yio4J>N!hP^Q;yCoy=5`9Rw-P30&aMCV00m+SKbO}WuI?Lq1&3QeaYm!*qP*+4O- zLR6d%<$ylD!>d-w$Xg100gq&m)GE>OWH0O$x|k|bRD)6%g(7hmNVTS3eVnrB5~4tv zaXeE#xnZuicm$RW7uFAogL(^S)BrrUFG=})6IAcenSYqUcF>lYxpZFo~{eAk{k!yl! zVq;vObB$<`GGwMRN?;%!R2CqVDIJz74&PIT^*bZ7n>YZvnkr?kO4nya@%`z}hfbo5FEHR&35WR>{!8Z z1~7b=KOwLX;|zzDl3=OOj#J~D0bL-bW*r&VtQx{@Jn%;h0FCi5!)D!+8}T6(8K2d4 z`9@jUO%>Y4JdfMx!pYK|JEUr;u&Xn_lAE1fTo?esNFk}|@X07vVACC6b#LJ#moriX5bqZ(hmIZb3{#@q5TRZXLu(YR3!qbad&OrU9Uu)+(& zRpCCSH<{5@>oKN0AGO8x+olbNNBb^1eVGi z7EwSBwOJl5ZordtQae@#DeU6Mu(UfYTjx$Y=7#|k?p{h*aS+65xGi+S(Jc#XL1H;! zHbZW_W>FH^YlyQ3nQ{}KCR3YbWd?eH7|)MZnq)&zvlVTm!yPhI=rn9{u|S0|#B0Su z1IaL?;OUUonys7#5*uia&`9CDHLOZ1+~lS`@wO%D>|(*DosyWJ!)0d}5D7ypg&)%( zDPeB~nwi^%M+UY4?B0zh0f3ud1}(HEkwc^~7flPzRzPsM+070V%%cpVW{UuzK0;LK z+!$J=gSimOj9d2&cyAITpqNIEq&K!OnrEe|xW?NGhdi4}1=w5u zfFWHuv|J&4{qXUF|LsEGfnWT!@s*qsS<%0|HoA1+z%PPQ8$ZafzRPs{YasiJH}*N^ z{@ADZ0sYP&8tngl->x6*Nu=M7F`KsJS3L8gc*BN^=M4CC#`SK$w(ww9VPRn(3aXF! z76KCpoPW%tWRBNuRESSb%_jQ{WnyVbN%)(qlm5g{b5H6u!8O)YO1x%FKcETQxijO= zfw2+IxYoy9n*PWiH+Q4@{R0lG$fyh_H#Pth4DJ%?I zwS}Wo#NA|&YRwyONd@2XI>^>?ST_b5)&&|BN@>!13rbST*G`wl8)x(!R<`Hp%OyKg zL6)I7TCx%UNH;sZHzgwenJX3Kdk2DnmWpu_nSbmx5j?VSX0$AoK&}+GxXNw3oCYJ?!SuVW50O)y#0?$VSE3+%eea%bt# zxc6LY%^0~ABU)2v1#uu=%Y;Qpm=&7moy7qjmcXaZZZUF;$opC@;^bc1t_-gf#{(c) zWelSM<&hD65Y4t5Wx#=t2#G`LMnwuHNeew9wDBR?5bYvvU~pMd1uYZgr5kq7#gN{D zaL+8jp+qeN1!Kw!;Fo4$vdtI9M=lb((Sm&zLPkKd0Olk$25AKh6l8ANaL>n+S^=Ub zN%gpF62>8>sY-#cC}C3yvV9XWdHS_nxloSL_CpFJq>)hU!*%2qh&YRwLq(EBEPFnU zGEZwQ1DUEXaM~k6gcC4X<<2+@AV>wiCBi{I0 zxz7qhEPMfgBm}H;Hz~Ap84znuE~?aZSC!)mcRlbp4R%R18MqF+_y))hVnDb_ztCC( zTg)JJk+r}`3nd3iTM%{`#HA6S33zg|X!up)3W-{EN9BM;2 zjn=0$3`5CwcN+*@yCuM?6vx1_GM@1jf?$FwU~*a+pmSw!lG4mpM>#v-CAKQP zA%DmpKlZkR$WWGvL^Wou1l@rZJkEud7@;g9nJzoRgCRm53T)0SFNiaj9CblCBxsky zy103GE}34hOwS?|>d-<5jiMX^iQ87kU?N)>L8I#E4Oz2Ha!hR;iBR?>;c{MjKLtDz zNlq8V2EA~l8UhT4J4#pR)m|L3aK#sdo(h9gu?sWf{o-vK)-RJ zx5sIWv1T9oMc&TYNnb(Mk(ip9QQ&x)N>9O_>v}PIXfJ{kCs=atS75G+J(fuA><>2t zaW;KY#M zw@}C@NzAwhko_XQTY!ehbzCYXQiAPwL-7h>KO_~I>{VHC4C&mghn8z6ptNHPX^*&2 zJ;XL`@o5dSk%{wG%D&qg^I%(G=&mDsc#Gh|m5e0{NjQ5j)F829zq#)tW z26?Y*shXyV=5+&S^s5(o`tCBTu4(<~t4z4dbsW=l0SELTNPSf}OrxK!oc8CoQdBLU z{m1*!1G7bKWDD&aC5F@hFeC6qFxR9LD_{zN+N0$$Z{srSS=_gRQ?W9R02p06)Jj65 zw-!i*-{AbsMCiw;{iDX==3bp^BePI8{v%h9 z4X-HkP12kIz*Ye*$-2`(=)=W%GEuO~L-NF?j#aoyKFiMnC|`ib3gY~iR||$WRPowz z=iSKuOj|zA>MF_e8B0|+2)#=`Wnchz_d!CUv(qpIYJEV) zmxyI~0MgyrZ+wvLwe^`kR;;1LD$1}%T(SmY@vfG7qU5A8yjUGvr7rX^J<|^qFdIOa zh7tfef9CQ@xhgS|G2tqHYO4UDdl${19j{vY@i}pwSS5y4fv9-hYdBCc<_caFQKxiM zV>&~p@g176km4bQiGyp9nbP3QwaL*9Rffzba5^jo+JMc~tLef_y&J0MqYl=%Yp6*# zB@h_n>KgtNjU3*oW>CiTV3;86@lBIl*PfqJ%oR+H5hg?FVBOu$(>K4mzeljQ=tq&& zClc?TKKUcf@RhQ^s%jVJsMM?Fdu1>G{G2o|caMkm-uD_V;5p&38Lg2*=6SVw4U;Ew z{;%vx6Tn5xt^#OY2y(Z?0~{_WSfq$&mAcdkm{>wj6fYe8%o5O zZ-$9bv#bCiy>;#jfNc6g3j`J^q}^xo4V;aKL9r0M617pZ`{W88{FVW90XoyvOM4s7 zC}cM1`1^Kceh&Hc1@Ww2l$;@fL1KCm-bZTkfZEJ`Eji}TW2hh(=j}ba?;w=I%{KCwe=5+sI0Krl^y1QFmmC~Fdgc-yKh zZuS!|4J9HW(PCQSB7+DcL(%gD4JT0^dkKsO%C0uuZ4?o3T~UINJn^DzfLFFfiWcj` zL|ZukLO`nxNLn@z#NXs-gSVCO1jgY2G)PVFa0A)mpd{!K068;+Lb4Rnd2v3a9Hw_%Y~Ufe?0exemk$^;v;*GN+NuWdkJP5t2qSEX5>8K|S)} zWibV9P=MTRD94$c;9_xORw5&+f=Q;JwW>%Q7zFG4XA$kq>A!6c9C?$O`D}e)eNXN5`1haE ze-oGSQte+?&z&*%L*L+%dC-f+k4wVf=$s|t&7FP}Qt#iC`!^W)+XE7UFP7hbBKR}- zVM6cS%*U^RAMos!vPvfMS-%+RwLEmz0nu)Kc5UWd&*k50zMSYT95-Y>C-lB)y;hZh zjMeAmJ-@Ac6&-u%o+K)W(Ne@aEr`;3(;bA5NxH$q>J(F@3iY_5aOCvfzk}M*tA`@b z{H^Ex^*=7W0^(>!NiniYuKq~{bt=-xBdoEkVx|wCI#{?(HMsPFGPUoz$9_DvJY?1A z0&rk~ueP8}rOr!Hb%pN{=#mmNB_3#Xa>sgR3(>H>;%&(brZAox-?^kK3A+&x%_BfL z<^hi}yQGR)oHygGWwcSJ%KGa(C~||qoOzQ?4@K&6OADwwm~t3W+_eS17EW(!O7IMp z^%-}LKk(7}>kl-qI{UN}8u4=r$7b6&S+}E~Cs>lc43`v&pGT1wdMy!6_5BV@EU2Jy z^?`Ktgf`t$;j&iPeBQX)(zG|rKU=skm9#hQ&9pC9b33L6{_V>39DT^@P|y4S7DosS zfr#kTi6YnGx}x!)KVB>USHsO5{RemEqKHuE-oei@?x?CZe27A0h+LBGw*@o2)r@S2Ay#*=|+FE#IKub189#nh(t+J-n13X6Kwn@lOXm&|p;_L_MsMt&movdMxnw?vdf#(Ucx`9sU~GN@xPl$kC^I1REsaeX;- zbOozb?Y^W|EGap`d;m6riW}N0MksHpAWl#I(snWx;ERgB#MoMTlmj-1*wO;AvoI%= z(qRE`A#a|*p{ICG)I6YjuBbvC*DPPjp*Q-~ReCr-okyiA26Vk*{FYa3S{&37N|=tT+OtGxRIJ+6!gkC9spIJgZGMzj(6K9~%7dwJ>2%3*T-CED9w z&IWM|q(_wF_04BfA*hlKCEo5gj+NC+cR~IAtn6s}KsckYQ1m=?TpLe}##q)(CG#TH zSZ6<0m+{;%JAG&}h&84i->6+PhIyt9nW|O8Xhre3v(HlhfEf|!QwN5xC97siRbexi zY!#*IwX6e_u1<1lLB>St!1omgt|sg?+{kPDNSxr%>2%?;>zVTx?Q89OkA8*bm4A0Q zFa@|}PRz2whIYp3TNtFJ%Rll&PgEZ(X088=<&sc6$-Rfcc! zkk{&PejH=O^)Dke&oxaYh|Cu!aK?rRKpsH2TxCsnO zy{axl_L}-^0zqoiVMRdzL#-=NGhlT>3#*A_fNT$*TbA=y)rDctGoMu8G#gr ziF_@6Jco^M6i<Y;x|Hcg^l@WV7ZrIR0`zOhI$&cVQ}Rs(z}8o zis7VsSzwfM>1i^j06MNx1l*A_IZ@j{)wqPgz;L4~kYb3|d0Y8FRJUjgZ6r{K4)DE< zkcBjg5GE@uG#p_w#8li196A&g@jz0wCLjEAge}f@V^!qE)+Am?4(@HEL<<0vSJq7n z!m7yvD9fJI(%nh|b>EK`Fh1CesR{)IB2S$11n(w^T5=Fjv4+>c0%~_nxt+owMO$E+ zyS1jp%fOSi5D>(dgOp3PdkK1QW$#V|Nx^*9KvWpMLsZ&57a*F=JtWU947sMG@;M-K~A(L3e_3&o;(GQ#PQ z9b3ADvumRwVr=~fC?$~rwL|a!B!#p6x=_|$8?fW=U)H~GYA(|Q5i>d>Syks0wqmlR}CP@(0HZ~1{Zsc#j8h0Ng({J9qVO*s+y)z($PQc|HYfN zLmzyWce(lU2NOSUZ+5)$)2OERfBD(KONUR_PJEjF=J&nELUC}oI5=QpJH03P+FQXB z86UC>;Be;Z(eUerm^f1fQK3CG^7{3k7kJdjm`~wl7RT4kiVB+^7R+MBZbN{_=<=Ng z@FvLCZchSP&Q=Pevc*nNpkv)= z5W#qY&>&P&RqnNtj(M#_D*Siwyd$#keAi=+@xsZkxu=n6>aHc(9MzFq@YEsi)0=dy zpl-o|q&Ma#isu0H=Yl{71V8mvaJhhbA-@$Ch;Q*+Y5?2tpkfCxH@F-`jc_nc3MT!6 zu1Fk_MkZIy1E31x1wPL4S{aX|LyTmO6_=x`_FGcvJXXouT%e_icrA94Sg_R%3fd4n z42lK_KB$(jd<+BSA`l2D^C$uI1POyO1cGvVtAzJR3UDou8L+@^HUm_W!DKn`(z40( zZG6(K8-x*n0?Xp&tZD;rGRo~@xm<4X;-LJa8dQ2#Qz1~uho~TGkHwWt@0fK98+9Tq znbX+IYtPDt4Th)-`PrCDt?)3Z0ZEs@x4J<*BUJj}S#NE+tf&IuaI)IaZMdIu!2$v3 zEr{7ZuY($eN_qia-cBPml&>f`QEcRnG+8yggsId0&I_l*R*@VR+@UrrA*x#fF#_|s zk-$|THz*-lWNayv9P&OLg>Z%iqFGft~GZ~k?gp7|?_P$?@Cb!7d@a&Wo5UpX$K=rTLZqd6M2 zsa3^`6~dHp7tB8hArC*JzxA%YB?N0wojF%PzIo(Vl%)um^mfhO?KsA(Qqq&|k7Ng| z?~>?}mmmX&r`gdGA~|C!?%GH&qf}0M<1LT5H zgQzmbE&7*1Q-c(HnV@CRPT9ko!aYoJK(RLt{DkW3#t|>mU+8dk)Tj0+RE%P;*D&gP z4$2G-28Y0jMg5)oxBOpS`DI4!NBh6(c=Mg`o}XX&W%KE>E5Ew6otiGb|J$qsI|qJg zKh5Y^|MAXS#OZ-U7j{0(dZ+CUIR8*^z4>%QB50dV4_v>nv7K5S3(oA;oX#`-?$*!S zPagUH{h$859AQUhxyr#0t)SM(z{Maoz`_hjkQJAZMQn#M&>XAQB`VWz4KfgKxq%u^ zx}|IPvLO)Nvqb9cU_ia5xWPoZ8AqTvjo zpnhIjOE0Jp_T&zcEM*_J9?LbOt+-T>4I&hDXWY}506nRL=~#`+r4Gfp7M58I(Q$b(Nd|7ttf$J z8m4C+s2`nV-hrtOw`qu6LQ8nMy(}MiopX45JNHfX;lB@F{$A18z?G~W%`8sBr#U4r zoj9Xi|DOZq3k@xilTvH49IiI3GSC+4N^$jKUBwjIC~~GL(nCx~vWYX5<5;e|$J<^$ yL#rjB>6hDYbUP_C@Ie81*novWoe`LTAj_G6D*_lyId=(|!^Q|mq+uqLNCN;k%hPNC literal 0 HcmV?d00001 diff --git a/assets/house.png b/assets/house.png new file mode 100644 index 0000000000000000000000000000000000000000..c66827fc98b9398190bbc7c1a585a9954a983b31 GIT binary patch literal 4869 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 Q97WbCNquLfLYoFK+%>mf(^zXiHqb6Igt! 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 K#1Tb|P5%eZou(=P literal 0 HcmV?d00001 diff --git a/assets/particles.png b/assets/particles.png new file mode 100644 index 0000000000000000000000000000000000000000..0d69afebda9c70ea47d2f635ca72d017ae296477 GIT binary patch literal 1394 zcmV-&1&#WNP)EX>4Tx04R}tkv&MmKpe$iKSYrh2MdZ6$xxjvh>AFB6^c+H)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0Dq&xR5LgZsG4P@ zlL;Z4TNS!r5yUXU7(i5FramW%DR_>rd-(Wz7w1{t=l&dFC2umoClJpv-LQx^h^IF# zo%23%gq0+P_?&pmpbHW|a$R=$jdRgqKhKO9ne;qygjgtcu-w6{WT?bb#4$zHDBquT zS>e3JS*_Gq>z@3Dp}e-T%ypVkB(aDkh!7y7hB7L!5T{im#YCF+6CVB{$1jpgCRZ7Z z91EyIh2;3b|KNAGW?^!|O$sG|t{2<>7y-I>fo9#dzmILZc>)BUfh(=;uQq_0Ptxmc zEp`O-Z37qAZB5<-E_Z;zCtWfmM+(sN7Ye}p8GTa@=)VPe*WBJ(`#607GSpS-1~@nb zMvIia?(y!P&ffk#)9UXBX2f!$oG_Fa00006VoOIv0A&DD055EKgv9^=010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=L8-V4ip?`pPm2!18+%0K~#9!?U+4CTTv9p&lSfa zIJu-tg+h%Hq@~g<86w3DLLC%RXa=D+&_RdPN$DUsWLC)3rGvC%J7j1xxF|(Mh^B%S zmrk7uSu%7u9qfI%@8;b1Za!|F)$@Z#ZtnTNm-j#SI{}fU41UG<`{ceqS$s-!li`U8+Gneh`cGGy#KZxAu*V ze_d3@^&z2m>#oS>eP3rP6|c+B%+I&PouIe8sl};yH$%W{Wu*t0u3oo(+ub_Mylq0L zy09cTH-8;4CBdb6-&Pn4h1S+m>Zmd{R+@E&@_zvq3W$eW7?cD&+(If*(yad3@|=LA zP^*D{IU53=`NoPd2`*dJ#=Ns6_{<}=Bq223SV6Dl5LA)%EnFHXGj^lXCE zs+zUUMBwuPX!8J9=5)?3YhL+LCQja`YM#EOHNFJcnwMmA32V*tZ1^+f3l2}2jjJTH z@zCFwnvo0`6EM(;dDl#?4+)tF*LcU_r8&R(g~k3G9-eA*w(eB|@~c8TOw!}GpGlDB z<)qlx9w3u&esKcXTmq(Nqv`(AylEzP`j1e4RS0UCiqibqWexPD%UJ@VBntD_CIQDA zb-Z)G)qFA=2h$F&R}8izmb=5X&E_1T@A_;sHaxf&_x1wYWBVvKOLAi~lDR7DbA^p2 z^e|K^A|CDeSB2fv38B~Paq3=5L-l~5jgK4(CY?G|Y&2GuV!!QiPFbu;m48t%C!!QiPFwE`aFW$^|+CraWSO5S307*qoM6N<$f+MAe AtpET3 literal 0 HcmV?d00001 diff --git a/assets/plutostardust.ttf b/assets/plutostardust.ttf new file mode 100644 index 0000000000000000000000000000000000000000..543960a0940907947dab9bbd16995d1ef89f3c86 GIT binary patch literal 74716 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

3*`gpY3 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 literal 0 HcmV?d00001 diff --git a/assets/shoot.ogg b/assets/shoot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..74e5e7d6fd7e816420e63e60a0a6d61a6bc63e26 GIT binary patch literal 21159 zcmchAjYC;TR=>z5eaBCMbj#f#vmd=GA2cX57aoQNG8sh zDIRtjM1rrRMa;Ah@SR|yW}+vVCOkBWI$%pAW}G-lCZZwp%gJEo9OjyHzq>JW=A8Sv zzu)iv{|CCm(6(!T{EO~gS#+;QtatCK@8L@uExkW&gp{%fLO7ztYnu*! zoxSQx`U-wZ(|S*O`GT~=LSVzfTj|;l?wL#1wx4caz4l7NWKHmr0F0kVS+QHf^XbOn zigohXyd1OsV(j78^+Ab8JT*bd7lm4T@|{CF7tFkK22W z@t%6=uQpsszuo#^qxFwNz_VD@QDu6ohIa2tXm_tiS7XBxh=O5~`P;*@PlbPcD&}&( z>8bCN78+*sPoKM}Aa^m!#-&eJExTT|@p{$fCGIWH{C4w_-)?zkaLdxaZ7JcM5B~mb z^XGq~fBvBh4DrOJzxrju0b}%mFVYXF>YOK7Qbwml(C#oM>^PX+zI@di<$KSrJbw21 zkKaoA_${5k31QHL7EgIg`~Tx_`I1+c{jdL|l@}9UZs(a^~HFvHl*2#nES5uXLvW30KtL*t_~& z?NaRhds*vWE^BGse-|GK@2zBz@7-4;Y;ICJ!eiTGcRpPCO2|%+j`d(4O1O;5gM%DtL&`TLZo{+iNnn7c3~cTvRB z{)mmf$YqOCm-=Qb^DSOBP_^vSv&)`&XY-P?4*)X;o6oOr{3qm4h#1qGzRcRe{U>rf z@l9W(HN|D`FfG|(e(}{6^({yDyng5CfuR3}oRtlS-3^Cb4YyrQ@%68k*S8#d_rRKu z-uUL+|MKr2$eF+1gg+o>?t0TdA;)Wp$po6-O3MA~*cfN`V?rzEKJ?EofDmu9?n(bT zvM_(zK>mz@{Ar5|X8+F-gR=uExxN%k>~2D$AU{2U`y2Dac3vwU?ksAsXxh|&wrmNn zeYNg_+xpSM1qVulV*e~2zMAfA+l3HO9U?o8M<0GO4lbabzJO>TF}S z>BH|IKQMnJ>GxmOKOU-l^ETzdohK>?>G`!?LGejr|y~PkL&4Zp-q9l*=jg2g*N4nRXe6=9Zrh zXD=+E*V-2?e)o-UKG-HS4H((=}&l%=ngpL=9r;0vGUkY zhfnXuAt4GANEBlDNWv5{N<1N3A;8OCeE0&O@z=*8xh-G6X!`IiOlQfG7IQ;i3MO!6 z%k6q2)qEr<248FXb``~Vs1Qh5MCn;an_vE`tv@Aq=T})f+FyMAHm2`bVm1}Q$8ou@ zVDYPEOVICul`Y4Po$H|0z#TN!%9i%}1Mw~G$Id;HlKWTN!tmThiy!s>|9jZWl#_jiy>tRA_oAar$FgGiq zm*3E2JQQBqm_9!=zrk|5_290=9)81>g*m$&jp?`J+j1vSGJzDnN#Cb9jFe+KWKD;S`&y?EfCW`!ZQv>`+aNIlV1k)IM-wDMvO5mZF6 zsAJ1?){A@{H7n}$VT6dcU?s`csQ8q!$)q`mNc_R@(kt27N0a9z+!l6SEne1~e4pWp`T46Xy17yTKU+Pmw|E?pR#p%)tD|IN-OdB2ym(zK zd6AIjd`uu;YENjRrdj(gI`8g9Ihc3M=V8pd>?G9Xq;Wf4$x>nq1NxfZ`gvO4> zQ&7sQPh!X?FQ?!B+3JL|{Oaegq#yp}8p|g|tD&-g^UT(hbQ;7LD~OWQvCg^s(AyvM z-}2AHy9{Z>z`y=UwP&|M!th}J7q=^io)~+D*7zu#2pl_6mzQ(rA1CnaSJQ6`4_>u3 zp^c8`LA(5%pZ3rTgwrn#{tfi@Pgh_X@^iEguFzZK+jfOLXg3)*f*Fl#_tVDvsk+DP z(TyHALVxl86SM;yhFSe5=#A*%*xmel*wp2r)1OYnPp%82H=^zQC&q5%e+=AwKi(&B zsgStDY26E^zwtObKRnqkZE>F9$W^RInI`~dOgT2e`9JNQJTot0tj>Sp=s%kH5C8w) zJV~eEr_uj^++zj_6DQAFg2n=7T&jG@MV)5n|SQAh7 zM3&YyLssIcNN%w z`{Y1T>4_fRkduYkb6mpbS0^U7U4w}C7Ol4Qo(<2hpN73{XZVuFRVRCjN>85p1W5Q` zcch~M)4gHZJWc5a^jEa{jdvqU8vEbfUA$@=nrwZvmoHg;Vn#1kj~+g*uH($v=+&2J zT!+!ttC>`axA}(+6x4Oimfq;qSKcMcA2flaJ0MPb^ljbLZNL3jP8XWBKlV6Lc%sCT zI>%d>1uT4oDeRc~_UTmze|vQ2zYNuSr&M+?FT2=QaOo>sU)+pqj>&`jBmQtJK&DEM zBoorTf1-~Oro zvB&?Uo-!1^dnTM&6b<QOIwQ~8_X)_<6BUx?pvU2PT^70Fy1X1*44k0@t1Y^sd z^rnzk#y9J?hwcd5Y1kDGGfjfGM%ze)WdRrzdd#w8KD!j^uOifEr)R@A?;U*Ttf#H* z)qMxxxPOJu3;5*X^Zc$kw>5o#-RjC8ZH<$D|EMwNp@D*h%WsrFea2!h^A%1@HAZIU zcGZ07EIze$Vtmm_{y^NS89h=``xDE zD;k{F-&}UkcdS2C( zwyx3}x~A^t+RiV!SFIym^;U*4E#S$IvK(GeS?n~-W4CvWWT zk1jkuaCgX6Uw<&TYs5B9qvs}AbELTof=#5lzDVhb)2JCf>2<@D1>Fldfv8BP#Ih#Y zTm7AlQYK;KONn^XDu6u2Tdhi#YGPv~hJd8;sE8CuP8eUiv?D`Z67g=?tGZ;($;Kn` zD&NtPjjJ|(aeB=)F`!Fa!#fvsS?sMvF)dzPQHLEt*<*BJxC0NAYmo#Pbu+ z-&}j4X<`K_JTd$iJ}#2vf!O#b9)vT zR14Q6ebV7LRdljRy&$*CyL|C8{n3WKf9mf3i_X_Ev-s5Mx5n+(_*V5)i0c*vuQ6A> z{SforwQIXhpH2&EBDTgnV?&Qrq^S5Lf$UOcN)B={U4L-VkkrQ3OB@$dZ?OtN8SFef z4WA`lsn%DA>gihtIR5fTohzdt@Tc#QhIre;$g9%H#8oHSPo6w^jBnpo?%6f4YVnz4 z1O1NZRA2ql-7oiW=X)CN#Es5gGj)xV8H7h@$?aPE!Mx!=38fj?HJv+Dv6DmPda)*~ z!=_W$_BblyLx{q1bL(x~*0?L%L+2A#!(vW*)AAAuJZvo+UPEe3^}r3$C<=Wr%wI3z z@pbO#ld|>4Swi^hb-7Df!}p&v`@b{&p)9iIMAEV)KXWBDFZo&gxQo_1#kRz$iM4Mv zU$qS!OXQ8tZQt>ZqHCWVb0wxma-E+vI2Iay(Ip1kbw0M8Im^q@Znd*S{+Ifa)upRT z9gb)-k!z~U18N`BiI!lW7_9R(l*lbb;>pM^NAc&x;H&8o?Oh!$kyD-J(asXLxxM`H zBI4^#={REvws*)aZfAY@jrU7f^srFQ8;wQ^5 zHGHb_?HE`u2A{vYR$M z+&}me6S6f>6I4M0UBHyp1j@~(3zbP^t%}sLiYlIHg7o2@_@F$_llFMXD})o`{T?q* zI!J9G8P`!nL`CV*TWreYTTJLU4W|&cK_ANIU`M0zmYm{~LMIFHUWZte6uGsN=+pru zka%UH9#`=TEktHFzv=uQ5BYweoi4rQxG5iYn zu3_s0LKlcqMgkTU7Y41wk%|y6qZl#?XJm;)LP(>k!YS3&>9)uD)j0LR)kNVW1%3T* z7L8WR=n4M*TXB(41(o%NLsa_b{(GecQC!|rt%n{<%#OW}oe-tao2#>vE@?vA77F=b!VpSaC(s`Rl=)?73Uep)GMaaKp%h^e{R9VENk%UQ9gLS%G42a(-HI>R`= zaOYoE_B8aQ=nN{u@i`S~I=8#Mq=l#>w=!;d237;Hmo0+KY_0AgUMvk=Wc3B{6z{xD z>|Nap#Fx(|RGqT~ckGqf1!AM|+sbt76Hzz4UedLkxR<}Y`(@{xO8}czx!F{`FzP*3 zx2>$|X1AzQ%`(g0kJesne{#>;?OJ!cHq~zbXyo11rHc-z6s>#E5`3p)?=$s(Z0LEo za@eg_yUphI?frWWNv_|fWnaksDG)0gZwHeT#LYyRqyu97V)=1v{d&txXB zkwmuG*v8CI%`34+LbBz=ZM{OdR|r*;UWRACytsXxIbdahdb!B(_UL^dRT~1YC~2Zv znJhD2mWaHOXap+}tei>Uti)>NB&$`DIGJd?`p{6K*{(?=dD@yFf>*kQf+Z%Z6t7m} zB_u5wZ~Y2MSE;2KMx$w7*CZ)k=16!V&g;1hA_!mVsOF5rrA>7=c*)Bko z6(T5TL9%KP&ZxFw2t?votHfsG5m1lrc1SG4=}l~Cs31Te>H+ewEJ9eK!A)5W3Da-{ zPs0NFLUs-MBcz5CH1x*)!VrehDyXFD%zrb*MDNSs8DJ4|M3W@})QXL0IV}M-F;>Dz z7A`?ASpq|cKrhK6IyAvTz-2dc1ne;`$tGH2VlYMi1)_ii?G8#wBzY@SV3TbNN+Ga( zNPxm6?nW|o8`TBC1 zce|^)yxpS3-m6AKhnsJ|e7e-(c193i%D>dV|NDzK-q^b~&T+2mtgDa?N@u{H5 zy#W~kWxxiwBjtSkUzt^8Dhmgvdc`GZUgNM9C7Tr2lqc-q%nKdY~7?t9|I}g_K zfxT&}E9sf)ZdjpIAxZ(!eYj_0p2F&yAy@T=by8VYmWvX#M1oZ5B~}Yz!LpA>1RI!1 zY!al`4|= z{+2@p9;*KWqPMA~{i@(0DKMJkDf0qm<|!c(TieNznZX$3I?|iIB1^|K>zmU6a7I58 zIHCgk{q%E$j0BSV`+xTmMxwmbH@P-yz=9ygmd@zKQRK#pf5s3zd1Y!j=^RkO&U^3&uzZ9WzOi(LEwNvA5uy6jP&HKlD9v#{8KB1LE$6tAWl%9Ed(q_*?n6^jB&^XdJj!y3@;Dzz1<7RKd z{C$l_n@>01Scv_G zJ4(d)%PF~bmCkVD)l%Z$bn0ol*H};CNR(HK)etY$w zZGq!bdm4_(oi~=fu<~Ad==OKcl&5a~;j>8xKL3?ln0xP3)Ms-i_21BJf9Af>)lfol z7(|@GQA%)iELlLh(~PPRqHCVcEl@6|2VO~2alPAPjYMyeIU8iI)expF;8lF`2k~Ecv zjc|KC`EIYw60Dt48_A0&;lz`CRBFpVf=eS5YoO;Uq*`8s9J!PYXw%c)how~W*Z*=mDZCyTs-#otSa zS&Xt1waN|ib0;y^!cR=DE@KU3D12t{5C(^py@KtHT8CXW44a>d2%`_84Q%}8B?$HJ zUg~@9*Z1#TA3vJ;>-(N3X!Vb1+V|A20g3Tg??>+(My=-wpvN~JD&YRTz>(_|Aq?6` zzaDz?H$N&=#tAxkj#i8VIz|TOKL=cR9`%g(yz-+mhu|A~a}a}^MjPnsMUmIlS6>X?BYHyrOOS0Ry7TXsQk*ET;9;nF) z%$sqoA@`bNiuLP~?_HiF$L2W57)^x zzq@(Tr`FGtKXA;*ognkh>JpK(m)sauZl-jULdgM}WP_ck462SOrM}$Fr>YD?&U&pG zzFlfq)Y*-D0%w)B3d zv!D0n+6}5%)V@u5wWWXS_TG#uvRii4!2K(ECkn!zhC5)HRmFf_FQIU!-s7`?z zQwYxxy(wc^ege6;U8Rz}cu(QR9--JW;Sn+?;jRsh-@(j!2J}NcARW>WO3blby{O$&h2{D?!a@C;=1=rZ1Pw2(| zqJXq}P^_#3N`ycgHcKq*F0DdMw=hK@)c9lcda}K_*`*MDs6JEyNk)#~ep)=A4eOIS zh8L1$uL507+&Z(MCObQc%n}tWJ-aM7M%m55iq=a=^u78J8klEV9lzyd zN9JBt{EivABf&EYY`O?vL&TI-9yKwRZqWNqKa;zaY2SZ@Uv*}$!xL|;6;_>b7={b? z&OP;+lvf~4oA=GxNxvNOt{t?C!3NNYH`mI%Sq)0Iz5mRn`yDzEHz~ng%UjI6Gn!3| zw9RcRg+0ipin%+BHchXsFXz>=%5DIfx;USg`%HGj5T!MS34E2f#{D(e5;H%D79cpv zWfl45gwdCFmb;1DSwen*yXbam-EK9X+Lf{oWD7HKjk^kL2ibe>(*?6M<$(sGGx(Ob zEKk>2ZgyuR*9QAIgFzH6mX1BJWxLk$&-ZQo1e9(^l-yL}n64YflX*KB*`e~KG)5aI zCS`^GY08-ckCiX(tbxz4M|}DHzrEb0NqFJy_1~4Pz1~n0p_F76f%f8h({4*%UM1UF z4dRt*=F9G=6*>*!=SyE)gioZ9P+n}(c$K)gkXA;#<&7eN3-+^Ha+olpsevD1^2>?M zDw!mTBm$>g=6F;xWA6S|V^KKadYJHx&~S~uS<#TtYEB>|i>3Yu0}_t%n)S_kqSY&k z9xSHUCpyI=xHK9x zRp4KlnkBsno?J7Z}=nzH?xSAiQx>rk-bJSZbC`>j&t$G)d12=7C`UY`U#39SqB6qY5-#{R%j z0_7@A+B~vlj`BXWE@?GYanO&L2q-_Q|K20yy-id*-W@m|xM@F>=6jp&S;q`a02WY# zc{&sb@Q!{H_~XA9FJykjoizRZ**VWmO;ld->@NHK$yr0!%hEa@F~=({?J>s}=Y<9k zup~X+j%ZKenH$gi;M-Wd`b4T^WooeI|+R^p)+$2aCB~ zT$dO6uZ91b2esmeCh~O48lXx&IIF!xDH$a8j;)!ib$b~_E4Qete5Y0N4U6Y93o{|r z?&EwJRnrq|8Vi3nI51;sW@V%btcW)y_i*WB!7z-wKu!jB)zp`_mV=31vWUHmSMt)|=o58~tTu=Om<3BB7FDP?S} zpbb+@)wg1z$T}?ktOO+mcTSKX@bkQSg)t~OZ6tulnvGx^;gufQ!Y4&Od5bhMf=JX# zxQD=M#3^;fS6nL~!y{@C7RInfBUr@@fP&MS2onZLj}2uQP!S9<#sYDAy-^<~82yG| zte#HwEkGTb8XBM$3Hp!Kx)9XVSO+8%=Xipf)ob zfh9|Hd(qZRYCq)61~<%KGiK3C>Uf25+tmglPUMNsO#7?Vdb=SVP}Y0DX%GsPW_=dYi{@H zH6ORP2{IP|2(z*n{z4>(G@n4a*!RB)5H5xScukG|LE4Y$C z{}64pi)bPKxJa(ktLvE3I-GbQ7@+9z&lr+L;AN@;+~LH$J19IT??~&qTQNkRwnF2L zN+ztjQKgcJmm!J)aAO&8j3@#V78<5E3Y3lrV`6EIk;F2>7z+F?B)X*!Q)i>F#jZq; zfn6X$YBrH(4#NQ|LEP=&^c>m3f*PsLVKc%AJW1HTc{uMkAsJ8p(So4e3)=ebP$DM} z#_>#Iz&YhZ*~^HAS$oQD%Pd(*xCKxjF1Q9WnWItjKSIz;h2;ep$V z&R+lY#`@4c#@0Ef?CjZ}ag}6Y$M`R=>5s<;9WYnvyta|p=aKHKGkPOL=BMW?67_l%EB}(FY4?TFGt>=_pl>ZJmppwraLQT2$}Oo~&JSfd+F8!KQ|&MTQ#v`F_mk%l{(}Il&Ym@}PBX#ol^rZ` zmIM;j2{*5H-%Rm(@uWIc*QLzWX*R?P(qu@~!T)h~0`43=m}@v*G9$Ti^NR0J@X5yF zV9FH6?jOwyI+v?*5H0!nc(6n_%g+q8*i*aWO)xi1@jMT#fuarba>EzTqDfIL!q&i|Z z@64c%8YhQ&q58Ez)Xct>DH!#_Y8cs2xML0(2h~atydn_l|5{)nLL1@SOEBN4(*>K5 zvYRNBZ$Xvk&(0hdk6*eoQ|`Hus?=@%`pN6e z)KAVbrs3%??44^@F_|%9!SkzM;4>#aUzkylci!zRg1^i89D^5@*ObWe3y#O^AQn&X z=JtU^PqIA2-qFIVi%v~I{8tXXg{)C9Dfc9I6oAh}=}t}s~gx3F}bC!V})PAVfBqEi-uwuIvn zrr9AV0GtwPVQsLJ2*pmAo`!w_Iu0DaNihMy8g#`F#zYV-g3M(DF$|&oQl~dZvkS`lm;uWZ2FdYOcYiDN}vEs2V;SY8o zHS@}d2#bW1@Q2uzTSw$%i@`#a>OD|UIx~=m^cZy~1}g613~mgm86SV~gBa`rWj67! zl;yBKw|PHkc+mNqp=3tyf_e;~e5EuAein>990FhxjyK;6pe`8tc#k?}4+_N|b;3~K zd4c2rFWEoNPiv6b%CjIXAKElB6fh#a`7G#ul%a!25na5&EH8~*#9>LBG{52x#0?glN`UgCyx2A8S)oxOw4e+}MmP$x1z z7?W~~%&H?xb%wpv&5{GpGivxfJvmzoug_=k!>)GNkdX)X^3I;ll-#Z01IyQ3D*Mf` z-P5+ObGN?q%)2TxUx?Ra0EWGtTw@4OOo;FF@`^^aPOh#5B(mai%XcQz{g~BlssJz4y zwn8Acbb6tV8i)@HE5va|u9r{ljrx*Gr1BA$xCN$BV!#m{L69uS9+a0r5913G840&r zM~FnF*2YSRfl1N=bmVIFQw!N)3RN$fD5C&ap%I>tC=!VQD1{2bD)6IdRS+Q&M=J5P zn*}Zz#1j(teT3i2l*aHC08@F2hXvOUi?6R-Itb0MZypmpQBg~6zB`hN#varu#KUY0 zl2)(=Hv$Aa-krCSa0Cv8OllPcw()j7IwY|cNfHFOYG6IG1XO_WQ0OE4*D~UJ4kjMz zhQ>p`K>Jt$6X+F?`AgBFFdYd&4n|9$(qC;GIEa(B)UVK2L?ggHyE8gO#=sN z7e@p@Zqw4_nS(I)VAk2YV!Bc+&_J@HHS_W*K;{C!wIo_C-^f*o!L!;ghdAqRrj!gj zZ+4VErkj;I%gvip*Ep-0_RGA_3!I(aEAwh(gi-n;QA{s3oGP9LHviNFg=sI5FNicD ztUCtwBa}~l`JhEdIx;V$*mYgYmFoHu&Cze&kK6|3IG9U4yh?+PQkd;bd&a!9BUu+? zU;VH*gSG1r*4sOA&9u0X?K@M~fRDt_GDGBdCR7=S%1*@Gq$YJ==PEFq3N!CD<1ZI& zFHCaW^EJ3;4i=JedzR&IC$&d&Uml7ZedPQbXFk~4nzH613rD;ZFj%MNbbOo~qinc^ zEE_)gR%0CO9E+7LYh}KSX{NPN>m|u1K!hdyNmdw!YA?Jhi^NI7yey9RH5PPMo#G-{ zS(>amC^AXI**H$IL8%d!3oj0bgw#n8d02JOFgv(LMkRpifLcV||7$@aCj;+V5$ zumeT~T#A57lSI#;d*Y>JA*Jl7vQiP5RzjB$mJzTel7Ne>#Hv(tHPoEb3aA!1(0s&Z zMN?KHP`t7Y9fd;YDyj-|HucJ&Uz$w-Za9Hcgl?eBO$gE_B47s=p88yz8o4kqZq+Kn z!xWTRvdvUZ>52%Vbjn0z2v`e(#7-zZ5n7Z+c`$M93hSELKX(Yuk*Y)V_Q%1Q z7lSz2^!g81|8wsL&p^Y{6Cq}qKQcF|u=HBWweDk)5gpOaV=iIAu=7}AuQEWyZ{;pg z)UBzS5UDyoAYNKN`bl?330MPUYMh?H_ae0rQKcKhkV>R8%F}aIjfhZn!+u*}N3Ihb zG$(>q!M=`n+)JWFRC(2dmP^n(C#d!Uf_Of%t0USxZ{qiTKVMnj9M=n?!eW^wv(5+u zAUcibCmLpfX;-TU3l}VCDhY&QLavCK$Mt~+9fxFTZ3B`BFZ2_gsDEYk}{%9@+Fei|t~pAvB|i)kT|?Lw!+|>g>L(Xu+tO z*UhBOztU_WSG2IsK!_38fLE#!kR=iT!`X;Q=4`ET5TcA7l7r~L1h{Nj6fPRj&vl$s z2bg5l`Cs-wHd0nr77H4VkzjA(G{+GQF7YxT)L=p?O5BtMn$`~wkuBCXM24V?i0TLw ziH8*lqt)x18G+~nIV)EtNs1S^XjUKtLN-g`$7*26Va*3$q7X*WD_MliLXrnyLj=WC z&9PbFF0*Sm=m(baBmzTdUWcH8J4EoaRoI-AzlXadWKmsRrr`i;!VyJrA^ixcNZEP- z1*6eYh9iSus*Wt7nIVtg!2LP$5B9?>hb`N^;(fECsi7)S4TrmU{0R9Y3EecgV7G`Pq=~`?j4~swuS$158yukqoCI4CW(-gSF6u>cLKNN&D`z$fdtdK*X%9{j*L3oJjfgl3DGb57q4x4fYAs93iDL!E>pUyIsA`HIqwL9sbc0%tg1!t(AwO}~W^?Gt3j-O|*5b(r7U zJ@<2qv9t5318=9=0+Bkpj&peHr?8dSV$2b} ziza7Dqz>ag#K{Pwq2Xg8JB)!^)&Nyu)FxxS z6gzrcOL}>Ln$T|42xoo36ZG()=<#$2XnQq`n&^J2q@J2y4RuRl1w}}72!9K7A9Zo` z8%3v4jqUtzY=!@9BiPW3U=;{!Mdd%8c+dnK3>Xv~cvOAW3j(A2?f{Z7M*(Y*(a2-1 zYMBBGXsiU7F^mia8V}GK@gW%nX(bHFIx3eE-e%#;PFLrhlQEgXE0CV6hiFP9aU8Us^lM#BZH2{t)8sx$HfxPap3|E8Wd;O;JXNIbz0{ddFJ4>1@zWdfI zg|D3*T$n)u!Y66pO|`uP0xf*9LyTv(Iv92BWL9onM}(%v=^PTLB=2@cWwKoX1BW-` zhOI-gmt93jt50F{tbkX<>RA?FkPrqU_k}K9P$4S40yMf5Qm2qceQ2}FsL!-PoY2N* zg)J#*kZwiNG9eoK7N|T-pR!;-(^u}LF(T3_v$Y>0p^?}dd7XKAGBTnN^#Sn?C~1f` zT_7u3EmzXS2OiX-YQ%s1Vip0F0Xifi3px(>k|e5ch(tKaZ#D`Lzc8ZE8p1Y78q&&w z&TJ+e#j-X$amzQHYilWbr=N9ME{os#vn)YxXiU5h9WYqs7N3(#ZVOD0V?RNi5@BmJ`nORCV@nN ztq1ZC^tklgeX6TQe3O0(Ufn0);>W`-?3;uL^K(eknuO-)>^^KrYWHmhp@HkcF^*=^ ztPa0fi1UMM-+|1&H|Ir*^i8cf}@$0>0ezLF6l{rz8xfm^QPB%Q*X<&^&}oiZZ9V?9}*d} zuA;J|_!Rz~EUIp(y|beJQtQz1Z;JPAD_rnH?6#7}kPB%+8bAF(i`$**>*h+mG$Fs^ zQ>JTe3+NG!%9sk32*xx!@-MnWQk9ta_^I+=bccvX4}mQ-DuKw^_+jZ23V z37M|vSvY+}VuJd}kX^`9@0+*ZS6)epxOp&s5~MJ?+M;j@(QwFZ;_83}IB1-P8gDjY za{&a{gQBB&fX1W+JYcm#1rr>m9#`T){PkXCOu`XPBPCQ`X^VLTO63Eb=S8!IAjmXN zQA`MgL)#IwM~;Ys4(P7_fevGMXcEM%;pmY-7@RbZn57Q^n~cIHJcv+WXsEh?1!rXm z5;Vi3L4v3}q;IH_R-^H@oIo;jB8HEQNc7KAj*=E?oKgC3tNyU1RT1`{@)DSGM6&#p`8a>N;v_(W<~+jTq6xlZi5a*ad5Qsk79L20vcfe;W&~cT zgN9f#0>jM134iY!*AdfrapyQ7F1DX?*9HyRP94z{;+JAI0phR-L4M4RWc02k29l0ovCgbcMM9F> zIZ+H&A+4SvrPDhm;CETw9iQ6ImpHoojQW}P$|n}TyZ@D@&J;3>SI~!dd7x?yuT~8v zwO3d7q?}Tad!cSG9~6UoK}(zf6@p)>wM3!^hR8@udL|d%QbFoeY47)Mm_#Sat_J1CG;gnDBk`>?bsdNmr} zC=#1wl(S-*5m;8@!i3P+XjVqE$( zQgI7zUv}P}0(e95;eId8iWu<`M6XG_9g2|TfiYyFgIA`^grgXch>!r~2-VX5zN1Jy z!H*~tg8>!^ju$Lc+*819p;ks}e*T)G_#c zQLx2gSKX+bwe&Uowqtlft7F3|5D+bMJa2zC3@Lj|JeB_Z$>I60!CAr2qntOt9&{Z1 z?EOhTuoJ1s>hp@vy!r9Be}}a+jHnc=p4in*f2?wPPkYAvCzk$jdEO8EAM@hJC*p9b zy?6OzU@^QY_(3Q#>S2%Bb?5s>2Zu&LC3bgwh9hR%BbmR)<(#);f}Gk6+X#6Z)5|L- zs&(+z_G+b*A@+CPn{)P_uZ)Kdjf_3t%7B z*i5Vr(&&U+~YwDp&fv9F>2;|IZrBg0|b z5W9(ak49%{!S6n1pW6g-d}L@qg$zDq8QrDhA4~2-<~uzY>JI=-H~p6jz8$A=HAmgM z^!lQ|v#haf-Y!>O#+4;UTaT}Ix?K1_L1<%T&PcAVyKm*U6LRZHf3BPH+iy4CJyhRq z+u@2WN=ypy+QPVO(~|AEpW8OC4EVrRI>|QiCco;btUU2r+xc%dKE^aQ&6ah+zYlns z$2wK5?bf#h8OEs@&ODFb|Hx}k9wyn0!V4cpx3IEC8_PJFg?ShLTobxUyf(Ln&u&h* zHTX@z_}-O=G;yMfaYW_?9L4LsRI@}xCRcvM;)MZ1#B!rKG7LxGc1^FlF`+~kx7I2D zf$JU;`2^3R6@AgOGKuo#dQI@S?dGbWI1=!)p+n4OUvz)>vwe>(oZ2@OerMJ!ZQsx} V+sWEX>4Tx04R}tkv&MmKpe$i(@I4v4t5Yx$WWau6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?K>DYS_3;J6>}?mh0_0YbgZG%FATG~G5+ ziMW`_u8P4|1TcbL2#CqdGUg;H3D5C$4 z;Ji;9W<^;gJ|`YG>4LUIyFxmCKd}FtaLCdni}yGaYWU0$`>*& ztDLtuYvn3y-IKpCl+#z1xlVH!2`pj>5=1DdqJ%PRL}}GYv5=zuxQBnJ>6gf*kgEhn zjs;YpL2mlN|KNAGR(^8AO$x<mpj1VlOdaOQ}WXk@_FF>jJ_!g4BP@eYi@6?eVjf3Y3eF@0~{Oz zV+G1y_jq@AXK(+WY4!I5T$pm6NAgbv00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~u9T6)vtwC5700031Nkl)$FK|1OTBH@Nm10OZ)FJgl8Pj7{~14Ja|2Qrj8nK#+ndN0eNQAH$Lu zu%8M;;EWS3@GdPmqOf#pCG}&&T?(#n!d(t7IN@#q?>OPL8{bpxOnt91M*BQJOW&*L zPo3fegFfx6sINK88Y808n@caduPp^Q-2St|V-Ca7VA27pN}`SKNz zAsFlW=oN$&Zj%Y4SCRO@?DYj*_lt^uLyPu@0*s6mQa$lnSU7O{?`_9-4kXh@vgt$V j^s#*U!{m46F|Xqn>XyxfZ?=4k00000NkvXXu0mjf=($ef literal 0 HcmV?d00001 diff --git a/src/assets.rs b/src/assets.rs new file mode 100644 index 0000000..23116c3 --- /dev/null +++ b/src/assets.rs @@ -0,0 +1,171 @@ +use macroquad::audio::{load_sound_from_bytes, set_sound_volume, Sound}; +use macroquad::color::Color; +use macroquad::miniquad::FilterMode; +use macroquad::prelude::{Image, ImageFormat}; +use macroquad::text::{ + camera_font_scale, draw_text_ex, load_ttf_font_from_bytes, Font, TextParams, +}; +use macroquad::texture::Texture2D; + +pub struct Assets { + pub blobcat_texture: Texture2D, + pub cloud_texture: Texture2D, + pub sun_texture: Texture2D, + pub grass_top_texture: Texture2D, + pub grass_bottom_texture: Texture2D, + pub road_texture: Texture2D, + pub house_texture: Texture2D, + pub bike_texture: Texture2D, + pub projectiles_texture: Texture2D, + pub particles_texture: Texture2D, + pub menu_texture: Texture2D, + pub controls_texture: Texture2D, + pub miss_sound: Sound, + pub shoot_sound: Sound, + pub hit_sound: Sound, + pub lose_life_sound: Sound, + pub font: Font, +} + +impl Assets { + pub async fn load() -> Self { + let blobcat_basic = Image::from_file_with_format( + include_bytes!("../assets/blobcat_basic.png"), + Some(ImageFormat::Png), + ); + let blobcat_texture = Texture2D::from_image(&blobcat_basic); + blobcat_texture.set_filter(FilterMode::Nearest); + + let cloud = Image::from_file_with_format( + include_bytes!("../assets/cloud1.png"), + Some(ImageFormat::Png), + ); + let cloud_texture = Texture2D::from_image(&cloud); + cloud_texture.set_filter(FilterMode::Nearest); + + let sun = Image::from_file_with_format( + include_bytes!("../assets/sun.png"), + Some(ImageFormat::Png), + ); + let sun_texture = Texture2D::from_image(&sun); + sun_texture.set_filter(FilterMode::Nearest); + + let grass_top1 = Image::from_file_with_format( + include_bytes!("../assets/grass_top.png"), + Some(ImageFormat::Png), + ); + let grass_top_texture = Texture2D::from_image(&grass_top1); + grass_top_texture.set_filter(FilterMode::Nearest); + + let grass_bottom1 = Image::from_file_with_format( + include_bytes!("../assets/grass_bottom.png"), + Some(ImageFormat::Png), + ); + let grass_bottom_texture = Texture2D::from_image(&grass_bottom1); + grass_bottom_texture.set_filter(FilterMode::Nearest); + + let road = Image::from_file_with_format( + include_bytes!("../assets/road.png"), + Some(ImageFormat::Png), + ); + let road_texture = Texture2D::from_image(&road); + road_texture.set_filter(FilterMode::Nearest); + + let house = Image::from_file_with_format( + include_bytes!("../assets/house.png"), + Some(ImageFormat::Png), + ); + let house_texture = Texture2D::from_image(&house); + house_texture.set_filter(FilterMode::Nearest); + + let bike = Image::from_file_with_format( + include_bytes!("../assets/bike.png"), + Some(ImageFormat::Png), + ); + let bike_texture = Texture2D::from_image(&bike); + bike_texture.set_filter(FilterMode::Nearest); + + let projectiles = Image::from_file_with_format( + include_bytes!("../assets/projectiles.png"), + Some(ImageFormat::Png), + ); + let projectiles_texture = Texture2D::from_image(&projectiles); + projectiles_texture.set_filter(FilterMode::Nearest); + + let particles = Image::from_file_with_format( + include_bytes!("../assets/particles.png"), + Some(ImageFormat::Png), + ); + let particles_texture = Texture2D::from_image(&particles); + particles_texture.set_filter(FilterMode::Nearest); + + let menu = Image::from_file_with_format( + include_bytes!("../assets/logo.png"), + Some(ImageFormat::Png), + ); + let menu_texture = Texture2D::from_image(&menu); + menu_texture.set_filter(FilterMode::Nearest); + + let controls = Image::from_file_with_format( + include_bytes!("../assets/controls.png"), + Some(ImageFormat::Png), + ); + let controls_texture = Texture2D::from_image(&controls); + controls_texture.set_filter(FilterMode::Nearest); + + let font = load_ttf_font_from_bytes(include_bytes!("../assets/plutostardust.ttf")).unwrap(); + + let miss_sound = load_sound_from_bytes(include_bytes!("../assets/miss.ogg")) + .await + .unwrap(); + + let shoot_sound = load_sound_from_bytes(include_bytes!("../assets/shoot.ogg")) + .await + .unwrap(); + + let hit_sound = load_sound_from_bytes(include_bytes!("../assets/hit.ogg")) + .await + .unwrap(); + + let lose_life_sound = load_sound_from_bytes(include_bytes!("../assets/lose-life.ogg")) + .await + .unwrap(); + + Self { + blobcat_texture, + cloud_texture, + sun_texture, + grass_top_texture, + grass_bottom_texture, + road_texture, + house_texture, + bike_texture, + projectiles_texture, + particles_texture, + menu_texture, + controls_texture, + miss_sound, + shoot_sound, + hit_sound, + lose_life_sound, + font, + } + } +} + +pub fn draw_string(text: &str, x: f32, y: f32, color: Color, font: Font) { + let (f_size, f_scale, f_aspect) = camera_font_scale(8.0); + draw_text_ex( + text, + x, + y, + TextParams { + font_scale: f_scale, + font_size: f_size, + font_scale_aspect: f_aspect, + font, + color, + ..Default::default() + }, + ) +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..0400385 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,4 @@ +pub const SCREEN_WIDTH: f32 = 320.0; +pub const SCREEN_HEIGHT: f32 = 180.0; + +pub const SCREEN_ASPECT: f32 = SCREEN_WIDTH / SCREEN_HEIGHT; diff --git a/src/game.rs b/src/game.rs new file mode 100644 index 0000000..29abd19 --- /dev/null +++ b/src/game.rs @@ -0,0 +1,1091 @@ +use crate::assets::{draw_string, Assets}; +use crate::config::{SCREEN_HEIGHT, SCREEN_WIDTH}; +use crate::menu::GameMenu; +use crate::particle::{ + ConfigPopUpBasic, ConfigRingBasic, ParticleControllerPopUp, ParticleControllerRing, + ParticleType, ParticleWorld, +}; +use crate::sky::{Cloud, Sky, Sun}; +use macroquad::audio::play_sound_once; +use macroquad::color; +use macroquad::color::Color; +use macroquad::input::{is_key_down, KeyCode}; +use macroquad::math::{Rect, Vec2}; +use macroquad::prelude::{draw_texture, draw_texture_ex, is_key_pressed, vec2, DrawTextureParams}; +use macroquad::rand::RandomRange; +use macroquad::shapes::draw_hexagon; +use macroquad::time::{get_frame_time, get_time}; +use std::collections::LinkedList; + +pub enum GameState<'a> { + Game(GameWorld<'a>), + Menu(GameMenu), +} + +trait BoundingBox { + fn get_bounds(&self) -> Option; + + fn can_enter_from_dir(&self, angle: f32) -> bool; + + fn replace_with_closed(&mut self); +} + +enum WindowAttach { + PinkCurtain, + CyanCurtain, + MiniCat, + Plants, + YellowCurtain, + ActiveBucket, + Bucket, +} + +impl WindowAttach { + fn generate() -> Self { + match u32::gen_range(0, 200) { + ..=30 => WindowAttach::PinkCurtain, + 31..=60 => WindowAttach::CyanCurtain, + 61..=90 => WindowAttach::YellowCurtain, + 91..=120 => WindowAttach::Plants, + 121..=200 => WindowAttach::ActiveBucket, + 201..=220 => WindowAttach::MiniCat, + _ => WindowAttach::MiniCat, + } + } + + fn attach_offset(&self) -> Vec2 { + match *self { + WindowAttach::Bucket => vec2(1.0, 0.0), + WindowAttach::ActiveBucket => vec2(2.0, 1.0), + _ => vec2(0.0, 0.0), + } + } + + fn sprite_rect(&self) -> Rect { + match *self { + WindowAttach::PinkCurtain => Rect::new(1.0, 65.0, 13.0, 11.0), + WindowAttach::CyanCurtain => Rect::new(15.0, 65.0, 13.0, 11.0), + WindowAttach::MiniCat => Rect::new(29.0, 65.0, 13.0, 11.0), + WindowAttach::Plants => Rect::new(43.0, 65.0, 13.0, 11.0), + WindowAttach::YellowCurtain => Rect::new(57.0, 65.0, 13.0, 11.0), + WindowAttach::Bucket => Rect::new(2.0, 79.0, 15.0, 12.0), + WindowAttach::ActiveBucket => Rect::new(19.0, 78.0, 17.0, 14.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + let pos = offset - self.attach_offset(); + + let sprite_rect = self.sprite_rect(); + draw_texture_ex( + assets.house_texture, + pos.x, + pos.y, + color::WHITE, + DrawTextureParams { + source: Some(sprite_rect), + ..Default::default() + }, + ); + + let t = get_time(); + if let WindowAttach::ActiveBucket = self { + let step = (t * 2.0 % 4.0).floor() as usize; + let steps = [0.0, 1.0, 2.0, 3.0]; + + draw_texture_ex( + assets.projectiles_texture, + offset.x + sprite_rect.w / 2.0 - 9.0, + offset.y - 19.0 + (t * 2.0).sin() as f32, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new(steps[step] as f32 * 16.0, 48.0, 16.0, 16.0)), + ..Default::default() + }, + ); + } + } +} + +impl BoundingBox for WindowAttach { + fn get_bounds(&self) -> Option { + match *self { + WindowAttach::ActiveBucket => Some(Rect::new(-3.0, -2.0, 19.0, 2.0)), + _ => None, + } + } + + fn can_enter_from_dir(&self, angle: f32) -> bool { + (0.0..std::f32::consts::PI).contains(&angle) + } + + fn replace_with_closed(&mut self) { + *self = WindowAttach::Bucket; + } +} + +enum DoorAttach { + Door, + ActiveDoor, + ActivePortalDoor, +} + +impl DoorAttach { + fn generate() -> Self { + match u32::gen_range(0, 100) { + ..=50 => DoorAttach::Door, + 51..=95 => DoorAttach::ActiveDoor, + 96..=100 => DoorAttach::ActivePortalDoor, + _ => DoorAttach::ActiveDoor, + } + } + + fn attach_offset(&self) -> Vec2 { + match *self { + DoorAttach::ActiveDoor | DoorAttach::ActivePortalDoor => vec2(1.0, 1.0), + _ => vec2(0.0, 0.0), + } + } + + fn sprite_rect(&self) -> Rect { + match *self { + DoorAttach::Door => Rect::new(3.0, 94.0, 13.0, 16.0), + DoorAttach::ActiveDoor => Rect::new(20.0, 93.0, 15.0, 18.0), + DoorAttach::ActivePortalDoor => Rect::new(39.0, 93.0, 15.0, 18.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + let pos = offset - self.attach_offset(); + + let sprite_rect = self.sprite_rect(); + + draw_texture_ex( + assets.house_texture, + pos.x, + pos.y, + color::WHITE, + DrawTextureParams { + source: Some(sprite_rect), + ..Default::default() + }, + ); + + let t = get_time(); + + match *self { + DoorAttach::ActiveDoor | DoorAttach::ActivePortalDoor => { + let step = (t * 2.0 % 4.0).floor() as usize; + let steps = [0.0, 1.0, 2.0, 3.0]; + + draw_texture_ex( + assets.projectiles_texture, + offset.x - 19.0 + (t * 2.0).sin() as f32, + offset.y + sprite_rect.h / 2.0 - 9.0, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new(steps[step] as f32 * 16.0, 32.0, 16.0, 16.0)), + ..Default::default() + }, + ); + } + _ => {} + } + } +} + +impl BoundingBox for DoorAttach { + fn get_bounds(&self) -> Option { + match *self { + DoorAttach::ActiveDoor | DoorAttach::ActivePortalDoor => { + Some(Rect::new(-3.0, -3.0, 13.0, 15.0)) + } + _ => None, + } + } + + fn can_enter_from_dir(&self, angle: f32) -> bool { + (-std::f32::consts::FRAC_PI_2..std::f32::consts::FRAC_PI_2).contains(&angle) + } + + fn replace_with_closed(&mut self) { + *self = DoorAttach::Door; + } +} + +struct Attach(Vec2, T); + +enum House { + Round { + window: Attach, + door: Attach, + }, + Wooden { + window_left: Attach, + window_right: Attach, + door: Attach, + }, +} + +impl House { + fn generate() -> Self { + match u32::gen_range(0, 100) { + ..=25 => House::Wooden { + door: Attach(vec2(34.0, 48.0), DoorAttach::generate()), + window_left: Attach(vec2(17.0, 33.0), WindowAttach::generate()), + window_right: Attach(vec2(34.0, 33.0), WindowAttach::generate()), + }, + _ => House::Round { + door: Attach(vec2(37.0, 48.0), DoorAttach::generate()), + window: Attach(vec2(15.0, 34.0), WindowAttach::generate()), + }, + } + } + + fn attach_offset(&self) -> Vec2 { + match *self { + House::Round { .. } => vec2(0.0, 0.0), + House::Wooden { .. } => vec2(0.0, 0.0), + } + } + + fn sprite_rect(&self) -> Rect { + match *self { + House::Round { .. } => Rect::new(0.0, 0.0, 64.0, 64.0), + House::Wooden { .. } => Rect::new(64.0, 0.0, 64.0, 64.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + let pos = offset - self.attach_offset(); + + draw_texture_ex( + assets.house_texture, + pos.x, + pos.y, + color::WHITE, + DrawTextureParams { + source: Some(self.sprite_rect()), + ..Default::default() + }, + ); + + match self { + House::Round { + door: Attach(door_attach, door), + window: Attach(window_attach, window), + } => { + window.render(pos + *window_attach, assets); + door.render(pos + *door_attach, assets); + } + House::Wooden { + door: Attach(door_attach, door), + window_left: Attach(window_left_attach, window_left), + window_right: Attach(window_right_attach, window_right), + } => { + window_left.render(pos + *window_left_attach, assets); + window_right.render(pos + *window_right_attach, assets); + door.render(pos + *door_attach, assets); + } + }; + } +} + +enum GrassTop { + GrassYellowFlower, +} + +impl GrassTop { + fn generate() -> Self { + GrassTop::GrassYellowFlower + } + + fn sprite_rect(&self) -> Rect { + match *self { + GrassTop::GrassYellowFlower => Rect::new(0.0, 0.0, 64.0, 32.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + draw_texture_ex( + assets.grass_top_texture, + offset.x, + offset.y, + color::WHITE, + DrawTextureParams { + source: Some(self.sprite_rect()), + ..Default::default() + }, + ); + } +} + +enum Road { + Asphalt1, + Asphalt2, +} + +impl Road { + fn generate() -> Self { + match u32::gen_range(0, 100) { + ..=50 => Road::Asphalt1, + 51..=100 => Road::Asphalt2, + _ => Road::Asphalt1, + } + } + + fn sprite_rect(&self) -> Rect { + match *self { + Road::Asphalt1 => Rect::new(0.0, 0.0, 64.0, 32.0), + Road::Asphalt2 => Rect::new(64.0, 0.0, 64.0, 32.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + draw_texture_ex( + assets.road_texture, + offset.x, + offset.y, + color::WHITE, + DrawTextureParams { + source: Some(self.sprite_rect()), + ..Default::default() + }, + ); + } +} + +enum GrassBottom { + GrassRedFlower, +} + +impl GrassBottom { + fn generate() -> Self { + GrassBottom::GrassRedFlower + } + + fn sprite_rect(&self) -> Rect { + match *self { + GrassBottom::GrassRedFlower => Rect::new(0.0, 0.0, 64.0, 32.0), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + draw_texture_ex( + assets.grass_bottom_texture, + offset.x, + offset.y, + color::WHITE, + DrawTextureParams { + source: Some(self.sprite_rect()), + ..Default::default() + }, + ); + } +} + +struct RoadBorder; + +impl RoadBorder { + fn sprite_rect(&self) -> Rect { + Rect::new(112.0, 32.0, 16.0, 32.0) + } + + fn render(&self, offset: Vec2, assets: &Assets) { + draw_texture_ex( + assets.road_texture, + offset.x, + offset.y, + color::WHITE, + DrawTextureParams { + source: Some(self.sprite_rect()), + ..Default::default() + }, + ); + } +} + +enum RoadBorderPosition { + Top(RoadBorder), + Bottom(RoadBorder), + None, +} + +struct Slice { + lawn: GrassBottom, + house: Option, + road_grass_bottom: GrassBottom, + road: Road, + road_border: RoadBorderPosition, + road_grass_top: GrassTop, +} + +impl Slice { + const WIDTH: f32 = 64.0; + const HOUSE_ATTACH_POINT: Vec2 = Vec2 { x: 0.0, y: 128.0 }; + + fn generate() -> Self { + Self { + lawn: GrassBottom::generate(), + house: if u32::gen_range(0, 100) > 60 { + Some(House::generate()) + } else { + None + }, + road_grass_bottom: GrassBottom::generate(), + road: Road::generate(), + road_border: match u32::gen_range(0, 100) { + ..=10 => RoadBorderPosition::Top(RoadBorder), + 11..=21 => RoadBorderPosition::Bottom(RoadBorder), + _ => RoadBorderPosition::None, + }, + road_grass_top: GrassTop::generate(), + } + } + + fn render(&self, offset: Vec2, assets: &Assets) { + self.road.render(offset - vec2(0.0, 52.0), assets); + self.road_grass_bottom + .render(offset - vec2(0.0, 32.0), assets); + self.road_grass_top.render(offset - vec2(0.0, 64.0), assets); + self.lawn.render(offset - vec2(0.0, 96.0), assets); + + if let Some(ref house) = self.house { + house.render(offset - Self::HOUSE_ATTACH_POINT, assets); + } + + if let RoadBorderPosition::Top(border) = &self.road_border { + border.render(offset - vec2(0.0, 68.0), assets); + } + } + + fn render_front(&self, offset: Vec2, assets: &Assets) { + if let RoadBorderPosition::Bottom(border) = &self.road_border { + border.render(offset - vec2(0.0, 52.0), assets); + } + } +} + +struct Player { + lives: usize, + pos: Vec2, + speed: f64, + start_time: f64, + pedal_speed: f64, + pedal_speed_mod: f64, +} + +impl Player { + fn new() -> Self { + Player { + pos: vec2(40.0, SCREEN_HEIGHT - 70.0), + speed: 1.0, + start_time: get_time(), + pedal_speed: 1.0, + pedal_speed_mod: 1.0, + lives: 5, + } + } + + fn shoot_velocity(&self) -> Vec2 { + vec2(60.0 * self.pedal_speed as f32, -120.0) + } + + fn render(&mut self, assets: &Assets) { + let t = get_time(); + self.speed = (1.0 + t - self.start_time).log(20.0); + + let dt = get_frame_time(); + + if is_key_down(KeyCode::Up) || is_key_down(KeyCode::W) { + self.pos.y -= Slice::WIDTH / 2.0 * self.speed as f32 * dt; + self.pos.y = self.pos.y.max(SCREEN_HEIGHT - 54.0 - 29.0); + } else if is_key_down(KeyCode::Down) || is_key_down(KeyCode::S) { + self.pos.y += Slice::WIDTH / 2.0 * self.speed as f32 * dt; + self.pos.y = self.pos.y.min(SCREEN_HEIGHT - 20.0 - 29.0); + } + + let mut pedal_speed_target = 1.0; + + if is_key_down(KeyCode::Left) || is_key_down(KeyCode::A) { + self.pos.x -= Slice::WIDTH / 2.0 * self.speed as f32 * dt; + self.pos.x = self.pos.x.max(0.0 - 16.0); + pedal_speed_target = 0.75; + } else if is_key_down(KeyCode::Right) || is_key_down(KeyCode::D) { + self.pos.x += Slice::WIDTH / 2.0 * self.speed as f32 * dt; + self.pos.x = self.pos.x.min(SCREEN_WIDTH - 16.0); + pedal_speed_target = 1.5; + } + + if self.pedal_speed_mod < pedal_speed_target { + self.pedal_speed_mod += + (0.5_f64).min((pedal_speed_target - self.pedal_speed_mod) / dt as f64) * dt as f64; + } else { + self.pedal_speed_mod -= + (0.5_f64).min((self.pedal_speed_mod - pedal_speed_target) / dt as f64) * dt as f64; + } + + self.pedal_speed = self.speed.sqrt() * self.pedal_speed_mod; + let pedal_speed_visual = self.speed.sqrt() * pedal_speed_target; + + // Iteratively render the trajectory + let mut cpos = self.pos + 4.0; + let mut cvel = self.shoot_velocity(); + for i in 0..1000 { + let dt = 1. / 100.; + cvel.y += 128.0 * dt; + + if cpos.y > SCREEN_HEIGHT { + break; + } + + if i % 10 == 0 { + draw_hexagon( + cpos.x, + cpos.y, + 0.5, + 0.5, + false, + Color::new(0.0, 0.0, 0.0, 0.5), + Color::new(1.0, 1.0, 1.0, 0.75), + ); + } + cpos += cvel * dt; + } + + let t = get_time(); + + // Bike wheels + draw_texture_ex( + assets.bike_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new( + 0.0, + (t * 32.0 * pedal_speed_visual % 4.0).floor() as f32 * 32.0, + 32.0, + 32.0, + )), + ..Default::default() + }, + ); + + // Bike frame + draw_texture_ex( + assets.bike_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new(32.0, 32.0, 32.0, 32.0)), + ..Default::default() + }, + ); + + // Pedals + draw_texture_ex( + assets.bike_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new( + 64.0, + (t * 4.0 * pedal_speed_visual % 2.0).floor() as f32 * 32.0, + 32.0, + 32.0, + )), + ..Default::default() + }, + ); + + // The shadow + draw_texture_ex( + assets.bike_texture, + self.pos.x + 4.0, + self.pos.y + 29.0, + Color::new(0.0, 0.0, 0.0, 0.5), + DrawTextureParams { + source: Some(Rect::new(32.0, 96.0, 32.0, 32.0)), + ..Default::default() + }, + ); + + // The character + draw_texture_ex( + assets.bike_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new( + 96.0, + (t * 4.0 * pedal_speed_visual % 2.0).floor() as f32 * 32.0, + 32.0, + 32.0, + )), + ..Default::default() + }, + ); + } +} + +struct World<'a> { + slices: LinkedList<(f32, Slice)>, + player: Player, + projectiles: Vec, + particles: ParticleWorld<'a>, + particle_controller_ring: ParticleControllerRing, + particle_controller_pop_up: ParticleControllerPopUp, + score: u64, + score_computed: u64, +} + +enum CollisionType { + Door, + Window, +} + +impl CollisionType { + fn score(&self) -> u64 { + match *self { + CollisionType::Door => 100, + CollisionType::Window => 200, + } + } + + fn particle(&self) -> ParticleType { + match *self { + CollisionType::Door => ParticleType::Score100, + CollisionType::Window => ParticleType::Score200, + } + } +} + +fn find_collision<'a>( + projectile: &Projectile, + slices: impl Iterator, +) -> Option<(&'a mut dyn BoundingBox, Rect, CollisionType)> { + let angle = + (-projectile.velocity.angle_between(vec2(1.0, 0.0))).rem_euclid(std::f32::consts::PI * 2.0); + + let check_atttach = |aabb: &dyn BoundingBox, attach_point: Vec2| -> Option { + if let Some(bounds) = aabb.get_bounds() { + let bounds_real = bounds.offset(attach_point); + if bounds_real.contains(projectile.pos) && aabb.can_enter_from_dir(angle) { + return Some(bounds_real); + } + } + + None + }; + + for (x, slice) in slices { + if let Some(ref mut house) = slice.house { + let house_pos = vec2(0.0, SCREEN_HEIGHT) - Slice::HOUSE_ATTACH_POINT + + vec2(*x, 0.0) + + house.attach_offset(); + + match house { + House::Round { + door: Attach(door_attach, door), + window: Attach(window_attach, window), + } => { + if let Some(bounds_real) = check_atttach(door, house_pos + *door_attach) { + return Some((door, bounds_real, CollisionType::Door)); + } + + if let Some(bounds_real) = check_atttach(window, house_pos + *window_attach) { + return Some((window, bounds_real, CollisionType::Window)); + } + } + House::Wooden { + door: Attach(door_attach, door), + window_left: Attach(window_left_attach, window_left), + window_right: Attach(window_right_attach, window_right), + } => { + if let Some(bounds_real) = check_atttach(door, house_pos + *door_attach) { + return Some((door, bounds_real, CollisionType::Door)); + } + + if let Some(bounds_real) = + check_atttach(window_left, house_pos + *window_left_attach) + { + return Some((window_left, bounds_real, CollisionType::Window)); + } + + if let Some(bounds_real) = + check_atttach(window_right, house_pos + *window_right_attach) + { + return Some((window_right, bounds_real, CollisionType::Window)); + } + } + }; + } + } + + None +} + +impl<'a> World<'a> { + fn new() -> Self { + let mut slices = LinkedList::new(); + + for i in 0..(SCREEN_WIDTH / 64.0).ceil() as i32 { + let mut slice = Slice::generate(); + slice.road_border = RoadBorderPosition::None; + slices.push_back((i as f32 * Slice::WIDTH, slice)); + } + + World { + slices, + player: Player::new(), + projectiles: Vec::new(), + particles: ParticleWorld::default(), + particle_controller_ring: ParticleControllerRing, + particle_controller_pop_up: ParticleControllerPopUp, + score: 0, + score_computed: 0, + } + } + + fn render(&mut self, assets: &Assets) { + for (x, _) in self.slices.iter_mut() { + *x -= self.player.speed as f32 * get_frame_time() * Slice::WIDTH; + } + + for proj in self.projectiles.iter_mut() { + proj.pos.x -= self.player.speed as f32 * get_frame_time() * Slice::WIDTH; + } + + while let Some((x, _)) = self.slices.front_mut() { + if *x > -Slice::WIDTH * 5.0 { + break; + } + + self.slices.pop_front(); + } + + while let Some((x, _)) = self.slices.back() { + if *x < SCREEN_WIDTH + Slice::WIDTH { + self.slices.push_back((x + Slice::WIDTH, Slice::generate())); + continue; + } + + break; + } + + for (x, slice) in self.slices.iter_mut() { + slice.render(vec2(*x, SCREEN_HEIGHT), assets); + } + + if is_key_pressed(KeyCode::Space) && self.player.lives > 0 { + play_sound_once(assets.shoot_sound); + + self.projectiles.push(Projectile::new( + self.player.pos, + self.player.shoot_velocity(), + )); + + self.particles.spawn( + ConfigRingBasic { + particle_type: ParticleType::Explosion, + pos: self.player.pos, + fade_start: 0.5, + lifetime: 0.5, + count: 10, + radius: 5.0..7.0, + velocity: 10.0, + scale: 1.0, + color: color::WHITE, + angle_cone: Some(0.0..std::f32::consts::FRAC_PI_2), + }, + &self.particle_controller_ring, + ); + } + + let dt = get_frame_time(); + self.particles.render(dt, assets); + + self.projectiles.retain_mut(|p| { + if let Some((hit, bounds, collision_type)) = find_collision(p, self.slices.iter_mut()) { + let rad = bounds.size().length() / 2.0; + self.particles.spawn( + ConfigRingBasic { + particle_type: ParticleType::Spark, + pos: bounds.center(), + lifetime: 0.75, + count: 20, + radius: rad * 0.75..rad * 1.25, + velocity: 5.0, + fade_start: 0.6, + scale: 0.5, + color: color::WHITE, + angle_cone: None, + }, + &self.particle_controller_ring, + ); + + let pos = Vec2::new(bounds.x + bounds.w / 2.0, bounds.y - 4.0); + + hit.replace_with_closed(); + + self.score += collision_type.score(); + + self.particles.spawn( + ConfigPopUpBasic { + particle_type: collision_type.particle(), + pos, + lifetime: 0.75, + velocity: vec2(0.0, -10.0), + accel: vec2(0.0, 20.0), + fade_start: 0.6, + scale: 0.5, + color: color::WHITE, + }, + &self.particle_controller_pop_up, + ); + + play_sound_once(assets.hit_sound); + + return false; + } + + p.render(assets); + + p.particle_timer += dt; + + if p.particle_timer > 0.05 { + let mut color = color::hsl_to_rgb(f32::gen_range(0.0, 1.0), 1.0, 0.5); + color.a = 0.5; + self.particles.spawn( + ConfigRingBasic { + particle_type: ParticleType::Heart, + pos: p.pos, + lifetime: 0.75, + fade_start: 0.3, + count: 1, + radius: 0.0..1.0, + velocity: 2.0, + scale: 1.0, + color, + angle_cone: None, + }, + &self.particle_controller_ring, + ); + p.particle_timer = 0.0; + } + + if p.pos.y < SCREEN_HEIGHT + 20.0 { + true + } else { + self.score = self.score.saturating_sub(50); + + self.particles.spawn( + ConfigRingBasic { + particle_type: ParticleType::Explosion, + pos: vec2(p.pos.x, SCREEN_HEIGHT + 5.0), + lifetime: 1.0, + fade_start: 0.7, + count: 20, + radius: 0.0..1.0, + velocity: 25.0, + scale: 0.5, + color: color::WHITE, + angle_cone: Some( + std::f32::consts::FRAC_PI_2 - 0.5..std::f32::consts::FRAC_PI_2 + 0.5, + ), + }, + &self.particle_controller_ring, + ); + + play_sound_once(assets.miss_sound); + + false + } + }); + + if self.player.lives > 0 { + for (x, slice) in self.slices.iter_mut() { + let slice_pos = vec2(0.0, SCREEN_HEIGHT) + vec2(*x, 0.0); + + match slice.road_border { + RoadBorderPosition::None => {} + RoadBorderPosition::Top(_) => { + if Rect::new( + slice_pos.x + 12.0 - 30.0, + slice_pos.y - 54.0 - 29.0, + 12.0, + 25.0, + ) + .contains(self.player.pos) + { + self.player.lives -= 1; + play_sound_once(assets.lose_life_sound); + slice.road_border = RoadBorderPosition::None; + } + } + RoadBorderPosition::Bottom(_) => { + if Rect::new( + slice_pos.x + 12.0 - 30.0, + slice_pos.y - 25.0 - 29.0, + 12.0, + 25.0, + ) + .contains(self.player.pos) + { + self.player.lives -= 1; + play_sound_once(assets.lose_life_sound); + slice.road_border = RoadBorderPosition::None; + } + } + }; + } + + self.player.render(assets); + } + + for (x, slice) in self.slices.iter_mut() { + slice.render_front(vec2(*x, SCREEN_HEIGHT), assets); + } + + if self.player.lives > 0 { + self.score_computed = self.score + (self.player.speed * 1000.0).floor() as u64; + } + + // Let's say the player is roughly 1.70m + let px_to_m: f64 = 15.0 / Slice::WIDTH as f64; + let speed_text = format!( + "Speed: {:.2}km/h", + self.player.speed * Slice::WIDTH as f64 * px_to_m + ); + draw_string(&speed_text, 2.0, 20.4, color::BLACK, assets.font); + draw_string(&speed_text, 2.0, 20.0, color::PURPLE, assets.font); + + let score_text = format!("Score: {:09}", self.score_computed); + draw_string(&score_text, 2.0, 10.4, color::BLACK, assets.font); + draw_string(&score_text, 2.0, 10.0, color::WHITE, assets.font); + + let lives_text = "Lives:"; + draw_string( + lives_text, + SCREEN_WIDTH - 60.0, + 10.4, + color::BLACK, + assets.font, + ); + draw_string( + lives_text, + SCREEN_WIDTH - 60.0, + 10.0, + color::WHITE, + assets.font, + ); + + for i in 0..self.player.lives { + draw_texture_ex( + assets.blobcat_texture, + SCREEN_WIDTH - 60.0 + 10.0 * i as f32, + 12.0, + color::WHITE, + DrawTextureParams { + dest_size: Some(vec2(16.0, 16.0)), + ..Default::default() + }, + ); + } + } +} + +enum ProjectileType { + Cat, + Fox, + Corgi, +} + +impl ProjectileType { + fn generate() -> Self { + match u32::gen_range(0, 100) { + ..=70 => ProjectileType::Cat, + 71..=98 => ProjectileType::Fox, + _ => ProjectileType::Corgi, + } + } + + fn sprite_rect(&self) -> Rect { + match *self { + ProjectileType::Cat => Rect::new(0.0, 0.0, 16.0, 16.0), + ProjectileType::Fox => Rect::new(17.0, 0.0, 16.0, 16.0), + ProjectileType::Corgi => Rect::new(18.0, 0.0, 16.0, 16.0), + } + } +} + +pub struct Projectile { + projectile_type: ProjectileType, + pos: Vec2, + velocity: Vec2, + rot: f32, + rot_velocity: f32, + particle_timer: f32, +} + +impl Projectile { + fn new(pos: Vec2, velocity: Vec2) -> Self { + Projectile { + projectile_type: ProjectileType::generate(), + pos, + velocity, + rot: f32::gen_range(0.0, std::f32::consts::PI * 2.0), + rot_velocity: f32::gen_range(-std::f32::consts::PI, std::f32::consts::PI), + particle_timer: 0.01, + } + } + + fn render(&mut self, assets: &Assets) { + let dt = get_frame_time(); + + self.velocity.y += 128.0 * dt; + self.pos += self.velocity * dt; + self.rot += self.rot_velocity * dt; + + let sprite_rect = self.projectile_type.sprite_rect(); + + draw_texture_ex( + assets.projectiles_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(sprite_rect), + rotation: self.rot, + dest_size: Some(sprite_rect.size() / 2.0), + ..Default::default() + }, + ); + } +} + +pub struct GameWorld<'a> { + sky: Sky, + world: World<'a>, +} + +impl Default for GameWorld<'_> { + fn default() -> Self { + GameWorld { + sky: Sky::default(), + world: World::new(), + } + } +} + +impl<'a> GameWorld<'a> { + pub async fn frame(&mut self, assets: &Assets) { + self.sky.render(assets); + + self.world.render(assets); + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..85c6b53 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,70 @@ +pub mod assets; +pub mod config; +pub mod game; +mod menu; +pub mod particle; +pub mod sky; + +use crate::assets::Assets; +use crate::config::{SCREEN_ASPECT, SCREEN_HEIGHT, SCREEN_WIDTH}; +use crate::game::{GameState, GameWorld}; +use crate::menu::GameMenu; +use macroquad::audio::AudioContext; +use macroquad::prelude::*; + +fn window_conf() -> Conf { + Conf { + window_title: "Blobcat Delivery".parse().unwrap(), + window_width: 1280, + window_height: 720, + ..Default::default() + } +} + +#[macroquad::main(window_conf)] +async fn main() { + let _audio = AudioContext::new(); + let assets = Assets::load().await; + + let mut game_state = GameState::Menu(GameMenu::default()); + + loop { + let sw = screen_width(); + let sh = screen_height(); + let rr = sw / sh; + let rw = if rr > SCREEN_ASPECT { + SCREEN_ASPECT / rr + } else { + 1.0 + }; + let rh = if rr > SCREEN_ASPECT { + 1.0 + } else { + rr / SCREEN_ASPECT + }; + + set_camera(&Camera2D { + zoom: vec2( + 1.0 / SCREEN_WIDTH * 2.0 * rw, + 1.0 / -SCREEN_HEIGHT * 2.0 * rh, + ), + target: vec2(SCREEN_WIDTH / 2.0, SCREEN_HEIGHT / 2.0), + ..Default::default() + }); + + match &mut game_state { + GameState::Game(game) => { + clear_background(SKYBLUE); + game.frame(&assets).await; + } + GameState::Menu(menu) => { + clear_background(DARKBLUE); + if menu.frame(&assets).await { + game_state = GameState::Game(GameWorld::default()); + } + } + } + + next_frame().await + } +} diff --git a/src/menu.rs b/src/menu.rs new file mode 100644 index 0000000..15cab38 --- /dev/null +++ b/src/menu.rs @@ -0,0 +1,135 @@ +use crate::assets::{draw_string, Assets}; +use crate::config::{SCREEN_HEIGHT, SCREEN_WIDTH}; +use crate::sky::Sky; +use macroquad::color; +use macroquad::input::{is_key_pressed, KeyCode}; +use macroquad::math::{vec2, Rect, Vec2}; +use macroquad::prelude::draw_texture_ex; +use macroquad::texture::{draw_texture, DrawTextureParams}; +use macroquad::time::get_frame_time; + +struct BlobCat { + pos: Vec2, + velocity: Vec2, + rot: f32, +} + +impl Default for BlobCat { + fn default() -> Self { + BlobCat { + pos: vec2(25.0, 100.0), + velocity: vec2(25.0, 25.0), + rot: 0.0, + } + } +} + +impl BlobCat { + fn render(&mut self, assets: &Assets) { + if self.pos.x < 0.0 { + self.velocity.x = self.velocity.x.abs(); + } + + if self.pos.x > SCREEN_WIDTH - 32.0 { + self.velocity.x = -self.velocity.x.abs(); + } + + if self.pos.y < 0.0 { + self.velocity.y = self.velocity.y.abs(); + } + + if self.pos.y > SCREEN_HEIGHT - 32.0 { + self.velocity.y = -self.velocity.y.abs(); + } + + let dt = get_frame_time(); + self.pos += self.velocity * dt; + self.rot += dt; + + draw_texture_ex( + assets.blobcat_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + rotation: self.rot, + ..Default::default() + }, + ); + } +} + +#[derive(Default)] +pub struct GameMenu { + sky: Sky, + blobcat: BlobCat, +} + +impl GameMenu { + pub async fn frame(&mut self, assets: &Assets) -> bool { + self.sky.render(assets); + + self.blobcat.render(assets); + + draw_texture( + assets.menu_texture, + SCREEN_WIDTH / 2.0 - 64.0, + SCREEN_HEIGHT / 2.0 - 95.0, + color::BLACK, + ); + draw_texture( + assets.menu_texture, + SCREEN_WIDTH / 2.0 - 64.0, + SCREEN_HEIGHT / 2.0 - 96.0, + color::WHITE, + ); + + draw_texture_ex( + assets.controls_texture, + SCREEN_WIDTH / 2.0 - 96.0, + SCREEN_HEIGHT / 2.0 - 5.0, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new(0.0, 0.0, 106.0, 32.0)), + ..Default::default() + }, + ); + + let move_text = "Movement"; + let move_x = SCREEN_WIDTH / 2.0 - 60.0; + let move_y = SCREEN_HEIGHT / 2.0 + 38.0; + draw_string(move_text, move_x, move_y + 0.4, color::BLACK, assets.font); + draw_string(move_text, move_x, move_y, color::WHITE, assets.font); + + draw_texture_ex( + assets.controls_texture, + SCREEN_WIDTH / 2.0 + 24.0, + SCREEN_HEIGHT / 2.0 + 13.0, + color::WHITE, + DrawTextureParams { + source: Some(Rect::new(0.0, 32.0, 48.0, 16.0)), + ..Default::default() + }, + ); + + let shoot_text = "Shoot"; + let shoot_x = SCREEN_WIDTH / 2.0 + 35.0; + let shoot_y = SCREEN_HEIGHT / 2.0 + 38.0; + draw_string( + shoot_text, + shoot_x, + shoot_y + 0.4, + color::BLACK, + assets.font, + ); + draw_string(shoot_text, shoot_x, shoot_y, color::WHITE, assets.font); + + let play_text = "Press [Space] to play..."; + let play_x = SCREEN_WIDTH / 2.0 - 40.0; + let play_y = SCREEN_HEIGHT / 2.0 + 60.0; + draw_string(play_text, play_x, play_y + 0.4, color::BLACK, assets.font); + draw_string(play_text, play_x, play_y, color::WHITE, assets.font); + + is_key_pressed(KeyCode::Space) + } +} diff --git a/src/particle.rs b/src/particle.rs new file mode 100644 index 0000000..ea8ed72 --- /dev/null +++ b/src/particle.rs @@ -0,0 +1,363 @@ +use crate::assets::Assets; +use macroquad::color; +use macroquad::color::Color; +use macroquad::logging::debug; +use macroquad::math::{vec2, Rect, Vec2}; +use macroquad::prelude::DrawTextureParams; +use macroquad::rand::RandomRange; +use macroquad::texture::draw_texture_ex; +use std::ops::Range; + +#[derive(Default)] +pub struct ParticleWorld<'a> { + particles: Vec>, +} + +impl ParticleWorld<'_> { + pub fn spawn( + &mut self, + config: C, + controller: &'_ (impl ParticleController + ParticleSpawner), + ) { + controller.spawn(config, |c| self.particles.push(c)); + } + + pub fn render(&mut self, dt: f32, assets: &Assets) { + self.particles.retain_mut(|particle| { + !matches!( + particle.controller.render(dt, particle, assets), + ParticleLifetime::Destroy + ) + }) + } +} + +#[derive(Copy, Clone)] +pub enum ParticleType { + Spark, + Heart, + Explosion, + Score100, + Score200, + Fail, +} + +const SPARK_FRAMES: &[Rect] = &[ + Rect { + x: 0.0, + y: 0.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 8.0, + y: 0.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 16.0, + y: 0.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 24.0, + y: 0.0, + w: 8.0, + h: 8.0, + }, +]; + +const HEART_FRAMES: &[Rect] = &[ + Rect { + x: 0.0, + y: 8.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 8.0, + y: 8.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 16.0, + y: 8.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 24.0, + y: 8.0, + w: 8.0, + h: 8.0, + }, +]; + +const EXPLOSION_FRAMES: &[Rect] = &[ + Rect { + x: 0.0, + y: 16.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 8.0, + y: 16.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 16.0, + y: 16.0, + w: 8.0, + h: 8.0, + }, + Rect { + x: 24.0, + y: 16.0, + w: 8.0, + h: 8.0, + }, +]; + +const SCORE100_FRAMES: &[Rect] = &[Rect { + x: 1.0, + y: 25.0, + w: 27.0, + h: 15.0, +}]; + +const SCORE200_FRAMES: &[Rect] = &[Rect { + x: 33.0, + y: 25.0, + w: 27.0, + h: 15.0, +}]; + +const FAIL_FRAMES: &[Rect] = &[Rect { + x: 32.0, + y: 9.0, + w: 14.0, + h: 14.0, +}]; + +impl ParticleType { + fn frames(&self) -> &[Rect] { + match *self { + ParticleType::Spark => SPARK_FRAMES, + ParticleType::Heart => HEART_FRAMES, + ParticleType::Explosion => EXPLOSION_FRAMES, + ParticleType::Score100 => SCORE100_FRAMES, + ParticleType::Score200 => SCORE200_FRAMES, + ParticleType::Fail => FAIL_FRAMES, + } + } +} + +#[derive(Copy, Clone, Default)] +pub enum AnimationMode { + #[default] + TieToLifetime, + Repeat(f32), +} + +#[derive(Default)] +pub struct ParticleState { + pos: Vec2, + velocity: Vec2, + accel: Vec2, + rot: f32, + rot_velocity: f32, + lifetime: f32, + max_lifetime: f32, + color: Color, + animation_mode: AnimationMode, + scale: f32, + fade_start: f32, +} + +pub struct Particle<'a> { + particle_type: ParticleType, + state: ParticleState, + controller: &'a dyn ParticleController, +} + +pub enum ParticleLifetime { + Keep, + Destroy, +} + +pub trait ParticleSpawner { + type Config; + + fn spawn<'a>(&'a self, config: Self::Config, consumer: impl FnMut(Particle<'a>)); +} + +pub trait ParticleController { + fn render(&self, dt: f32, particle: &mut Particle<'_>, assets: &Assets) -> ParticleLifetime; +} + +// Implementations! + +fn tick(state: &mut ParticleState, dt: f32) { + state.lifetime += dt; + state.velocity += state.accel * dt; + state.pos += state.velocity * dt; + state.rot += state.rot_velocity * dt; + state.color.a = ((state.fade_start - state.lifetime) / (state.max_lifetime - state.fade_start)) + .max(0.0) + .min(1.0) +} + +fn render_quad(particle_type: ParticleType, state: &ParticleState, assets: &Assets) { + let sprite_rect = particle_type.frames(); + + let frame = match state.animation_mode { + AnimationMode::TieToLifetime if state.max_lifetime <= 0.0 => sprite_rect[0], + AnimationMode::TieToLifetime => { + sprite_rect[((state.lifetime / state.max_lifetime) * sprite_rect.len() as f32).floor() + as usize + % sprite_rect.len()] + } + AnimationMode::Repeat(loop_len) => { + sprite_rect[((state.lifetime / loop_len % 1.0) * sprite_rect.len() as f32).floor() + as usize + % sprite_rect.len()] + } + }; + + draw_texture_ex( + assets.particles_texture, + state.pos.x, + state.pos.y, + state.color, + DrawTextureParams { + dest_size: Some(frame.size() * state.scale), + rotation: state.rot, + source: Some(frame), + ..Default::default() + }, + ); +} + +// Ring + +#[derive(Clone)] +pub struct ConfigRingBasic { + pub particle_type: ParticleType, + pub pos: Vec2, + pub lifetime: f32, + pub count: usize, + pub radius: Range, + pub velocity: f32, + pub scale: f32, + pub color: Color, + pub fade_start: f32, + pub angle_cone: Option>, +} + +pub struct ParticleControllerRing; + +impl ParticleSpawner for ParticleControllerRing { + type Config = ConfigRingBasic; + + fn spawn<'a>(&'a self, config: Self::Config, mut consumer: impl FnMut(Particle<'a>)) { + for _ in 0..config.count { + let angle = if let Some(ref cone) = config.angle_cone { + f32::gen_range(cone.start, cone.end) + } else { + f32::gen_range(0.0, 2.0 * std::f32::consts::PI) + }; + let r = f32::gen_range(config.radius.start, config.radius.end); + + let cos_t = angle.cos(); + let sin_t = -angle.sin(); + + let x = config.pos.x + cos_t * r; + let y = config.pos.y + sin_t * r; + + let vel = vec2(cos_t, sin_t) * config.velocity; + + consumer(Particle { + particle_type: config.particle_type, + state: ParticleState { + pos: vec2(x, y), + velocity: vel, + rot: f32::gen_range(0.0, 2.0 * std::f32::consts::PI), + color: config.color, + max_lifetime: config.lifetime, + scale: config.scale, + fade_start: config.fade_start, + ..Default::default() + }, + controller: self, + }); + } + } +} + +impl ParticleController for ParticleControllerRing { + fn render(&self, dt: f32, particle: &mut Particle<'_>, assets: &Assets) -> ParticleLifetime { + tick(&mut particle.state, dt); + + if particle.state.lifetime > particle.state.max_lifetime { + ParticleLifetime::Destroy + } else { + render_quad(particle.particle_type, &particle.state, assets); + ParticleLifetime::Keep + } + } +} + +// PopUp + +#[derive(Clone)] +pub struct ConfigPopUpBasic { + pub particle_type: ParticleType, + pub pos: Vec2, + pub lifetime: f32, + pub velocity: Vec2, + pub scale: f32, + pub color: Color, + pub fade_start: f32, + pub accel: Vec2, +} + +pub struct ParticleControllerPopUp; + +impl ParticleSpawner for ParticleControllerPopUp { + type Config = ConfigPopUpBasic; + + fn spawn<'a>(&'a self, config: Self::Config, mut consumer: impl FnMut(Particle<'a>)) { + consumer(Particle { + particle_type: config.particle_type, + state: ParticleState { + pos: config.pos, + velocity: config.velocity, + color: config.color, + max_lifetime: config.lifetime, + scale: config.scale, + fade_start: config.fade_start, + accel: config.accel, + ..Default::default() + }, + controller: self, + }); + } +} + +impl ParticleController for ParticleControllerPopUp { + fn render(&self, dt: f32, particle: &mut Particle<'_>, assets: &Assets) -> ParticleLifetime { + tick(&mut particle.state, dt); + + if particle.state.lifetime > particle.state.max_lifetime { + ParticleLifetime::Destroy + } else { + render_quad(particle.particle_type, &particle.state, assets); + ParticleLifetime::Keep + } + } +} diff --git a/src/sky.rs b/src/sky.rs new file mode 100644 index 0000000..d1b47b1 --- /dev/null +++ b/src/sky.rs @@ -0,0 +1,88 @@ +use crate::assets::Assets; +use crate::config::{SCREEN_HEIGHT, SCREEN_WIDTH}; +use macroquad::color; +use macroquad::color::Color; +use macroquad::math::Vec2; +use macroquad::prelude::{draw_texture, draw_texture_ex, get_frame_time, DrawTextureParams}; +use macroquad::rand::RandomRange; + +pub struct Sky { + sun: Sun, + clouds: Vec, +} + +impl Default for Sky { + fn default() -> Self { + let sun = Sun { + rot: -core::f32::consts::FRAC_PI_6, + pos: Vec2::new(25.0, 25.0), + }; + + let mut clouds = Vec::new(); + const CLOUD_CNT: usize = 20; + + for i in 0..CLOUD_CNT { + let pos_x = f32::gen_range(0.0, SCREEN_WIDTH); + let pos_y = f32::gen_range(0.0, 16384.0); + let speed = f32::gen_range(5.0, 15.0); + clouds.push(Cloud { + pos: Vec2::new(pos_x, pos_y), + speed, + shade: 0.75 + 0.25 * i as f32 / CLOUD_CNT as f32, + }) + } + + Self { sun, clouds } + } +} + +impl Sky { + pub fn render(&mut self, assets: &Assets) { + self.sun.draw(assets); + + self.clouds.iter_mut().for_each(|cloud| cloud.draw(assets)); + } +} + +pub struct Sun { + pub pos: Vec2, + pub rot: f32, +} + +impl Sun { + pub fn draw(&self, assets: &Assets) { + draw_texture_ex( + assets.sun_texture, + self.pos.x, + self.pos.y, + color::WHITE, + DrawTextureParams { + rotation: self.rot, + ..Default::default() + }, + ); + } +} + +#[derive(Debug)] +pub struct Cloud { + pos: Vec2, + speed: f32, + shade: f32, +} + +impl Cloud { + pub fn draw(&mut self, assets: &Assets) { + self.pos.x -= self.speed * get_frame_time(); + + let w = assets.cloud_texture.width(); + let h = assets.cloud_texture.height(); + + draw_texture( + assets.cloud_texture, + self.pos.x.rem_euclid(SCREEN_WIDTH + w * 4.0) - w * 2.0, + self.pos.y.rem_euclid(SCREEN_HEIGHT / 3.0 - h), + Color::new(self.shade, self.shade, 1.0, 1.0), + ); + } +}