From dbcf0e66e3c0fdd7821ac70c3430696bed38f435 Mon Sep 17 00:00:00 2001 From: Tyrel Souza <923113+tyrelsouza@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:12:56 -0400 Subject: [PATCH] chap5 --- .gitignore | 1 + Cargo.lock | 1750 +++++++++++++++++++++++++++++++++++++ Cargo.toml | 9 + resources/dungeonfont.png | Bin 0 -> 77128 bytes src/camera.rs | 24 + src/main.rs | 60 ++ src/map.rs | 82 ++ src/map_builder.rs | 90 ++ src/player.rs | 36 + 9 files changed, 2052 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 resources/dungeonfont.png create mode 100644 src/camera.rs create mode 100644 src/main.rs create mode 100644 src/map.rs create mode 100644 src/map_builder.rs create mode 100644 src/player.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c365c14 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1750 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "andrew" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf" +dependencies = [ + "bitflags", + "rusttype", + "walkdir", + "xdg", + "xml-rs", +] + +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" + +[[package]] +name = "anyhow" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bracket-algorithm-traits" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23ee41725dd41febe5f614851db8e5d44c07254dd91838b5ddf817060e2e73" +dependencies = [ + "bracket-geometry", + "smallvec", +] + +[[package]] +name = "bracket-color" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1d1b160817fb74eebedccd678055cd688d1a73dc1a14519fa30ff4c9a5bdee" +dependencies = [ + "byteorder", + "lazy_static", + "parking_lot", +] + +[[package]] +name = "bracket-geometry" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db22c32c68bd9330ab982f8ff7ffe7b10541d16ea7d7d51aac074499850402b" +dependencies = [ + "ultraviolet", +] + +[[package]] +name = "bracket-lib" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0fb005e908ce2e553277e554c32ab06d8b12bea38660da98f2e77e662dea617" +dependencies = [ + "bracket-algorithm-traits", + "bracket-color", + "bracket-geometry", + "bracket-noise", + "bracket-pathfinding", + "bracket-random", + "bracket-terminal", +] + +[[package]] +name = "bracket-noise" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60de9564f6a658c770666a6cf6ccf837f0669f5906f67de7f089bebe09b46723" +dependencies = [ + "bracket-random", +] + +[[package]] +name = "bracket-pathfinding" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b713222141585b5e5cc6f0be1a0a473e1e339aa1300af91929ce6b1b2ed529c" +dependencies = [ + "bracket-algorithm-traits", + "bracket-geometry", + "smallvec", +] + +[[package]] +name = "bracket-random" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b5b977a40a6be337b2baff6911051966c61bd3987836c13e96f518ec4ba312" +dependencies = [ + "lazy_static", + "rand", + "rand_xorshift", + "regex", +] + +[[package]] +name = "bracket-terminal" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460594df0b3364cae6ce5a5de4d787b293d20df0deffed4a942c10b1e3d50b1d" +dependencies = [ + "anyhow", + "bracket-color", + "bracket-geometry", + "byteorder", + "console_error_panic_hook", + "flate2", + "glow", + "glutin", + "image", + "lazy_static", + "object-pool", + "parking_lot", + "rand", + "ultraviolet", + "wasm-bindgen", + "wasm-timer", + "web-sys", + "winit", +] + +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "bytemuck" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "calloop" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c" +dependencies = [ + "log", + "nix 0.18.0", +] + +[[package]] +name = "cc" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "cocoa" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" +dependencies = [ + "cfg-if 0.1.10", + "wasm-bindgen", +] + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if 0.1.10", + "lazy_static", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76" +dependencies = [ + "libloading 0.6.7", +] + +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading 0.7.0", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dungeoncrawl" +version = "0.1.0" +dependencies = [ + "bracket-lib", +] + +[[package]] +name = "flate2" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide 0.4.4", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945be163fdb893227410c8b44c2412dade922585b262d1daa6a7e96135217d4c" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae1cbb9176b9151c4ce03f012e3cd1c6c18c4be79edeaeb3d99f5d8085c5fa3" +dependencies = [ + "android_glue", + "cgl", + "cocoa 0.23.0", + "core-foundation 0.9.1", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading 0.6.7", + "log", + "objc", + "osmesa-sys", + "parking_lot", + "wayland-client", + "wayland-egl", + "winapi 0.3.9", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" +dependencies = [ + "gl_generator", + "winapi 0.3.9", +] + +[[package]] +name = "glutin_emscripten_sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +dependencies = [ + "gl_generator", + "objc", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "jpeg-decoder", + "num-iter", + "num-rational", + "num-traits", + "png", +] + +[[package]] +name = "instant" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" + +[[package]] +name = "js-sys" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4bf49d50e2961077d9c99f4b7997d770a1114f087c3c2e0069b36c13fc2979d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + +[[package]] +name = "lock_api" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[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 = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a" +dependencies = [ + "libc", +] + +[[package]] +name = "minimal-lexical" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6595bb28ed34f43c3fe088e48f6cfb2e033cab45f25a5384d5fdf564fbc8c4b2" + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log", + "mio", + "slab", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "ndk" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73" +dependencies = [ + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-glue" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "nix" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +dependencies = [ + "bitflags", + "cc", + "cfg-if 0.1.10", + "libc", +] + +[[package]] +name = "nix" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "nom" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" +dependencies = [ + "memchr", + "minimal-lexical", + "version_check", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object-pool" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee9a3e7196d09ec86002b939f1576e8e446d58def8fd48fe578e2c72d5328d68" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" +dependencies = [ + "shared_library", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f923fb806c46266c02ab4a5b239735c144bdeda724a50ed058e5226f594cde3" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi 0.3.9", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags", + "crc32fast", + "deflate", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "raw-window-handle" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" +dependencies = [ + "libc", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "rusttype" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "safe_arch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "send_wrapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" + +[[package]] +name = "serde" +version = "1.0.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" + +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" + +[[package]] +name = "slotmap" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a952280edbecfb1d4bd3cf2dbc309dc6ab523e53487c438ae21a6df09fe84bc4" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "smithay-client-toolkit" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80" +dependencies = [ + "andrew", + "bitflags", + "calloop", + "dlib 0.4.2", + "lazy_static", + "log", + "memmap2", + "nix 0.18.0", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "syn" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "thiserror" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +dependencies = [ + "crossbeam-utils", + "futures", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +dependencies = [ + "crossbeam-utils", + "futures", + "slab", + "tokio-executor", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "ttf-parser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc" + +[[package]] +name = "ultraviolet" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b9e3507eba17043af05c8a72fce3ec2c24b58945f45732e71dbc6646d904a7" +dependencies = [ + "wide", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce9b1b516211d33767048e5d47fa2a381ed8b76fc48d2ce4aa39877f9f183e0" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe8dc78e2326ba5f845f4b5bf548401604fa20b1dd1d365fb73b6c1d6364041" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44468aa53335841d9d6b6c023eaab07c0cd4bddbcfdee3e2bb1e8d2cb8069fef" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdb075a845574a1fa5f09fd77e43f7747599301ea3417a9fbffdeedfc1f4a29" + +[[package]] +name = "wasm-timer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa3e01d234bb71760e685cfafa5e2c96f8ad877c161a721646356651069e26ac" +dependencies = [ + "futures", + "js-sys", + "send_wrapper", + "tokio-timer", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wayland-client" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.20.0", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda" +dependencies = [ + "nix 0.20.0", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a" +dependencies = [ + "nix 0.20.0", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-egl" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ba1ab1e18756b23982d36f08856d521d7df45015f404a2d7c4f0b2d2f66956" +dependencies = [ + "wayland-client", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8" +dependencies = [ + "dlib 0.5.0", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224b2f6b67919060055ef1a67807367c2066ed520c3862cc013d26cf893a783c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wide" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bbe7c604a27ca0b05c5503221e76da628225b568e6f1280b42dbad3b72d89b" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[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-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + +[[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 = "winit" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4eda6fce0eb84bd0a33e3c8794eb902e1033d0a1d5a31bc4f19b1b4bbff597" +dependencies = [ + "bitflags", + "cocoa 0.24.0", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "mio-extras", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "web-sys", + "winapi 0.3.9", + "x11-dl", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "x11-dl" +version = "2.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8" +dependencies = [ + "lazy_static", + "libc", + "maybe-uninit", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + +[[package]] +name = "xdg" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d8b622f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "dungeoncrawl" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bracket-lib = "~0.8.1" \ No newline at end of file diff --git a/resources/dungeonfont.png b/resources/dungeonfont.png new file mode 100644 index 0000000000000000000000000000000000000000..705c6a34ef674b6240b0c4f711063e779fdd8615 GIT binary patch literal 77128 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 literal 0 HcmV?d00001 diff --git a/src/camera.rs b/src/camera.rs new file mode 100644 index 0000000..1e7995b --- /dev/null +++ b/src/camera.rs @@ -0,0 +1,24 @@ +use crate::prelude::*; +pub struct Camera { + pub left_x: i32, + pub right_x: i32, + pub top_y: i32, + pub bottom_y: i32, +} + +impl Camera { + pub fn new(player_position: Point) -> Self { + Self { + left_x: player_position.x - DISPLAY_WIDTH / 2, + right_x: player_position.x + DISPLAY_WIDTH / 2, + top_y: player_position.y - DISPLAY_HEIGHT / 2, + bottom_y: player_position.y + DISPLAY_HEIGHT / 2, + } + } + pub fn on_player_move(&mut self, player_position: Point) { + self.left_x = player_position.x - DISPLAY_WIDTH / 2; + self.right_x = player_position.x + DISPLAY_WIDTH / 2; + self.top_y = player_position.y - DISPLAY_HEIGHT / 2; + self.bottom_y = player_position.y + DISPLAY_HEIGHT / 2; + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8228930 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,60 @@ +mod camera; +mod map; +mod map_builder; +mod player; + +mod prelude { + pub use bracket_lib::prelude::*; + pub const SCREEN_WIDTH: i32 = 80; + pub const SCREEN_HEIGHT: i32 = 50; + pub const DISPLAY_WIDTH: i32 = SCREEN_WIDTH / 2; + pub const DISPLAY_HEIGHT: i32 = SCREEN_HEIGHT / 2; + pub use crate::camera::*; + pub use crate::map::*; + pub use crate::map_builder::*; + pub use crate::player::*; +} +use prelude::*; + +struct State { + map: Map, + player: Player, + camera: Camera, +} +impl State { + fn new() -> Self { + let mut rng = RandomNumberGenerator::new(); + let map_builder = MapBuilder::new(&mut rng); + + State { + map: map_builder.map, + player: Player::new(Point::new(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)), + camera: Camera::new(map_builder.player_start), + } + } +} +impl GameState for State { + fn tick(&mut self, ctx: &mut BTerm) { + ctx.set_active_console(0); + ctx.cls(); + ctx.set_active_console(1); + ctx.cls(); + self.player.update(ctx, &self.map, &mut self.camera); + self.map.render(ctx, &mut self.camera); + self.player.render(ctx, &mut self.camera); + } +} + +fn main() -> BError { + let context = BTermBuilder::new() + .with_title("Dungeon Crawl") + .with_fps_cap(30.0) + .with_dimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT) + .with_tile_dimensions(32, 32) + .with_resource_path("resources/") + .with_font("dungeonfont.png", 32, 32) + .with_simple_console(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png") + .with_simple_console_no_bg(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png") + .build()?; + main_loop(context, State::new()) +} diff --git a/src/map.rs b/src/map.rs new file mode 100644 index 0000000..3f9f0fc --- /dev/null +++ b/src/map.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; +const NUM_TILES: usize = (SCREEN_WIDTH * SCREEN_HEIGHT) as usize; + +#[derive(Copy, Clone, PartialEq)] +pub enum TileType { + Wall, + Floor, +} + +pub struct Map { + pub tiles: Vec, +} + +pub fn map_idx(x: i32, y: i32) -> usize { + ((y * SCREEN_WIDTH) + x) as usize +} + +impl Map { + pub fn new() -> Self { + Self { + tiles: vec![TileType::Floor; NUM_TILES], + } + } + // pub fn render(&self, ctx: &mut BTerm) { + // for y in 0..SCREEN_HEIGHT { + // for x in 0..SCREEN_WIDTH { + // let idx = map_idx(x, y); + // match self.tiles[idx] { + // TileType::Floor => { + // ctx.set(x, y, YELLOW, BLACK, to_cp437('.')); + // } + // TileType::Wall => { + // ctx.set(x, y, GREEN, BLACK, to_cp437('#')); + // } + // } + // } + // } + // } + pub fn render(&self, ctx: &mut BTerm, camera: &Camera) { + ctx.set_active_console(0); + for y in camera.top_y..camera.bottom_y { + for x in camera.left_x..camera.right_x { + if self.in_bounds(Point::new(x, y)) { + let idx = map_idx(x, y); + match self.tiles[idx] { + TileType::Floor => { + ctx.set( + x - camera.left_x, + y - camera.top_y, + WHITE, + BLACK, + to_cp437('.'), + ); + } + TileType::Wall => { + ctx.set( + x - camera.left_x, + y - camera.top_y, + WHITE, + BLACK, + to_cp437('#'), + ); + } + } + } + } + } + } + pub fn in_bounds(&self, point: Point) -> bool { + point.x >= 0 && point.x < SCREEN_WIDTH && point.y >= 0 && point.y < SCREEN_HEIGHT + } + pub fn can_enter_tile(&self, point: Point) -> bool { + self.in_bounds(point) && self.tiles[map_idx(point.x, point.y)] == TileType::Floor + } + pub fn try_idx(&self, point: Point) -> Option { + if !self.in_bounds(point) { + None + } else { + Some(map_idx(point.x, point.y)) + } + } +} diff --git a/src/map_builder.rs b/src/map_builder.rs new file mode 100644 index 0000000..14e31f8 --- /dev/null +++ b/src/map_builder.rs @@ -0,0 +1,90 @@ +use crate::prelude::*; +const NUM_ROOMS: usize = 20; + +pub struct MapBuilder { + pub map: Map, + pub rooms: Vec, + pub player_start: Point, +} + +impl MapBuilder { + pub fn new(rng: &mut RandomNumberGenerator) -> Self { + let mut mb = MapBuilder { + map: Map::new(), + rooms: Vec::new(), + player_start: Point::zero(), + }; + mb.fill(TileType::Wall); + mb.build_random_rooms(rng); + mb.build_corridors(rng); + mb.player_start = mb.rooms[0].center(); + mb + } + + fn fill(&mut self, tile: TileType) { + self.map.tiles.iter_mut().for_each(|t| *t = tile); + } + + fn build_random_rooms(&mut self, rng: &mut RandomNumberGenerator) { + while self.rooms.len() < NUM_ROOMS { + let room = Rect::with_size( + rng.range(1, SCREEN_WIDTH - 10), + rng.range(1, SCREEN_HEIGHT - 10), + rng.range(2, 10), + rng.range(2, 10), + ); + let mut overlap = false; + for r in self.rooms.iter() { + if r.intersect(&room) { + overlap = true; + } + } + if !overlap { + room.for_each(|p| { + if p.x > 0 && p.x < SCREEN_WIDTH && p.y > 0 && p.y < SCREEN_HEIGHT { + let idx = map_idx(p.x, p.y); + self.map.tiles[idx] = TileType::Floor; + } + }); + + self.rooms.push(room) + } + } + } + + fn apply_horizontal_tunnel(&mut self, x1: i32, x2: i32, y: i32) { + use std::cmp::{max, min}; + for x in min(x1, x2)..=max(x1, x2) { + if let Some(idx) = self.map.try_idx(Point::new(x, y)) { + self.map.tiles[idx as usize] = TileType::Floor; + } + } + } + + fn apply_vertical_tunnel(&mut self, y1: i32, y2: i32, x: i32) { + use std::cmp::{max, min}; + for y in min(y1, y2)..=max(y1, y2) { + if let Some(idx) = self.map.try_idx(Point::new(x, y)) { + self.map.tiles[idx as usize] = TileType::Floor; + } + } + } + + fn build_corridors(&mut self, rng: &mut RandomNumberGenerator) { + let mut rooms = self.rooms.clone(); + rooms.sort_by(|a, b| a.center().x.cmp(&b.center().x)); + + for (i, room) in rooms.iter().enumerate().skip(1) { + let prev = rooms[i - 1].center(); + let new = room.center(); + + if rng.range(0, 2) == 1 { + self.apply_horizontal_tunnel(prev.x, new.x, prev.y); + self.apply_vertical_tunnel(prev.y, new.y, prev.x); + } else { + self.apply_vertical_tunnel(prev.y, new.y, prev.x); + self.apply_horizontal_tunnel(prev.x, new.x, prev.y); + } + } + } +} diff --git a/src/player.rs b/src/player.rs new file mode 100644 index 0000000..8f837ef --- /dev/null +++ b/src/player.rs @@ -0,0 +1,36 @@ +use crate::prelude::*; + +pub struct Player { + pub position: Point, +} +impl Player { + pub fn new(position: Point) -> Self { + Self { position } + } + pub fn render(&self, ctx: &mut BTerm, camera: &Camera) { + ctx.set_active_console(1); + ctx.set( + self.position.x - camera.left_x, + self.position.y - camera.top_y, + WHITE, + BLACK, + to_cp437('@'), + ); + } + pub fn update(&mut self, ctx: &mut BTerm, map: &Map, camera: &mut Camera) { + if let Some(key) = ctx.key { + let delta = match key { + VirtualKeyCode::Left => Point::new(-1, 0), + VirtualKeyCode::Right => Point::new(1, 0), + VirtualKeyCode::Up => Point::new(0, -1), + VirtualKeyCode::Down => Point::new(0, 1), + _ => Point::zero(), + }; + let new_position = self.position + delta; + if map.can_enter_tile(new_position) { + self.position = new_position; + camera.on_player_move(new_position); + } + } + } +}