commit 090c8a684933385899527d7fb4f35251f11edef2 Author: Joey Hines Date: Sat Oct 25 14:20:09 2025 -0600 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..518fd17 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b6b1bf8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/on-deck.iml b/.idea/on-deck.iml new file mode 100644 index 0000000..cf84ae4 --- /dev/null +++ b/.idea/on-deck.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..af3c7fc --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,878 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "config" +version = "0.15.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "pathdiff", + "ron", + "rust-ini", + "serde-untagged", + "serde_core", + "serde_json", + "toml", + "winnow", + "yaml-rust2", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "fontdue" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e57e16b3fe8ff4364c0661fdaac543fb38b29ea9bc9c2f45612d90adf931d2b" +dependencies = [ + "hashbrown 0.15.5", + "ttf-parser", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "glam" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", + "png", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "macroquad" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2befbae373456143ef55aa93a73594d080adfb111dc32ec96a1123a3e4ff4ae" +dependencies = [ + "fontdue", + "glam", + "image", + "macroquad_macro", + "miniquad", + "quad-rand", +] + +[[package]] +name = "macroquad_macro" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b1d96218903768c1ce078b657c0d5965465c95a60d2682fd97443c9d2483dd" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miniquad" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fb3e758e46dbc45716a8a49ca9edc54b15bcca826277e80b1f690708f67f9e3" +dependencies = [ + "libc", + "ndk-sys", + "objc-rs", + "winapi", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "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-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc-rs" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a1e7069a2525126bf12a9f1f7916835fafade384fb27cabf698e745e2a1eb8" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "on-deck" +version = "0.1.0" +dependencies = [ + "config", + "macroquad", + "rand", + "serde", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +dependencies = [ + "pest", + "sha2", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quad-rand" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a651516ddc9168ebd67b24afd085a718be02f8858fe406591b013d101ce2f40" + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64", + "bitflags 2.9.4", + "serde", + "serde_derive", +] + +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "syn" +version = "2.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[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" + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1ffb8f6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "on-deck" +version = "0.1.0" +edition = "2024" + +[dependencies] +config = "0.15.18" +macroquad = "0.4.14" +serde = { version = "1.0.228", features = ["derive"] } +rand = "0.9.0" diff --git a/fonts/ARCADECLASSIC.TTF b/fonts/ARCADECLASSIC.TTF new file mode 100644 index 0000000..394a9f7 Binary files /dev/null and b/fonts/ARCADECLASSIC.TTF differ diff --git a/fonts/BoldPixels.ttf b/fonts/BoldPixels.ttf new file mode 100644 index 0000000..cc4fe5c Binary files /dev/null and b/fonts/BoldPixels.ttf differ diff --git a/fonts/ByteBounce.ttf b/fonts/ByteBounce.ttf new file mode 100644 index 0000000..c07b420 Binary files /dev/null and b/fonts/ByteBounce.ttf differ diff --git a/fonts/Star Crush.ttf b/fonts/Star Crush.ttf new file mode 100644 index 0000000..d301e95 Binary files /dev/null and b/fonts/Star Crush.ttf differ diff --git a/fonts/Ubuntu-Bold.ttf b/fonts/Ubuntu-Bold.ttf new file mode 100644 index 0000000..c2293d5 Binary files /dev/null and b/fonts/Ubuntu-Bold.ttf differ diff --git a/fonts/Ubuntu-BoldItalic.ttf b/fonts/Ubuntu-BoldItalic.ttf new file mode 100644 index 0000000..a3f4996 Binary files /dev/null and b/fonts/Ubuntu-BoldItalic.ttf differ diff --git a/fonts/Ubuntu-Italic.ttf b/fonts/Ubuntu-Italic.ttf new file mode 100644 index 0000000..6bd39b0 Binary files /dev/null and b/fonts/Ubuntu-Italic.ttf differ diff --git a/fonts/Ubuntu-Light.ttf b/fonts/Ubuntu-Light.ttf new file mode 100644 index 0000000..b310d15 Binary files /dev/null and b/fonts/Ubuntu-Light.ttf differ diff --git a/fonts/Ubuntu-LightItalic.ttf b/fonts/Ubuntu-LightItalic.ttf new file mode 100644 index 0000000..ce675ef Binary files /dev/null and b/fonts/Ubuntu-LightItalic.ttf differ diff --git a/fonts/Ubuntu-Medium.ttf b/fonts/Ubuntu-Medium.ttf new file mode 100644 index 0000000..7340a40 Binary files /dev/null and b/fonts/Ubuntu-Medium.ttf differ diff --git a/fonts/Ubuntu-MediumItalic.ttf b/fonts/Ubuntu-MediumItalic.ttf new file mode 100644 index 0000000..36ac1ae Binary files /dev/null and b/fonts/Ubuntu-MediumItalic.ttf differ diff --git a/fonts/Ubuntu-Regular.ttf b/fonts/Ubuntu-Regular.ttf new file mode 100644 index 0000000..b5505e6 Binary files /dev/null and b/fonts/Ubuntu-Regular.ttf differ diff --git a/fonts/ka1.ttf b/fonts/ka1.ttf new file mode 100644 index 0000000..d1df852 Binary files /dev/null and b/fonts/ka1.ttf differ diff --git a/src/effects/mod.rs b/src/effects/mod.rs new file mode 100644 index 0000000..fe45ad6 --- /dev/null +++ b/src/effects/mod.rs @@ -0,0 +1,20 @@ +use macroquad::color::Color; +use macroquad::prelude::{draw_circle, screen_height, screen_width}; +use rand::prelude::SmallRng; +use rand::{Rng, SeedableRng}; + +pub fn star_field() { + let mut rng = SmallRng::seed_from_u64(0x55); + + for x in (0..screen_width() as u32).step_by(5) { + for y in (0..screen_height() as u32).step_by(5) { + if rng.random_bool(0.01) { + let brightness = rand::random_range(0.75..1.0); + + let color = Color::new(brightness, brightness, brightness, 1.0); + + draw_circle(x as f32, y as f32, screen_height() * 0.001, color); + } + } + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..9473e24 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,62 @@ +mod effects; +mod slide; +mod slide_show_config; +mod slides; +mod text_drawer; + +use macroquad::prelude::*; + +use crate::slide_show_config::{Context, SlideShowTheme}; +use crate::slides::Slideshow; +use crate::slides::title::Title; +use crate::text_drawer::{Justified, TextConfigBuilder}; + +fn window_conf() -> Conf { + Conf { + window_title: "On Deck".to_owned(), + fullscreen: true, + platform: miniquad::conf::Platform { + ..Default::default() + }, + ..Default::default() + } +} + +#[macroquad::main(window_conf)] +async fn main() { + let heading = load_ttf_font("fonts/BoldPixels.ttf").await.unwrap(); + let body = load_ttf_font("fonts/ByteBounce.ttf").await.unwrap(); + + let slide_show_theme = SlideShowTheme { + title_config: TextConfigBuilder::default() + .justification(Justified::Center) + .font_size(250) + .font(&heading) + .color(WHITE) + .build(), + heading_config: TextConfigBuilder::default() + .justification(Justified::CenterHorizontal) + .font(&heading) + .color(WHITE) + .font_size(100) + .build(), + body_config: TextConfigBuilder::default() + .justification(Justified::Left) + .font(&body) + .font_size(50) + .color(WHITE) + .build(), + }; + + let mut slideshow = Slideshow::new(Context::new(slide_show_theme)); + + slideshow.add_slide(Title::new("Software As a Bit".to_string())); + + loop { + if slideshow.handle_slide_show() { + return; + } + + next_frame().await; + } +} diff --git a/src/slide.rs b/src/slide.rs new file mode 100644 index 0000000..e091644 --- /dev/null +++ b/src/slide.rs @@ -0,0 +1,5 @@ +use crate::slide_show_config::Context; + +pub trait Slide { + fn display(&mut self, ctx: &Context<'_>); +} diff --git a/src/slide_show_config.rs b/src/slide_show_config.rs new file mode 100644 index 0000000..a2b7318 --- /dev/null +++ b/src/slide_show_config.rs @@ -0,0 +1,20 @@ +use crate::text_drawer::TextConfig; + +#[allow(dead_code)] +#[derive(Debug)] +pub struct SlideShowTheme<'a> { + pub title_config: TextConfig<'a>, + pub heading_config: TextConfig<'a>, + pub body_config: TextConfig<'a>, +} + +#[derive(Debug)] +pub struct Context<'a> { + pub slide_show_theme: SlideShowTheme<'a>, +} + +impl<'a> Context<'a> { + pub fn new(slide_show_theme: SlideShowTheme<'a>) -> Self { + Self { slide_show_theme } + } +} diff --git a/src/slides/mod.rs b/src/slides/mod.rs new file mode 100644 index 0000000..60911d8 --- /dev/null +++ b/src/slides/mod.rs @@ -0,0 +1,35 @@ +use crate::slide::Slide; +use crate::slide_show_config::Context; +use macroquad::input::{KeyCode, is_key_pressed}; + +pub mod title; + +pub struct Slideshow<'a> { + pub current_slide: usize, + pub slides: Vec>, + pub ctx: Context<'a>, +} + +impl<'a> Slideshow<'a> { + pub fn new(ctx: Context<'a>) -> Self { + Self { + current_slide: 0, + slides: vec![], + ctx, + } + } + + pub fn add_slide(&mut self, slide: Box) { + self.slides.push(slide); + } + + pub fn handle_slide_show(&mut self) -> bool { + if is_key_pressed(KeyCode::Escape) { + return true; + }; + + self.slides[self.current_slide].display(&self.ctx); + + false + } +} diff --git a/src/slides/title.rs b/src/slides/title.rs new file mode 100644 index 0000000..b2adddd --- /dev/null +++ b/src/slides/title.rs @@ -0,0 +1,55 @@ +use crate::effects::star_field; +use crate::slide::Slide; +use crate::slide_show_config::Context; +use crate::text_drawer::TextConfigBuilder; +use macroquad::color::{BLACK, DARKGREEN, LIME}; +use macroquad::math::Vec2; +use macroquad::miniquad::window::screen_size; +use macroquad::prelude::{clear_background, screen_height}; +use macroquad::rand::ChooseRandom; +use macroquad::window::screen_width; + +#[derive(Debug)] +pub struct Title { + title: String, +} + +impl Title { + pub fn new(title: String) -> Box { + Box::new(Self { title }) + } +} + +impl Slide for Title { + fn display(&mut self, ctx: &Context<'_>) { + clear_background(BLACK); + star_field(); + + let title_builder: TextConfigBuilder = ctx.slide_show_theme.title_config.clone().into(); + let shadow_style = title_builder.clone().color(DARKGREEN).build(); + let title_style = title_builder.color(LIME).build(); + + let center = Vec2::from(screen_size()) * 0.5; + let center_offset = center + Vec2::from(screen_size()) * 0.005; + shadow_style.draw_text(&self.title, center_offset); + title_style.draw_text(&self.title, center); + + let author_pos = center + Vec2::new(0.0, screen_height() * 0.33); + ctx.slide_show_theme + .heading_config + .draw_text("By Joey Hines", author_pos); + + let bits = ["0", "1"]; + let bit_text_size = ctx.slide_show_theme.heading_config.measure_text("0"); + + let count_needed = (screen_width() / bit_text_size.width).ceil() as usize; + + let mut bit_pos = Vec2::new(0.0, center.y) + Vec2::new(0.0, screen_height() * 0.05); + for _ in 0..count_needed { + let bit = bits.choose().unwrap(); + let info = ctx.slide_show_theme.heading_config.draw_text(bit, bit_pos); + + bit_pos = info.pos + Vec2::new(info.text_dimensions.width, 0.0); + } + } +} diff --git a/src/text_drawer.rs b/src/text_drawer.rs new file mode 100644 index 0000000..8814881 --- /dev/null +++ b/src/text_drawer.rs @@ -0,0 +1,142 @@ +use macroquad::color::{BLACK, Color}; +use macroquad::math::Vec2; +use macroquad::prelude::{Font, TextDimensions}; +use macroquad::text::{TextParams, draw_text_ex, measure_text}; + +#[allow(dead_code)] +#[derive(Debug, Clone, Copy, Default)] +pub enum Justified { + Right, + Left, + #[default] + Center, + CenterVertical, + CenterHorizontal, +} + +impl Justified { + pub fn text_offset(&self, text_size: TextDimensions) -> Vec2 { + match self { + Justified::Right => Vec2::new(text_size.width, 0.0) * 0.5, + Justified::Left => Vec2::new(0.0, 0.0), + Justified::Center => -Vec2::new(text_size.width, text_size.height) * 0.5, + Justified::CenterVertical => -Vec2::new(0.0, text_size.height) * 0.5, + Justified::CenterHorizontal => -Vec2::new(text_size.width, 0.0) * 0.5, + } + } +} + +#[derive(Debug, Default, Clone)] +pub struct TextConfigBuilder<'a> { + text_config: TextConfig<'a>, +} + +#[allow(dead_code)] +impl<'a> TextConfigBuilder<'a> { + pub fn new(text_config: TextConfig<'a>) -> Self { + Self { text_config } + } + + pub fn font(mut self, font: &'a Font) -> Self { + self.text_config.font = Some(font); + self + } + + pub fn font_size(mut self, font_size: u16) -> Self { + self.text_config.font_size = font_size; + self + } + + pub fn font_scale(mut self, font_scale: f32) -> Self { + self.text_config.font_scale = font_scale; + self + } + + pub fn font_scale_aspect(mut self, font_scale_aspect: f32) -> Self { + self.text_config.font_scale_aspect = font_scale_aspect; + self + } + + pub fn rotation(mut self, rotation: f32) -> Self { + self.text_config.rotation = rotation; + self + } + + pub fn color(mut self, color: Color) -> Self { + self.text_config.color = color; + self + } + + pub fn justification(mut self, justification: Justified) -> Self { + self.text_config.justification = justification; + self + } + + pub fn build(self) -> TextConfig<'a> { + self.text_config + } +} + +#[derive(Debug)] +pub struct TextInfo { + pub text_dimensions: TextDimensions, + pub pos: Vec2, +} + +#[derive(Debug, Clone)] +pub struct TextConfig<'a> { + font: Option<&'a Font>, + font_size: u16, + font_scale: f32, + font_scale_aspect: f32, + rotation: f32, + color: Color, + justification: Justified, +} + +impl<'a> Default for TextConfig<'a> { + fn default() -> Self { + Self { + font: None, + font_size: 12, + font_scale: 1.0, + font_scale_aspect: 1.0, + rotation: 0.0, + color: BLACK, + justification: Default::default(), + } + } +} + +impl<'a> TextConfig<'a> { + pub fn draw_text(&self, text: &str, pos: Vec2) -> TextInfo { + let text_size = self.measure_text(text); + let text_params = TextParams { + font: self.font, + font_size: self.font_size, + font_scale: self.font_scale, + font_scale_aspect: self.font_scale_aspect, + rotation: self.rotation, + color: self.color, + }; + + let text_pos = pos + self.justification.text_offset(text_size); + + draw_text_ex(text, text_pos.x, text_pos.y, text_params); + + TextInfo { + text_dimensions: text_size, + pos, + } + } + + pub fn measure_text(&self, text: &str) -> TextDimensions { + measure_text(text, self.font, self.font_size, self.font_scale) + } +} + +impl<'a> From> for TextConfigBuilder<'a> { + fn from(val: TextConfig<'a>) -> Self { + TextConfigBuilder::new(val) + } +}