diff --git a/.github/workflows/deploy wasm to gh-pages.yml b/.github/workflows/deploy wasm to gh-pages.yml new file mode 100644 index 0000000..1a5bb6f --- /dev/null +++ b/.github/workflows/deploy wasm to gh-pages.yml @@ -0,0 +1,34 @@ +on: push +name: Build and deploy web page with WASM version +jobs: + build: + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + steps: + - name: Checkout project + uses: actions/checkout@v3 + - name: Setup - Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + target: wasm32-unknown-unknown + override: true + - name: Setup - wasm-bindgen + uses: jetli/wasm-bindgen-action@v0.2.0 + - name: Build, bind WASM + run: | + cargo build --release --target wasm32-unknown-unknown + wasm-bindgen target/wasm32-unknown-unknown/release/rust-rl.wasm --out-dir wasm --no-modules --no-typescript + - name: Publish web\ to gh-pages + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + cd wasm/ + git init --initial-branch=master + git config user.name "GitHub Actions" + git config user.email "github-actions-bot@users.noreply.github.com" + git add . + + git commit -m "Deploy ${GITHUB_REPOSITORY} to ${GITHUB_REPOSITORY}:gh-pages" + git push --force "https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" master:gh-pages + echo "Deploy complete" diff --git a/.gitignore b/.gitignore index bcc7d85..6d00d4c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ # Build files, documentation, benchmarks target +wasm/index.css +wasm/index.html docs/gifs/* # VSCode/IDE config files +Cargo.lock .vscode/* .rustfmt.toml .prettierignore diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index a424ef8..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,2710 +0,0 @@ -# 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.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" - -[[package]] -name = "aho-corasick" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" -dependencies = [ - "memchr", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "anstyle" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "atom" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ff149ed9780025acfdb36862d35b28856bb693ceb451259a7164442f22fdc3" - -[[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 = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13fb98ac33e6cd03fc035d8503f8a80b38c523737c9f84b400a4b9e065cfd3" -dependencies = [ - "bracket-geometry 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec", -] - -[[package]] -name = "bracket-algorithm-traits" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "bracket-geometry 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "smallvec", -] - -[[package]] -name = "bracket-color" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7333827cf727ceb302cc4f638cc8befc87f5f1423873255d94cc0a24009e940a" -dependencies = [ - "lazy_static", - "parking_lot 0.12.1", - "serde", -] - -[[package]] -name = "bracket-color" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "lazy_static", - "parking_lot 0.12.1", - "serde", -] - -[[package]] -name = "bracket-embedding" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cb6747f25903066109a619e3d580ef5ff7b3ffc281fa51ece473e1396e2298" -dependencies = [ - "lazy_static", - "parking_lot 0.12.1", -] - -[[package]] -name = "bracket-embedding" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "lazy_static", - "parking_lot 0.12.1", -] - -[[package]] -name = "bracket-geometry" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f31b525fcd65027885f3a1e3a250a5dd397d70de4a6a5a125f03e0bef951499" -dependencies = [ - "serde", - "ultraviolet", -] - -[[package]] -name = "bracket-geometry" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "serde", - "ultraviolet", -] - -[[package]] -name = "bracket-lib" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bbe13e39628e7f73673737c825001494dee7329cee8ee79dfeaa7cfd136dbf" -dependencies = [ - "bracket-algorithm-traits 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-color 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-geometry 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-noise 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-pathfinding 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-random 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-terminal 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bracket-lib" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "bracket-algorithm-traits 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-color 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-geometry 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-noise 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-pathfinding 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-random 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-terminal 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", -] - -[[package]] -name = "bracket-noise" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7443d0990c69db7a83f376f0101d684c20a911698e5f932bffbda2c8b08dd" -dependencies = [ - "bracket-random 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bracket-noise" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "bracket-random 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", -] - -[[package]] -name = "bracket-pathfinding" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ae7f2ebf242316ba10e84ca3b31af064b8c0c77402b2171a3104a2a77718fc" -dependencies = [ - "bracket-algorithm-traits 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-geometry 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational", - "smallvec", -] - -[[package]] -name = "bracket-pathfinding" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "bracket-algorithm-traits 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-geometry 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "num-rational", - "smallvec", -] - -[[package]] -name = "bracket-random" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437be61484077b1ddb57002ce3c96b7d03cbf500b5d15157ee7e67e22332c39b" -dependencies = [ - "getrandom", - "js-sys", - "lazy_static", - "rand", - "rand_xorshift", - "regex", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "bracket-random" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "getrandom", - "js-sys", - "lazy_static", - "rand", - "rand_xorshift", - "regex", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "bracket-rex" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4735d15070b98d0f07360d62914d1524679325019cae46c7af73637a6ef196a" -dependencies = [ - "bracket-color 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-embedding 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder", - "flate2", -] - -[[package]] -name = "bracket-rex" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "bracket-color 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-embedding 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "byteorder", - "flate2", -] - -[[package]] -name = "bracket-terminal" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2493063cb676e2e9e3a3a630eee032a297e43c8a1cee08c94feaad3344ed0b46" -dependencies = [ - "anyhow", - "bracket-color 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-embedding 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-geometry 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "bracket-rex 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", - "console_error_panic_hook", - "glow", - "glutin", - "image", - "lazy_static", - "object-pool", - "parking_lot 0.12.1", - "rand", - "ultraviolet", - "wasm-bindgen", - "wasm-timer", - "web-sys", - "winit 0.26.1", - "winit 0.27.5", -] - -[[package]] -name = "bracket-terminal" -version = "0.8.7" -source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6" -dependencies = [ - "anyhow", - "bracket-color 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-embedding 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-geometry 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-rex 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "console_error_panic_hook", - "glow", - "glutin", - "image", - "lazy_static", - "object-pool", - "parking_lot 0.12.1", - "rand", - "ultraviolet", - "wasm-bindgen", - "wasm-timer", - "web-sys", - "winit 0.26.1", - "winit 0.27.5", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[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 = "calloop" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" -dependencies = [ - "log", - "nix 0.22.3", -] - -[[package]] -name = "calloop" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" -dependencies = [ - "bitflags 1.3.2", - "log", - "nix 0.25.1", - "slotmap", - "thiserror", - "vec_map", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[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 = "ciborium" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" - -[[package]] -name = "ciborium-ll" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "clap" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" -dependencies = [ - "anstyle", - "clap_lex", -] - -[[package]] -name = "clap_lex" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "cocoa" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.3", - "core-graphics-types", - "foreign-types 0.3.2", - "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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys 0.8.4", - "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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.3", - "core-graphics-types", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.3", - "libc", -] - -[[package]] -name = "core-text" -version = "19.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" -dependencies = [ - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "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.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "is-terminal", - "itertools", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.16", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils 0.8.16", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils 0.8.16", - "memoffset 0.9.0", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[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 = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossfont" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fd3add36ea31aba1520aa5288714dd63be506106753226d0eb387a93bc9c45" -dependencies = [ - "cocoa", - "core-foundation 0.9.3", - "core-foundation-sys 0.8.4", - "core-graphics 0.22.3", - "core-text", - "dwrote", - "foreign-types 0.5.0", - "freetype-rs", - "libc", - "log", - "objc", - "once_cell", - "pkg-config", - "servo-fontconfig", - "winapi", -] - -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading 0.8.0", -] - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "dwrote" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" -dependencies = [ - "lazy_static", - "libc", - "serde", - "serde_derive", - "winapi", - "wio", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "expat-sys" -version = "2.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa" -dependencies = [ - "cmake", - "pkg-config", -] - -[[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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[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 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.30", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "freetype-rs" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74eadec9d0a5c28c54bb9882e54787275152a4e36ce206b45d7451384e5bf5fb" -dependencies = [ - "bitflags 1.3.2", - "freetype-sys", - "libc", -] - -[[package]] -name = "freetype-sys" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" -dependencies = [ - "cmake", - "libc", - "pkg-config", -] - -[[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.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -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.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444c9ad294fdcaf20ccf6726b78f380b5450275540c9b68ab62f49726ad1c713" -dependencies = [ - "cgl", - "cocoa", - "core-foundation 0.9.3", - "glutin_egl_sys", - "glutin_gles2_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "libloading 0.7.4", - "log", - "objc", - "once_cell", - "osmesa-sys", - "parking_lot 0.12.1", - "raw-window-handle 0.5.2", - "wayland-client", - "wayland-egl", - "winapi", - "winit 0.27.5", -] - -[[package]] -name = "glutin_egl_sys" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68900f84b471f31ea1d1355567eb865a2cf446294f06cef8d653ed7bcf5f013d" -dependencies = [ - "gl_generator", - "winapi", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93d0575865098580c5b3a423188cd959419912ea60b1e48e8b3b526f6d02468" -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 = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hashbrown" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96282e96bfcd3da0d3aa9938bedf1e50df3269b6db08b4876d2da0bb1a0841cf" -dependencies = [ - "ahash", - "autocfg", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hibitset" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a1bb8316a44459a7d14253c4d28dd7395cbd23cc04a68c46e851b8e46d64b1" -dependencies = [ - "atom", - "rayon", -] - -[[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.24.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "jpeg-decoder", - "num-rational", - "num-traits", - "png", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys 0.48.0", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[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.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[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 = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" -dependencies = [ - "cfg-if 1.0.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[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.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memmap2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" -dependencies = [ - "libc", -] - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[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 = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mopa" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915" - -[[package]] -name = "ndk" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys 0.2.2", - "num_enum", - "thiserror", -] - -[[package]] -name = "ndk" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys 0.4.1+23.1.7779620", - "num_enum", - "raw-window-handle 0.5.2", - "thiserror", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-glue" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk 0.5.0", - "ndk-context", - "ndk-macro", - "ndk-sys 0.2.2", -] - -[[package]] -name = "ndk-glue" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0434fabdd2c15e0aab768ca31d5b7b333717f03cf02037d5a0a3ff3c278ed67f" -dependencies = [ - "libc", - "log", - "ndk 0.7.0", - "ndk-context", - "ndk-macro", - "ndk-sys 0.4.1+23.1.7779620", - "once_cell", - "parking_lot 0.12.1", -] - -[[package]] -name = "ndk-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" -dependencies = [ - "darling", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ndk-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" - -[[package]] -name = "ndk-sys" -version = "0.4.1+23.1.7779620" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "nix" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[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.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[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 0.11.2", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - -[[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 = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.3.5", - "smallvec", - "windows-targets", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "plotters" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" - -[[package]] -name = "plotters-svg" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "png" -version = "0.17.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", - "serde", -] - -[[package]] -name = "raw-window-handle" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" -dependencies = [ - "cty", -] - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils 0.8.16", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "rltk" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30587bc9361fc5600650d17ad6b9a91bb6a290f9d06a434dc48198d22ead7543" -dependencies = [ - "bracket-lib 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rust-rl" -version = "0.1.1" -dependencies = [ - "bracket-lib 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "bracket-terminal 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", - "criterion", - "lazy_static", - "regex", - "rltk", - "serde", - "serde_json", - "specs", - "specs-derive", - "toml", -] - -[[package]] -name = "rustix" -version = "0.38.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "safe_arch" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sctk-adwaita" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61270629cc6b4d77ec1907db1033d5c2e1a404c412743621981a871dc9c12339" -dependencies = [ - "crossfont", - "log", - "smithay-client-toolkit 0.16.0", - "tiny-skia", -] - -[[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.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.30", -] - -[[package]] -name = "serde_json" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "servo-fontconfig" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e3e22fe5fd73d04ebf0daa049d3efe3eae55369ce38ab16d07ddd9ac5c217c" -dependencies = [ - "libc", - "servo-fontconfig-sys", -] - -[[package]] -name = "servo-fontconfig-sys" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36b879db9892dfa40f95da1c38a835d41634b825fbd8c4c418093d53c24b388" -dependencies = [ - "expat-sys", - "freetype-sys", - "pkg-config", -] - -[[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 = "shred" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f08237e667ac94ad20f8878b5943d91a93ccb231428446c57c21c57779016d" -dependencies = [ - "arrayvec", - "hashbrown 0.7.2", - "mopa", - "rayon", - "smallvec", - "tynm", -] - -[[package]] -name = "shrev" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ea33232fdcf1bf691ca33450e5a94dde13e1a8cbb8caabc5e4f9d761e10b1a" - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "smithay-client-toolkit" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" -dependencies = [ - "bitflags 1.3.2", - "calloop 0.9.3", - "dlib", - "lazy_static", - "log", - "memmap2 0.3.1", - "nix 0.22.3", - "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" -dependencies = [ - "bitflags 1.3.2", - "calloop 0.10.6", - "dlib", - "lazy_static", - "log", - "memmap2 0.5.10", - "nix 0.24.3", - "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", -] - -[[package]] -name = "specs" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff28a29366aff703d5da8a7e2c8875dc8453ac1118f842cbc0fa70c7db51240" -dependencies = [ - "crossbeam-queue", - "hashbrown 0.7.2", - "hibitset", - "log", - "rayon", - "serde", - "shred", - "shrev", - "tuple_utils", -] - -[[package]] -name = "specs-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ddc1f908d32ec46858c2d3b3daa00cc35bf4b6841ce4355c7bb3eedf2283a68" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.30", -] - -[[package]] -name = "tiny-skia" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642680569bb895b16e4b9d181c60be1ed136fa0c9c7f11d004daf053ba89bf82" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if 1.0.0", - "png", - "safe_arch 0.5.2", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c114d32f0c2ee43d585367cb013dfaba967ab9f62b90d9af0d696e955e70fa6c" -dependencies = [ - "arrayref", - "bytemuck", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures", - "slab", - "tokio-executor", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" - -[[package]] -name = "toml_edit" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tuple_utils" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44834418e2c5b16f47bedf35c28e148db099187dd5feee6367fb2525863af4f1" - -[[package]] -name = "tynm" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1b3ffc85961d3c7d038e30f5187622b33d971120c047ec8525b32602083645" -dependencies = [ - "nom", -] - -[[package]] -name = "ultraviolet" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0b28b9a6ce66d47e3c5666aa738c5ec5223fcdd4c263f3edc98ab6fef618b3" -dependencies = [ - "wide", -] - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.30", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.30", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[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.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags 1.3.2", - "downcast-rs", - "libc", - "nix 0.24.3", - "scoped-tls", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" -dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-cursor" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" -dependencies = [ - "nix 0.24.3", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-egl" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402de949f81a012926d821a2d659f930694257e76dd92b6e0042ceb27be4107d" -dependencies = [ - "wayland-client", - "wayland-sys", -] - -[[package]] -name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags 1.3.2", - "wayland-client", - "wayland-commons", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", -] - -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "dlib", - "lazy_static", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wide" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa469ffa65ef7e0ba0f164183697b89b854253fd31aeb92358b7b6155177d62f" -dependencies = [ - "bytemuck", - "safe_arch 0.7.1", -] - -[[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-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[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 = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "winit" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" -dependencies = [ - "bitflags 1.3.2", - "cocoa", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "core-video-sys", - "dispatch", - "instant", - "lazy_static", - "libc", - "log", - "mio", - "ndk 0.5.0", - "ndk-glue 0.5.2", - "ndk-sys 0.2.2", - "objc", - "parking_lot 0.11.2", - "percent-encoding", - "raw-window-handle 0.4.3", - "smithay-client-toolkit 0.15.4", - "wasm-bindgen", - "wayland-client", - "wayland-protocols", - "web-sys", - "winapi", - "x11-dl", -] - -[[package]] -name = "winit" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb796d6fbd86b2fd896c9471e6f04d39d750076ebe5680a3958f00f5ab97657c" -dependencies = [ - "bitflags 1.3.2", - "cocoa", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "dispatch", - "instant", - "libc", - "log", - "mio", - "ndk 0.7.0", - "ndk-glue 0.7.0", - "objc", - "once_cell", - "parking_lot 0.12.1", - "percent-encoding", - "raw-window-handle 0.4.3", - "raw-window-handle 0.5.2", - "sctk-adwaita", - "smithay-client-toolkit 0.16.0", - "wasm-bindgen", - "wayland-client", - "wayland-protocols", - "web-sys", - "windows-sys 0.36.1", - "x11-dl", -] - -[[package]] -name = "winnow" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" -dependencies = [ - "memchr", -] - -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "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 = "xml-rs" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47430998a7b5d499ccee752b41567bc3afc57e1327dc855b1a2aa44ce29b5fa1" diff --git a/Cargo.toml b/Cargo.toml index 1b2c377..544c4bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rltk = { version = "^0.8.7", features = ["serde"] } bracket-lib = { git = "https://github.com/amethyst/bracket-lib.git", rev = "851f6f08675444fb6fa088b9e67bee9fd75554c6", features = ["serde"] } bracket-terminal = { git = "https://github.com/amethyst/bracket-lib.git", rev = "851f6f08675444fb6fa088b9e67bee9fd75554c6" } regex = "1.3.6" diff --git a/README.md b/README.md index 116179a..9127091 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## a roguelike in rust, playable @ [llywelwyn.github.io](https://llywelwyn.github.io/) +## a roguelike in rust, playable @ [llyw.co.uk/rl/](https://llyw.co.uk/rl/) #### using _rltk/bracket-lib_, and _specs_ @@ -10,6 +10,8 @@ check out the page in the header for the wasm version, pick [a release of your c this year for roguelikedev does the complete tutorial, i followed along with thebracket's [_roguelike tutorial - in rust_](https://bfnightly.bracketproductions.com). the notes i made during the sprint are being kept below for posterity - further changes since then are noted in [changelog.txt](https://github.com/Llywelwyn/rust-rl/blob/9150ed39e45bee536060cdc769d274e639021012/changelog.txt), and in the release notes. +i'm also working on translating over my progress into blog entries on my site @ [llyw.co.uk](https://llyw.co.uk/), with a larger focus on some of the more interesting implementation details. + ---
diff --git a/benches/systems_benchmark.rs b/benches/systems_benchmark.rs index b2acdbc..c750fed 100644 --- a/benches/systems_benchmark.rs +++ b/benches/systems_benchmark.rs @@ -1,5 +1,5 @@ use criterion::{ black_box, criterion_group, criterion_main, Criterion }; -use rltk::RGB; +use bracket_lib::prelude::*; /// Benchmarks methods from rltk used to desaturate non-visible tiles. // Greyscale is significantly faster, but generally looks worse - the diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..4976351 --- /dev/null +++ b/changelog.md @@ -0,0 +1,20 @@ +## v0.1.4 +### added +- **overmap**: bare, but exists. player now starts on the overworld, and can move to local maps (like the old starting town) via >. can leave local maps back to the overmap by walking out of the map boundaries. +- **intrinsics**: speed, regeneration +- **damage types**: immunities, weaknesses, and resistances +- **full keyboard support**: examining and targeting can now be done via keyboard only +- **a config file** read at runtime, unfortunately not compatible with WASM builds yet +- **morgue files**: y/n prompt to write a morgue file on death to /morgue/foo.txt, or to the console for WASM builds +- **dungeon features**: just the basics so far. a grassy, forested treant room, some barracks, etc. +- **named maps**: "Town", "Dungeon" +- **map messages/hints**: "You hear <...>." +### changed +- **colour offsets** are now per-tile (and per-theme) instead of +-% globally. i.e. varying fg/bg offset on a per-tiletype basis +- **chatlog colours** are now consistent +### fixed +- negative starting mana +- status effects only ticking if mob turn aligned with turnclock turn +- map params not being saved on map transition +- mob turns not awaiting the particle queue (mobs moving around mid-animation) +- mobs not re-pathing if their path was blocked, causing traffic jams diff --git a/changelog.txt b/changelog.txt deleted file mode 100644 index 3f8a6e2..0000000 --- a/changelog.txt +++ /dev/null @@ -1,22 +0,0 @@ -2-September-2023 -- fixes: - - negative starting mana - - confusion/status effects only being run if mob turn aligned with turnclock turn - -30-August-2023 -- added dungeon features: grassy forest room, and barracks variants (bunks, squads of mobtypes) -- added support for map messages: i.e. notifications for present dungeon features logged to chat every now and again - -Pre-29-August-2023 -- added overmap: bare, but exists. player now starts on the overworld, and can move to local maps (like the old starting town) via >. can leave local maps back to the overmap by walking out of the map boundaries. -- mouse begone: support still there if wanted, but targeting/e(x)amining can now be done via keyboard only -- added config.toml: non-wasm builds read from config.toml at runtime, or generate a new copy if not present in the exe dir. includes options for logging various details to the console, and visual choices like post-processing effects, all-black bgs vs. full-coloured, etc. -- improved morgue files: y/n prompt to write a morgue file on death (or write to console in the case of wasm), containing a map of the floor the player died on, class/race/attribute/etc. details, a fully identified backpack, and a list of significant events that took place this run w/ turn number -- refactored colour offsets: now per-tile (and per-theme), instead of global. now can include varying fg/bg offset for every type of tile. -- consistent chatlog colours: renderables for mobs, beatitude for items -- dungeon features: framework -- map identifiers (instead of displaying an incorrect depth) on ui: e.g. D1, D2, Town, Woods, etc. -- fixes: - - map params are saved on map transition, instead of only at creation. now bloodstains, vision, etc. will persist when changing between floors - - mob turns await an empty particle queue - no longer will they move mid-fireball animations - - fixed traffic jams - 1. mobs will calc the best path to any tile within range of their target, instead of trying to path directly onto the target tile, and 2. if saved path is blocked to a waypoint, mobs will recalc a new path to the same point \ No newline at end of file diff --git a/docs/ascii_encyclopedia.txt b/docs/ascii_encyclopedia.txt index db60dbc..2972c1e 100644 --- a/docs/ascii_encyclopedia.txt +++ b/docs/ascii_encyclopedia.txt @@ -1,4 +1,4 @@ -a - A - +a - insects A - b - B - c - chickens C - d - canines D - diff --git a/raws/items.json b/raws/items.json index b1302a6..2c0c678 100644 --- a/raws/items.json +++ b/raws/items.json @@ -64,7 +64,7 @@ "weight": 0.5, "value": 50, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "particle_line": "*;-;#00b7ff;75.0;#f4fc83;100.0", "ranged": "12", "damage": "3d4+3" }, + "effects": { "particle_line": "*;-;#00b7ff;75.0;#f4fc83;100.0", "ranged": "12", "damage": "3d4+3;magic" }, "magic": { "class": "uncommon", "naming": "scroll" } }, { @@ -74,7 +74,7 @@ "weight": 0.5, "value": 100, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "particle": "*;#FFA500;200.0", "ranged": "10", "damage": "4d6", "aoe": "2" }, + "effects": { "particle": "*;#FFA500;200.0", "ranged": "10", "damage": "4d6;fire", "aoe": "2" }, "magic": { "class": "uncommon", "naming": "scroll" } }, { @@ -87,7 +87,7 @@ "effects": { "particle_burst": "▓;*;~;#FFA500;#000000;500.0;#ffd381;60.0", "ranged": "10", - "damage": "8d6", + "damage": "8d6;fire", "aoe": "3" }, "magic": { "class": "rare", "naming": "scroll" } @@ -353,7 +353,7 @@ "weight": 2, "value": 100, "flags": ["CHARGES"], - "effects": { "ranged": "12", "damage": "3d4+3" }, + "effects": { "ranged": "12", "damage": "3d4+3;magic" }, "magic": { "class": "uncommon", "naming": "wand" } }, { @@ -363,7 +363,7 @@ "weight": 2, "value": 300, "flags": ["CHARGES"], - "effects": { "ranged": "10", "damage": "8d6", "aoe": "3" }, + "effects": { "ranged": "10", "damage": "8d6;fire", "aoe": "3" }, "magic": { "class": "rare", "naming": "wand" } }, { diff --git a/raws/mobs.json b/raws/mobs.json index 5137ea4..ddd6556 100644 --- a/raws/mobs.json +++ b/raws/mobs.json @@ -62,7 +62,6 @@ "renderable": { "glyph": "@", "fg": "#034efc", "bg": "#000000", "order": 1 }, "flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"], "level": 2, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }], "equipped": ["equip_shortsword", "equip_body_leather"], "quips": ["You wont catch me down the mine.", "Staying out of trouble?"] @@ -73,7 +72,6 @@ "renderable": { "glyph": "r", "fg": "#aa6000", "bg": "#000000", "order": 1 }, "flags": [], "bac": 6, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }], "loot": { "table": "food", "chance": 0.1 } }, @@ -83,7 +81,6 @@ "renderable": { "glyph": "c", "fg": "#BB6000", "bg": "#000000", "order": 1 }, "flags": ["HERBIVORE"], "bac": 8, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }] }, { @@ -92,7 +89,6 @@ "renderable": { "glyph": "q", "fg": "#a57037", "bg": "#000000", "order": 1 }, "flags": ["HERBIVORE"], "bac": 8, - "vision_range": 16, "attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }] }, { @@ -101,7 +97,6 @@ "renderable": { "glyph": "q", "fg": "#e7e7e7", "bg": "#000000", "order": 1 }, "flags": ["HERBIVORE", "SMALL_GROUP"], "bac": 10, - "vision_range": 16, "attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }] }, { @@ -110,7 +105,6 @@ "renderable": { "glyph": "c", "fg": "#fae478", "bg": "#000000", "order": 1 }, "flags": ["HERBIVORE"], "bac": 10, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }] }, { @@ -121,7 +115,6 @@ "level": 3, "bac": 6, "speed": 16, - "vision_range": 16, "attacks": [ { "name": "kicks", "hit_bonus": 0, "damage": "1d6" }, { "name": "bites", "hit_bonus": 0, "damage": "1d2" } @@ -136,7 +129,6 @@ "level": 5, "bac": 5, "speed": 20, - "vision_range": 16, "attacks": [ { "name": "kicks", "hit_bonus": 0, "damage": "1d8" }, { "name": "bites", "hit_bonus": 0, "damage": "1d3" } @@ -150,7 +142,6 @@ "level": 7, "bac": 4, "speed": 24, - "vision_range": 16, "attacks": [ { "name": "kicks", "hit_bonus": 0, "damage": "1d10" }, { "name": "bites", "hit_bonus": 0, "damage": "1d4" } @@ -163,7 +154,6 @@ "flags": ["SMALL_GROUP"], "level": 1, "bac": 7, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }], "loot": { "table": "scrolls", "chance": 0.05 } }, @@ -175,7 +165,6 @@ "level": 2, "bac": 6, "speed": 18, - "vision_range": 16, "quips": ["", "", ""], "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d6" }] }, @@ -187,7 +176,6 @@ "level": 4, "bac": 5, "speed": 16, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d6" }] }, { @@ -198,7 +186,6 @@ "level": 6, "bac": 4, "speed": 15, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "2d4" }] }, { @@ -208,7 +195,6 @@ "flags": ["SMALL_GROUP", "IS_GNOME"], "level": 1, "speed": 6, - "vision_range": 16, "attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d6" }], "loot": { "table": "wands", "chance": 0.05 } }, @@ -230,7 +216,6 @@ "flags": [], "level": 1, "speed": 9, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d4" }] }, { @@ -240,7 +225,6 @@ "flags": [], "level": 1, "speed": 6, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d4" }], "loot": { "table": "food", "chance": 0.05 } }, @@ -286,7 +270,6 @@ "level": 2, "bac": 10, "speed": 6, - "vision_range": 16, "attacks": [{ "name": "hacks", "hit_bonus": 0, "damage": "1d8" }], "equipped": ["equip_feet_iron"], "loot": { "table": "equipment", "chance": 0.05 } @@ -322,17 +305,62 @@ "level": 1, "bac": 3, "speed": 12, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }], "loot": { "table": "scrolls", "chance": 0.05 } }, + { + "id": "ant_worker", + "name": "worker ant", + "renderable": { "glyph": "a", "fg": "#ca7631", "bg": "#000000", "order": 1 }, + "flags": ["SMALL_GROUP"], + "level": 2, + "bac": 3, + "speed": 18, + "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d4" }], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "ant_soldier", + "name": "soldier ant", + "renderable": { "glyph": "a", "fg": "#ca3f26", "bg": "#000000", "order": 1 }, + "flags": ["SMALL_GROUP", "POISON_RES"], + "level": 3, + "bac": 3, + "speed": 18, + "attacks": [ + { "name": "bites", "hit_bonus": 0, "damage": "2d4" }, + { "name": "stings", "hit_bonus": 0, "damage": "3d4;poison" } + ], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "caterpillar_cave", + "name": "caterpillar", + "renderable": { "glyph": "a", "fg": "#6b6b6b", "bg": "#000000", "order": 1 }, + "flags": ["SMALL_GROUP"], + "level": 1, + "bac": 3, + "speed": 9, + "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "caterpillar_giant", + "name": "giant caterpillar", + "renderable": { "glyph": "a", "fg": "#b9aeae", "bg": "#000000", "order": 1 }, + "flags": ["SMALL_GROUP"], + "level": 2, + "bac": 7, + "speed": 9, + "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d6" }], + "loot": { "table": "food", "chance": 0.10 } + }, { "id": "jackal", "name": "jackal", "renderable": { "glyph": "d", "fg": "#AA5500", "bg": "#000000", "order": 1 }, "flags": ["CARNIVORE", "SMALL_GROUP"], "bac": 7, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }] }, { @@ -341,7 +369,6 @@ "renderable": { "glyph": "d", "fg": "#FF0000", "bg": "#000000", "order": 1 }, "flags": ["CARNIVORE"], "bac": 7, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }] }, { @@ -351,7 +378,6 @@ "flags": ["CARNIVORE", "SMALL_GROUP"], "level": 1, "bac": 7, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d4" }] }, { @@ -361,7 +387,6 @@ "flags": ["CARNIVORE"], "level": 5, "bac": 4, - "vision_range": 16, "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "2d4" }] }, { @@ -371,7 +396,6 @@ "flags": [], "level": 2, "speed": 9, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }], "loot": { "table": "wands", "chance": 0.05 } }, @@ -382,7 +406,6 @@ "flags": ["SMALL_GROUP"], "level": 1, "speed": 9, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d6" }], "loot": { "table": "equipment", "chance": 0.05 } }, @@ -393,7 +416,6 @@ "flags": ["LARGE_GROUP"], "level": 2, "speed": 9, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d6" }], "loot": { "table": "equipment", "chance": 0.05 } }, @@ -404,13 +426,68 @@ "flags": ["MULTIATTACK"], "level": 5, "speed": 5, - "vision_range": 16, "attacks": [ { "name": "hits", "hit_bonus": 0, "damage": "2d4" }, { "name": "hits", "hit_bonus": 0, "damage": "2d4" } ], "loot": { "table": "equipment", "chance": 0.05 } }, + { + "id": "warg", + "name": "warg", + "renderable": { "glyph": "d", "fg": "#8b7164", "bg": "#000000", "order": 1 }, + "flags": ["SMALL_GROUP"], + "level": 7, + "bac": 4, + "speed": 12, + "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "2d6" }], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "jaguar", + "name": "jaguar", + "renderable": { "glyph": "f", "fg": "#d3b947", "bg": "#000000", "order": 1 }, + "flags": ["MULTIATTACK"], + "level": 4, + "bac": 6, + "speed": 15, + "attacks": [ + { "name": "claws", "hit_bonus": 0, "damage": "1d4" }, + { "name": "claws", "hit_bonus": 0, "damage": "1d4" }, + { "name": "bites", "hit_bonus": 0, "damage": "1d8" } + ], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "lynx", + "name": "lynx", + "renderable": { "glyph": "f", "fg": "#b5d347", "bg": "#000000", "order": 1 }, + "flags": ["MULTIATTACK"], + "level": 5, + "bac": 6, + "speed": 15, + "attacks": [ + { "name": "claws", "hit_bonus": 0, "damage": "1d4" }, + { "name": "claws", "hit_bonus": 0, "damage": "1d4" }, + { "name": "bites", "hit_bonus": 0, "damage": "1d10" } + ], + "loot": { "table": "food", "chance": 0.05 } + }, + { + "id": "panther", + "name": "panther", + "renderable": { "glyph": "f", "fg": "#58554e", "bg": "#000000", "order": 1 }, + "flags": ["MULTIATTACK"], + "level": 5, + "bac": 6, + "speed": 15, + "attacks": [ + { "name": "claws", "hit_bonus": 0, "damage": "1d6" }, + { "name": "claws", "hit_bonus": 0, "damage": "1d6" }, + { "name": "bites", "hit_bonus": 0, "damage": "1d10" } + ], + "loot": { "table": "food", "chance": 0.05 } + }, { "id": "ogre", "name": "ogre", @@ -419,7 +496,6 @@ "level": 5, "bac": 5, "speed": 10, - "vision_range": 16, "attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "2d5" }], "loot": { "table": "food", "chance": 0.05 } }, @@ -427,11 +503,10 @@ "id": "treant_small", "name": "treant sapling", "renderable": { "glyph": "♠️", "fg": "#10570d", "bg": "#000000", "order": 1 }, - "flags": ["LARGE_GROUP", "GREEN_BLOOD"], + "flags": ["LARGE_GROUP", "GREEN_BLOOD", "FIRE_WEAK"], "level": 2, "bac": 12, "speed": 3, - "vision_range": 16, "attacks": [{ "name": "lashes", "hit_bonus": 4, "damage": "1d8" }], "loot": { "table": "scrolls", "chance": 0.05 } } diff --git a/raws/spawn_tables.json b/raws/spawn_tables.json index a1e8d3b..b624a80 100644 --- a/raws/spawn_tables.json +++ b/raws/spawn_tables.json @@ -91,6 +91,8 @@ { "id": "kobold_large", "weight": 1, "difficulty": 2}, { "id": "rat_giant", "weight": 2, "difficulty": 2}, { "id": "coyote", "weight": 4, "difficulty": 2}, + { "id": "caterpillar_cave", "weight": 2, "difficulty": 2}, + { "id": "caterpillar_giant", "weight": 2, "difficulty": 3}, { "id": "zombie_orc", "weight": 1, "difficulty": 3}, { "id": "zombie_dwarf", "weight": 1, "difficulty": 3}, { "id": "gnome", "weight": 1, "difficulty": 3}, @@ -102,12 +104,18 @@ { "id": "dwarf", "weight": 3, "difficulty": 4}, { "id": "orc_hill", "weight": 1, "difficulty": 4}, { "id": "horse_little", "weight": 2, "difficulty": 4}, + { "id": "ant_worker", "weight": 3, "difficulty": 4}, { "id": "dog", "weight": 1, "difficulty": 5}, { "id": "wolf", "weight": 2, "difficulty": 6}, + { "id": "jaguar", "weight": 2, "difficulty": 6}, + { "id": "ant_soldier", "weight": 2, "difficulty": 6}, { "id": "orc_captain", "weight": 1, "difficulty": 7}, { "id": "dog_large", "weight": 1, "difficulty": 7}, + { "id": "lynx", "weight": 1, "difficulty": 7}, + { "id": "panther", "weight": 1, "difficulty": 7}, { "id": "horse", "weight": 2, "difficulty": 7}, { "id": "ogre", "weight": 1, "difficulty": 7}, + { "id": "warg", "weight": 2, "difficulty": 8}, { "id": "horse_large", "weight": 2, "difficulty": 9} ] }, diff --git a/resources/terminal10x10_gs_tc.png b/resources/terminal10x10_gs_tc.png deleted file mode 100644 index 5e0cdc9..0000000 Binary files a/resources/terminal10x10_gs_tc.png and /dev/null differ diff --git a/resources/terminal8x8.jpg b/resources/terminal8x8.jpg deleted file mode 100644 index 9f4d79d..0000000 Binary files a/resources/terminal8x8.jpg and /dev/null differ diff --git a/resources/terminal_10x16.png b/resources/terminal_10x16.png deleted file mode 100644 index e40aa99..0000000 Binary files a/resources/terminal_10x16.png and /dev/null differ diff --git a/resources/vga8x16.png b/resources/vga8x16.png deleted file mode 100644 index 913e32c..0000000 Binary files a/resources/vga8x16.png and /dev/null differ diff --git a/src/ai/approach_ai_system.rs b/src/ai/approach_ai_system.rs index 5796463..6e6e7a8 100644 --- a/src/ai/approach_ai_system.rs +++ b/src/ai/approach_ai_system.rs @@ -1,5 +1,5 @@ use crate::{ EntityMoved, Map, Position, TakingTurn, Telepath, Viewshed, WantsToApproach }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub struct ApproachAI {} @@ -7,7 +7,6 @@ pub struct ApproachAI {} impl<'a> System<'a> for ApproachAI { #[allow(clippy::type_complexity)] type SystemData = ( - WriteExpect<'a, RandomNumberGenerator>, WriteStorage<'a, TakingTurn>, WriteStorage<'a, WantsToApproach>, WriteStorage<'a, Position>, @@ -20,7 +19,6 @@ impl<'a> System<'a> for ApproachAI { fn run(&mut self, data: Self::SystemData) { let ( - mut rng, mut turns, mut wants_to_approach, mut positions, @@ -50,7 +48,7 @@ impl<'a> System<'a> for ApproachAI { let mut curr_abs_diff = 100; let idx = map.xy_idx(pos.x, pos.y); for tar_idx in target_idxs { - let potential_path = rltk::a_star_search(idx, tar_idx, &mut *map); + let potential_path = a_star_search(idx, tar_idx, &mut *map); if potential_path.success && potential_path.steps.len() > 1 { if path.is_none() || diff --git a/src/ai/chase_ai_system.rs b/src/ai/chase_ai_system.rs index faf89d4..9fd29bf 100644 --- a/src/ai/chase_ai_system.rs +++ b/src/ai/chase_ai_system.rs @@ -1,5 +1,5 @@ use crate::{ Chasing, EntityMoved, Map, Position, TakingTurn, Telepath, Viewshed }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::HashMap; use super::approach_ai_system::get_adjacent_unblocked; @@ -26,8 +26,16 @@ impl<'a> System<'a> for ChaseAI { ); fn run(&mut self, data: Self::SystemData) { - let (mut turns, mut chasing, mut positions, mut map, mut viewsheds, mut telepaths, mut entity_moved, entities) = - data; + let ( + mut turns, + mut chasing, + mut positions, + mut map, + mut viewsheds, + mut telepaths, + mut entity_moved, + entities, + ) = data; let mut targets: HashMap = HashMap::new(); let mut end_chase: Vec = Vec::new(); // For every chasing entity with a turn, look for a valid target position, @@ -67,9 +75,12 @@ impl<'a> System<'a> for ChaseAI { let mut path: Option = None; let idx = map.xy_idx(pos.x, pos.y); for tar_idx in target_idxs { - let potential_path = rltk::a_star_search(idx, tar_idx, &mut *map); + let potential_path = a_star_search(idx, tar_idx, &mut *map); if potential_path.success && potential_path.steps.len() > 1 { - if path.is_none() || potential_path.steps.len() < path.as_ref().unwrap().steps.len() { + if + path.is_none() || + potential_path.steps.len() < path.as_ref().unwrap().steps.len() + { path = Some(potential_path); } } diff --git a/src/ai/default_move_system.rs b/src/ai/default_move_system.rs index b56987c..bd417bd 100644 --- a/src/ai/default_move_system.rs +++ b/src/ai/default_move_system.rs @@ -1,5 +1,16 @@ -use crate::{ tile_walkable, EntityMoved, Map, MoveMode, Movement, Position, TakingTurn, Telepath, Viewshed }; +use crate::{ + tile_walkable, + EntityMoved, + Map, + MoveMode, + Movement, + Position, + TakingTurn, + Telepath, + Viewshed, +}; use specs::prelude::*; +use bracket_lib::prelude::*; // Rolling a 1d8+x to decide where to move, where x are the number // of dice rolls in which they will remian stationary. i.e. If this @@ -16,7 +27,7 @@ impl<'a> System<'a> for DefaultAI { WriteStorage<'a, Viewshed>, WriteStorage<'a, Telepath>, WriteStorage<'a, EntityMoved>, - WriteExpect<'a, rltk::RandomNumberGenerator>, + WriteExpect<'a, RandomNumberGenerator>, Entities<'a>, ); @@ -85,7 +96,9 @@ impl<'a> System<'a> for DefaultAI { let idx = map.xy_idx(pos.x, pos.y); pos.x = x; pos.y = y; - entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert EntityMoved"); + entity_moved + .insert(entity, EntityMoved {}) + .expect("Unable to insert EntityMoved"); crate::spatial::move_entity(entity, idx, dest_idx); viewshed.dirty = true; if let Some(is_telepath) = telepaths.get_mut(entity) { @@ -102,7 +115,9 @@ impl<'a> System<'a> for DefaultAI { if !crate::spatial::is_blocked(path[1] as usize) { pos.x = (path[1] as i32) % map.width; pos.y = (path[1] as i32) / map.width; - entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert EntityMoved"); + entity_moved + .insert(entity, EntityMoved {}) + .expect("Unable to insert EntityMoved"); let new_idx = map.xy_idx(pos.x, pos.y); crate::spatial::move_entity(entity, idx, new_idx); viewshed.dirty = true; @@ -112,7 +127,7 @@ impl<'a> System<'a> for DefaultAI { path.remove(0); } else { // If the path is blocked, recalculate a new path to the same waypoint. - let path = rltk::a_star_search( + let path = a_star_search( map.xy_idx(pos.x, pos.y) as i32, map.xy_idx( (path[path.len() - 1] as i32) % map.width, @@ -121,7 +136,9 @@ impl<'a> System<'a> for DefaultAI { &mut *map ); if path.success && path.steps.len() > 1 { - move_mode.mode = Movement::RandomWaypoint { path: Some(path.steps) }; + move_mode.mode = Movement::RandomWaypoint { + path: Some(path.steps), + }; } } } else { @@ -132,7 +149,7 @@ impl<'a> System<'a> for DefaultAI { let target_y = rng.roll_dice(1, map.height - 2); let idx = map.xy_idx(target_x, target_y); if tile_walkable(map.tiles[idx]) { - let path = rltk::a_star_search( + let path = a_star_search( map.xy_idx(pos.x, pos.y) as i32, map.xy_idx(target_x, target_y) as i32, &mut *map diff --git a/src/ai/energy_system.rs b/src/ai/energy_system.rs index b4d3256..da62467 100644 --- a/src/ai/energy_system.rs +++ b/src/ai/energy_system.rs @@ -10,8 +10,9 @@ use crate::{ Map, TakingTurn, Confusion, + Intrinsics, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::config::CONFIG; use crate::data::events::*; @@ -36,6 +37,7 @@ impl<'a> System<'a> for EnergySystem { ReadStorage<'a, Name>, ReadExpect<'a, Point>, ReadStorage<'a, Confusion>, + ReadStorage<'a, Intrinsics>, ); fn run(&mut self, data: Self::SystemData) { @@ -53,6 +55,7 @@ impl<'a> System<'a> for EnergySystem { names, player_pos, confusion, + intrinsics, ) = data; // If not ticking, do nothing. if *runstate != RunState::Ticking { @@ -68,7 +71,7 @@ impl<'a> System<'a> for EnergySystem { .insert(entity, TakingTurn {}) .expect("Unable to insert turn for turn counter."); energy.current -= TURN_COST; - crate::gamelog::record_event(EVENT::TURN(1)); + crate::gamelog::record_event(EVENT::Turn(1)); // Handle spawning mobs each turn if CONFIG.logging.log_ticks { console::log( @@ -87,20 +90,14 @@ impl<'a> System<'a> for EnergySystem { &positions, !&confusion, ).join() { - let burden_modifier = if let Some(burden) = burdens.get(entity) { - match burden.level { - BurdenLevel::Burdened => SPEED_MOD_BURDENED, - BurdenLevel::Strained => SPEED_MOD_STRAINED, - BurdenLevel::Overloaded => SPEED_MOD_OVERLOADED, - } - } else { - 1.0 - }; - let overmap_mod = if map.overmap { SPEED_MOD_OVERMAP_TRAVEL } else { 1.0 }; + let burden_modifier = get_burden_modifier(&burdens, entity); + let overmap_mod = get_overmap_modifier(&map); + let intrinsic_speed = get_intrinsic_speed(&intrinsics, entity); // Every entity has a POTENTIAL equal to their speed. let mut energy_potential: i32 = ((energy.speed as f32) * burden_modifier * - overmap_mod) as i32; + overmap_mod * + intrinsic_speed) as i32; // Increment current energy by NORMAL_SPEED for every // whole number of NORMAL_SPEEDS in their POTENTIAL. while energy_potential >= NORMAL_SPEED { @@ -121,37 +118,61 @@ impl<'a> System<'a> for EnergySystem { // has enough energy, they take a turn and decrement their energy // by TURN_COST. If the current entity is the player, await input. if energy.current >= TURN_COST { - let mut my_turn = true; energy.current -= TURN_COST; if entity == *player { *runstate = RunState::AwaitingInput; - } else { - let distance = rltk::DistanceAlg::Pythagoras.distance2d( - *player_pos, - Point::new(pos.x, pos.y) - ); - if distance > 20.0 { - my_turn = false; - } + } else if cull_turn_by_distance(&player_pos, pos) { + continue; } - if my_turn { - turns.insert(entity, TakingTurn {}).expect("Unable to insert turn."); - if CONFIG.logging.log_ticks { - let name = if let Some(name) = names.get(entity) { - &name.name - } else { - "Unknown entity" - }; - console::log( - format!( - "ENERGY SYSTEM: {} granted a turn. [leftover energy: {}].", - name, - energy.current - ) - ); - } + turns.insert(entity, TakingTurn {}).expect("Unable to insert turn."); + if CONFIG.logging.log_ticks { + let name = if let Some(name) = names.get(entity) { + &name.name + } else { + "Unknown entity" + }; + console::log( + format!( + "ENERGY SYSTEM: {} granted a turn. [leftover energy: {}].", + name, + energy.current + ) + ); } } } } } + +fn get_burden_modifier(burdens: &ReadStorage, entity: Entity) -> f32 { + return if let Some(burden) = burdens.get(entity) { + match burden.level { + BurdenLevel::Burdened => SPEED_MOD_BURDENED, + BurdenLevel::Strained => SPEED_MOD_STRAINED, + BurdenLevel::Overloaded => SPEED_MOD_OVERLOADED, + } + } else { + 1.0 + }; +} + +fn get_overmap_modifier(map: &ReadExpect) -> f32 { + return if map.overmap { SPEED_MOD_OVERMAP_TRAVEL } else { 1.0 }; +} + +fn cull_turn_by_distance(player_pos: &Point, pos: &Position) -> bool { + let distance = DistanceAlg::Pythagoras.distance2d(*player_pos, Point::new(pos.x, pos.y)); + if distance > 20.0 { + return true; + } + return false; +} + +fn get_intrinsic_speed(intrinsics: &ReadStorage, entity: Entity) -> f32 { + if let Some(intrinsics) = intrinsics.get(entity) { + if intrinsics.list.contains(&crate::Intrinsic::Speed) { + return 4.0 / 3.0; + } + } + return 1.0; +} diff --git a/src/ai/flee_ai_system.rs b/src/ai/flee_ai_system.rs index ce6f8b0..810dcb5 100644 --- a/src/ai/flee_ai_system.rs +++ b/src/ai/flee_ai_system.rs @@ -1,5 +1,5 @@ use crate::{ EntityMoved, Map, Position, TakingTurn, Telepath, Viewshed, WantsToFlee }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub struct FleeAI {} @@ -39,7 +39,13 @@ impl<'a> System<'a> for FleeAI { turn_done.push(entity); let my_idx = map.xy_idx(pos.x, pos.y); map.populate_blocked(); - let flee_map = DijkstraMap::new(map.width as usize, map.height as usize, &fleeing.indices, &*map, 100.0); + let flee_map = DijkstraMap::new( + map.width as usize, + map.height as usize, + &fleeing.indices, + &*map, + 100.0 + ); let flee_target = DijkstraMap::find_highest_exit(&flee_map, my_idx, &*map); if let Some(flee_target) = flee_target { if !crate::spatial::is_blocked(flee_target as usize) { @@ -50,7 +56,9 @@ impl<'a> System<'a> for FleeAI { } pos.x = (flee_target as i32) % map.width; pos.y = (flee_target as i32) / map.width; - entity_moved.insert(entity, EntityMoved {}).expect("Unable to insert EntityMoved"); + entity_moved + .insert(entity, EntityMoved {}) + .expect("Unable to insert EntityMoved"); } } } diff --git a/src/ai/quip_system.rs b/src/ai/quip_system.rs index 6b535a9..87bda2e 100644 --- a/src/ai/quip_system.rs +++ b/src/ai/quip_system.rs @@ -1,5 +1,5 @@ use crate::{ gamelog, gui::renderable_colour, Name, Quips, Renderable, TakingTurn, Viewshed }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub struct QuipSystem {} @@ -19,8 +19,18 @@ impl<'a> System<'a> for QuipSystem { fn run(&mut self, data: Self::SystemData) { let (entities, mut quips, names, renderables, turns, player_pos, viewsheds, mut rng) = data; - for (entity, quip, name, viewshed, _turn) in (&entities, &mut quips, &names, &viewsheds, &turns).join() { - if !quip.available.is_empty() && viewshed.visible_tiles.contains(&player_pos) && rng.roll_dice(1, 6) == 1 { + for (entity, quip, name, viewshed, _turn) in ( + &entities, + &mut quips, + &names, + &viewsheds, + &turns, + ).join() { + if + !quip.available.is_empty() && + viewshed.visible_tiles.contains(&player_pos) && + rng.roll_dice(1, 6) == 1 + { let quip_index = if quip.available.len() == 1 { 0 } else { diff --git a/src/ai/regen_system.rs b/src/ai/regen_system.rs index b74f857..8114c4e 100644 --- a/src/ai/regen_system.rs +++ b/src/ai/regen_system.rs @@ -9,6 +9,7 @@ use crate::{ Position, RandomNumberGenerator, TakingTurn, + Intrinsics, }; use specs::prelude::*; use crate::data::events::*; @@ -36,10 +37,24 @@ impl<'a> System<'a> for RegenSystem { ReadStorage<'a, HasClass>, ReadStorage<'a, Attributes>, WriteExpect<'a, RandomNumberGenerator>, + ReadStorage<'a, Intrinsics>, + ReadExpect<'a, Entity>, ); fn run(&mut self, data: Self::SystemData) { - let (clock, entities, positions, mut pools, turns, player, classes, attributes, mut rng) = data; + let ( + clock, + entities, + positions, + mut pools, + turns, + player, + classes, + attributes, + mut rng, + intrinsics, + player_entity, + ) = data; let mut clock_turn = false; for (_e, _c, _t) in (&entities, &clock, &turns).join() { clock_turn = true; @@ -56,19 +71,29 @@ impl<'a> System<'a> for RegenSystem { } // Player HP regen let level = gamelog::get_event_count(EVENT::COUNT_LEVEL); - if current_turn % get_player_hp_regen_turn(level) == 0 { + if + current_turn % get_player_hp_regen_turn(level) == 0 || + intrinsics.get(*player_entity).unwrap().list.contains(&crate::Intrinsic::Regeneration) + { for (_e, _p, pool, _player) in (&entities, &positions, &mut pools, &player).join() { try_hp_regen_tick(pool, get_player_hp_regen_per_tick(level)); } } // Both MP regen for (e, _p, pool) in (&entities, &positions, &mut pools).join() { - let is_wizard = if let Some(class) = classes.get(e) { class.name == Class::Wizard } else { false }; + let is_wizard = if let Some(class) = classes.get(e) { + class.name == Class::Wizard + } else { + false + }; let numerator = if is_wizard { WIZARD_MP_REGEN_MOD } else { NONWIZARD_MP_REGEN_MOD }; let multiplier: f32 = (numerator as f32) / (MP_REGEN_DIVISOR as f32); let mp_regen_tick = (((MP_REGEN_BASE - pool.level) as f32) * multiplier) as i32; if current_turn % mp_regen_tick == 0 { - try_mana_regen_tick(pool, rng.roll_dice(1, get_mana_regen_per_tick(e, &attributes))); + try_mana_regen_tick( + pool, + rng.roll_dice(1, get_mana_regen_per_tick(e, &attributes)) + ); } } } diff --git a/src/ai/turn_status_system.rs b/src/ai/turn_status_system.rs index cdc3f73..db3acaa 100644 --- a/src/ai/turn_status_system.rs +++ b/src/ai/turn_status_system.rs @@ -10,7 +10,7 @@ use crate::{ Item, Prop, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::data::events::*; @@ -99,7 +99,7 @@ impl<'a> System<'a> for TurnStatusSystem { .colour(WHITE) .append("are confused!"); log = true; - gamelog::record_event(EVENT::PLAYER_CONFUSED(1)); + gamelog::record_event(EVENT::PlayerConfused(1)); } else { logger = logger .append("The") diff --git a/src/ai/visible_ai_system.rs b/src/ai/visible_ai_system.rs index 6ed85d2..5441030 100644 --- a/src/ai/visible_ai_system.rs +++ b/src/ai/visible_ai_system.rs @@ -12,7 +12,7 @@ use crate::{ WantsToApproach, WantsToFlee, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::HashSet; @@ -81,10 +81,16 @@ impl<'a> System<'a> for VisibleAI { } reactions.sort_by(|(a, _, _), (b, _, _)| { let (a_x, a_y) = (a % (map.width as usize), a / (map.width as usize)); - let dist_a = DistanceAlg::PythagorasSquared.distance2d(Point::new(a_x, a_y), Point::new(pos.x, pos.y)); + let dist_a = DistanceAlg::PythagorasSquared.distance2d( + Point::new(a_x, a_y), + Point::new(pos.x, pos.y) + ); let dist_a_estimate = dist_a as i32; let (b_x, b_y) = (b % (map.width as usize), b / (map.width as usize)); - let dist_b = DistanceAlg::PythagorasSquared.distance2d(Point::new(b_x, b_y), Point::new(pos.x, pos.y)); + let dist_b = DistanceAlg::PythagorasSquared.distance2d( + Point::new(b_x, b_y), + Point::new(pos.x, pos.y) + ); let dist_b_estimate = dist_b as i32; return dist_b_estimate.cmp(&dist_a_estimate); }); @@ -96,7 +102,9 @@ impl<'a> System<'a> for VisibleAI { wants_to_approach .insert(entity, WantsToApproach { idx: reaction.0 as i32 }) .expect("Error inserting WantsToApproach"); - chasing.insert(entity, Chasing { target: reaction.2 }).expect("Unable to insert Chasing"); + chasing + .insert(entity, Chasing { target: reaction.2 }) + .expect("Unable to insert Chasing"); continue; } } @@ -108,7 +116,9 @@ impl<'a> System<'a> for VisibleAI { } } if !flee.is_empty() { - wants_to_flee.insert(entity, WantsToFlee { indices: flee }).expect("Unable to insert"); + wants_to_flee + .insert(entity, WantsToFlee { indices: flee }) + .expect("Unable to insert"); } } } diff --git a/src/camera.rs b/src/camera.rs index f08d04b..f143db1 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,12 +1,12 @@ -use super::{ Hidden, Map, Mind, Position, Prop, Renderable, Pools }; -use rltk::prelude::*; +use super::{ Hidden, Map, Mind, Position, Prop, Renderable }; +use bracket_lib::prelude::*; use specs::prelude::*; use std::ops::Mul; use super::data::visuals::{ VIEWPORT_W, VIEWPORT_H }; const SHOW_BOUNDARIES: bool = false; -pub fn get_screen_bounds(ecs: &World, _ctx: &mut Rltk) -> (i32, i32, i32, i32, i32, i32) { +pub fn get_screen_bounds(ecs: &World, _ctx: &mut BTerm) -> (i32, i32, i32, i32, i32, i32) { let player_pos = ecs.fetch::(); let map = ecs.fetch::(); let (x_chars, y_chars, mut x_offset, mut y_offset) = (VIEWPORT_W, VIEWPORT_H, 1, 10); @@ -32,7 +32,7 @@ pub fn get_screen_bounds(ecs: &World, _ctx: &mut Rltk) -> (i32, i32, i32, i32, i (min_x, max_x, min_y, max_y, x_offset, y_offset) } -pub fn render_camera(ecs: &World, ctx: &mut Rltk) { +pub fn render_camera(ecs: &World, ctx: &mut BTerm) { let map = ecs.fetch::(); let (min_x, max_x, min_y, max_y, x_offset, y_offset) = get_screen_bounds(ecs, ctx); @@ -151,7 +151,7 @@ pub fn render_camera(ecs: &World, ctx: &mut Rltk) { } } -pub fn render_debug_map(map: &Map, ctx: &mut Rltk) { +pub fn render_debug_map(map: &Map, ctx: &mut BTerm) { let player_pos = Point::new(map.width / 2, map.height / 2); let (x_chars, y_chars) = ctx.get_char_size(); @@ -182,7 +182,7 @@ pub fn render_debug_map(map: &Map, ctx: &mut Rltk) { ctx.set(x, y, fg, bg, glyph); } } else if SHOW_BOUNDARIES { - ctx.set(x, y, RGB::named(rltk::GRAY), RGB::named(rltk::BLACK), rltk::to_cp437('·')); + ctx.set(x, y, RGB::named(GRAY), RGB::named(BLACK), to_cp437('·')); } x += 1; } diff --git a/src/components.rs b/src/components.rs index f331df0..8c56cce 100644 --- a/src/components.rs +++ b/src/components.rs @@ -1,12 +1,12 @@ use crate::gui::Ancestry; use crate::gui::Class; -use rltk::RGB; +use bracket_lib::prelude::*; use serde::{ Deserialize, Serialize }; use specs::error::NoError; use specs::prelude::*; use specs::saveload::{ ConvertSaveload, Marker }; use specs_derive::*; -use std::collections::HashMap; +use std::collections::{ HashMap, HashSet }; // Serialization helper code. We need to implement ConvertSaveload for each type that contains an // Entity. @@ -40,7 +40,7 @@ pub struct OtherLevelPosition { #[derive(Component, ConvertSaveload, Clone)] pub struct Renderable { - pub glyph: rltk::FontCharType, + pub glyph: FontCharType, pub fg: RGB, pub bg: RGB, pub render_order: i32, @@ -104,14 +104,14 @@ pub struct Mind {} #[derive(Component, ConvertSaveload, Clone)] pub struct Viewshed { - pub visible_tiles: Vec, + pub visible_tiles: Vec, pub range: i32, pub dirty: bool, } #[derive(Component, ConvertSaveload, Clone)] pub struct Telepath { - pub telepath_tiles: Vec, + pub telepath_tiles: Vec, pub range: i32, pub dirty: bool, } @@ -316,6 +316,7 @@ pub enum WeaponAttribute { #[derive(Component, Serialize, Deserialize, Clone)] pub struct MeleeWeapon { + pub damage_type: DamageType, pub attribute: WeaponAttribute, pub damage_n_dice: i32, pub damage_die_type: i32, @@ -326,6 +327,7 @@ pub struct MeleeWeapon { #[derive(Serialize, Deserialize, Clone)] pub struct NaturalAttack { pub name: String, + pub damage_type: DamageType, pub damage_n_dice: i32, pub damage_die_type: i32, pub damage_bonus: i32, @@ -365,8 +367,74 @@ pub struct ProvidesHealing { pub modifier: i32, } +#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize)] +pub enum DamageType { + Physical, + Magic, // e.g. magic missiles, silvered weapons + Fire, // e.g. fireball + Cold, // e.g. cone of cold + Poison, // e.g. poison gas + Forced, // Bypasses any immunities. e.g. Hunger ticks. +} + +impl DamageType { + pub fn is_magic(&self) -> bool { + match self { + DamageType::Magic | DamageType::Fire | DamageType::Cold => true, + _ => false, + } + } +} + +#[derive(Debug, PartialEq, Copy, Clone, Serialize, Deserialize)] +pub enum DamageModifier { + None, + Weakness, + Resistance, + Immune, +} + +impl DamageModifier { + const NONE_MOD: f32 = 1.0; + const WEAK_MOD: f32 = 2.0; + const RESIST_MOD: f32 = 0.5; + const IMMUNE_MOD: f32 = 0.0; + + pub fn multiplier(&self) -> f32 { + match self { + DamageModifier::None => Self::NONE_MOD, + DamageModifier::Weakness => Self::WEAK_MOD, + DamageModifier::Resistance => Self::RESIST_MOD, + DamageModifier::Immune => Self::IMMUNE_MOD, + } + } +} + +#[derive(Component, Serialize, Deserialize, Debug, Clone)] +pub struct HasDamageModifiers { + pub modifiers: HashMap, +} + +impl HasDamageModifiers { + pub fn modifier(&self, damage_type: &DamageType) -> &DamageModifier { + self.modifiers.get(damage_type).unwrap_or(&DamageModifier::None) + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum Intrinsic { + Regeneration, // Regenerate 1 HP on every tick + Speed, // 4/3x speed multiplier +} + +#[derive(Component, Serialize, Deserialize, Debug, Clone)] +pub struct Intrinsics { + pub list: HashSet, +} + #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct InflictsDamage { + pub damage_type: DamageType, pub n_dice: i32, pub sides: i32, pub modifier: i32, @@ -417,7 +485,7 @@ pub struct WantsToRemoveItem { #[derive(Component, Debug, ConvertSaveload)] pub struct WantsToUseItem { pub item: Entity, - pub target: Option, + pub target: Option, } #[derive(Component, Debug, Serialize, Deserialize, Clone)] @@ -446,8 +514,8 @@ pub struct Charges { #[derive(Component, Serialize, Deserialize, Clone)] pub struct SpawnParticleLine { - pub glyph: rltk::FontCharType, - pub tail_glyph: rltk::FontCharType, + pub glyph: FontCharType, + pub tail_glyph: FontCharType, pub colour: RGB, pub lifetime_ms: f32, pub trail_colour: RGB, @@ -456,16 +524,16 @@ pub struct SpawnParticleLine { #[derive(Component, Serialize, Deserialize, Clone)] pub struct SpawnParticleSimple { - pub glyph: rltk::FontCharType, + pub glyph: FontCharType, pub colour: RGB, pub lifetime_ms: f32, } #[derive(Component, Serialize, Deserialize, Clone)] pub struct SpawnParticleBurst { - pub glyph: rltk::FontCharType, - pub head_glyph: rltk::FontCharType, - pub tail_glyph: rltk::FontCharType, + pub glyph: FontCharType, + pub head_glyph: FontCharType, + pub tail_glyph: FontCharType, pub colour: RGB, pub lerp: RGB, pub lifetime_ms: f32, diff --git a/src/config/mod.rs b/src/config/mod.rs index 38fa4fe..f86c5df 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,4 +1,4 @@ -use rltk::prelude::*; +use bracket_lib::prelude::*; use toml::Value; use serde::{ Serialize, Deserialize }; diff --git a/src/damage_system.rs b/src/damage_system.rs index ee59e88..a4224a7 100644 --- a/src/damage_system.rs +++ b/src/damage_system.rs @@ -12,7 +12,7 @@ use super::{ Renderable, RunState, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::data::events; @@ -40,7 +40,7 @@ pub fn delete_the_dead(ecs: &mut World) { .append("The") .colour(renderable_colour(&renderables, entity)) .append(&victim_name.name) - .colour(rltk::WHITE) + .colour(WHITE) .append("is destroyed!") .log(); } else { @@ -49,7 +49,7 @@ pub fn delete_the_dead(ecs: &mut World) { .append("The") .colour(renderable_colour(&renderables, entity)) .append(&victim_name.name) - .colour(rltk::WHITE) + .colour(WHITE) .append("dies!") .log(); } @@ -81,12 +81,15 @@ pub fn delete_the_dead(ecs: &mut World) { } // For everything that died, increment the event log, and delete. for victim in dead { - gamelog::record_event(events::EVENT::TURN(1)); + gamelog::record_event(events::EVENT::Turn(1)); ecs.delete_entity(victim).expect("Unable to delete."); } } -fn handle_dead_entity_items(ecs: &mut World, dead: &Vec) -> (Vec, Vec<(String, Position)>) { +fn handle_dead_entity_items( + ecs: &mut World, + dead: &Vec +) -> (Vec, Vec<(String, Position)>) { let mut to_drop: Vec<(Entity, Position)> = Vec::new(); let mut to_spawn: Vec<(String, Position)> = Vec::new(); let entities = ecs.entities(); diff --git a/src/data/events.rs b/src/data/events.rs index 9f1aba8..74fa459 100644 --- a/src/data/events.rs +++ b/src/data/events.rs @@ -2,17 +2,17 @@ use serde::{ Deserialize, Serialize }; #[derive(Serialize, Deserialize, Clone)] pub enum EVENT { - TURN(i32), - LEVEL(i32), - CHANGED_FLOOR(String), - PLAYER_CONFUSED(i32), - KICKED_SOMETHING(i32), - BROKE_DOOR(i32), - LOOKED_FOR_HELP(i32), - KILLED(String), - PLAYER_DIED(String), - DISCOVERED(String), - IDENTIFIED(String), + Turn(i32), + Level(i32), + ChangedFloor(String), + PlayerConfused(i32), + KickedSomething(i32), + BrokeDoor(i32), + LookedForHelp(i32), + Killed(String), + PlayerDied(String), + Discovered(String), + Identified(String), } impl EVENT { @@ -20,8 +20,8 @@ impl EVENT { pub const COUNT_KILLED: &str = "killed"; pub const COUNT_LEVEL: &str = "level"; pub const COUNT_CHANGED_FLOOR: &str = "changed_floor"; - pub const COUNT_BROKE_DOOR: &str = "broke_door"; - pub const COUNT_PLAYER_CONFUSED: &str = "player_confused"; + pub const COUNT_BROKE_DOOR: &str = "BrokeDoor"; + pub const COUNT_PLAYER_CONFUSED: &str = "PlayerConfused"; pub const COUNT_KICK: &str = "kick"; - pub const COUNT_LOOKED_FOR_HELP: &str = "looked_for_help"; + pub const COUNT_LOOKED_FOR_HELP: &str = "LookedForHelp"; } diff --git a/src/data/ids.rs b/src/data/ids.rs index ca38810..864a022 100644 --- a/src/data/ids.rs +++ b/src/data/ids.rs @@ -1,6 +1,6 @@ use super::names::*; use super::visuals::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; pub const ID_OVERMAP: i32 = 1; diff --git a/src/data/messages.rs b/src/data/messages.rs index 5847c14..89e39c8 100644 --- a/src/data/messages.rs +++ b/src/data/messages.rs @@ -32,7 +32,7 @@ pub const YOU_REMOVE_ITEM_CURSED: &str = "You can't remove the"; /// Prefixes death message. pub const PLAYER_DIED: &str = "You died!"; -/// Death message specifiers. Appended after PLAYER_DIED. +/// Death message specifiers. Appended after PlayerDied. pub const PLAYER_DIED_SUICIDE: &str = "You killed yourself"; pub const PLAYER_DIED_NAMED_ATTACKER: &str = "You were killed by"; pub const PLAYER_DIED_UNKNOWN: &str = "You were killed"; // Ultimately, this should never be used. Slowly include specific messages for any death. diff --git a/src/data/visuals.rs b/src/data/visuals.rs index f57449b..4b66e53 100644 --- a/src/data/visuals.rs +++ b/src/data/visuals.rs @@ -1,3 +1,5 @@ +use bracket_lib::prelude::*; + // POST-PROCESSING pub const WITH_DARKEN_BY_DISTANCE: bool = true; // If further away tiles should get darkened, instead of a harsh transition to non-visible. pub const VIEWPORT_W: i32 = 69; @@ -17,8 +19,8 @@ pub const SHORT_PARTICLE_LIFETIME: f32 = 100.0; // in ms pub const DEFAULT_PARTICLE_LIFETIME: f32 = 200.0; pub const LONG_PARTICLE_LIFETIME: f32 = 300.0; -pub const TARGETING_CURSOR_COL: (u8, u8, u8) = rltk::GOLDENROD; -pub const TARGETING_LINE_COL: (u8, u8, u8) = rltk::LIGHTGOLDENROD; +pub const TARGETING_CURSOR_COL: (u8, u8, u8) = GOLDENROD; +pub const TARGETING_LINE_COL: (u8, u8, u8) = LIGHTGOLDENROD; pub const TARGETING_AOE_COL: (u8, u8, u8) = (20, 20, 20); pub const TARGETING_VALID_COL: (u8, u8, u8) = (10, 10, 10); diff --git a/src/effects/damage.rs b/src/effects/damage.rs index 249eb2b..80885e2 100644 --- a/src/effects/damage.rs +++ b/src/effects/damage.rs @@ -14,21 +14,29 @@ use crate::{ HungerClock, HungerState, Bleeds, + HasDamageModifiers, }; use crate::gui::with_article; use crate::data::visuals::{ DEFAULT_PARTICLE_LIFETIME, LONG_PARTICLE_LIFETIME }; use crate::data::messages::LEVELUP_PLAYER; use crate::data::events::*; use crate::data::messages::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub fn inflict_damage(ecs: &mut World, damage: &EffectSpawner, target: Entity) { let mut pools = ecs.write_storage::(); if let Some(target_pool) = pools.get_mut(target) { if !target_pool.god { - if let EffectType::Damage { amount } = damage.effect_type { - target_pool.hit_points.current -= amount; + if let EffectType::Damage { amount, damage_type } = damage.effect_type { + let mult = if + let Some(modifiers) = ecs.read_storage::().get(target) + { + modifiers.modifier(&damage_type).multiplier() + } else { + 1.0 + }; + target_pool.hit_points.current -= ((amount as f32) * mult) as i32; let bleeders = ecs.read_storage::(); if let Some(bleeds) = bleeders.get(target) { add_effect( @@ -221,12 +229,12 @@ pub fn entity_death(ecs: &mut World, effect: &EffectSpawner, target: Entity) { if let Some(source) = effect.source { // If the target was the player, game over, and record source of death. if target == *player { - gamelog::record_event(EVENT::PLAYER_DIED(get_death_message(ecs, source))); + gamelog::record_event(EVENT::PlayerDied(get_death_message(ecs, source))); return; } else { // If the player was the source, record the kill. if let Some(tar_name) = names.get(target) { - gamelog::record_event(EVENT::KILLED(tar_name.name.clone())); + gamelog::record_event(EVENT::Killed(tar_name.name.clone())); } } // Calc XP value of target. @@ -246,7 +254,7 @@ pub fn entity_death(ecs: &mut World, effect: &EffectSpawner, target: Entity) { source_pools.level += 1; // If it was the PLAYER that levelled up: if ecs.read_storage::().get(source).is_some() { - gamelog::record_event(EVENT::LEVEL(1)); + gamelog::record_event(EVENT::Level(1)); gamelog::Logger ::new() .append(LEVELUP_PLAYER) @@ -328,11 +336,11 @@ pub fn entity_death(ecs: &mut World, effect: &EffectSpawner, target: Entity) { if target == *player { if let Some(hc) = ecs.read_storage::().get(target) { if hc.state == HungerState::Starving { - gamelog::record_event(EVENT::PLAYER_DIED("You starved to death!".to_string())); + gamelog::record_event(EVENT::PlayerDied("You starved to death!".to_string())); } } else { gamelog::record_event( - EVENT::PLAYER_DIED("You died from unknown causes!".to_string()) + EVENT::PlayerDied("You died from unknown causes!".to_string()) ); } } diff --git a/src/effects/mod.rs b/src/effects/mod.rs index 0c05f27..c23b52b 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -1,9 +1,10 @@ use super::BUC; use crate::spatial; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::VecDeque; use std::sync::Mutex; +use crate::components::DamageType; mod damage; mod hunger; @@ -24,6 +25,7 @@ lazy_static! { pub enum EffectType { Damage { amount: i32, + damage_type: DamageType, }, Healing { amount: i32, diff --git a/src/effects/particles.rs b/src/effects/particles.rs index c1c1bc6..a6170dc 100644 --- a/src/effects/particles.rs +++ b/src/effects/particles.rs @@ -1,6 +1,6 @@ use super::{ add_effect, targeting, EffectSpawner, EffectType, Targets }; use crate::{ Map, ParticleBuilder, SpawnParticleBurst, SpawnParticleLine, SpawnParticleSimple }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub fn particle_to_tile(ecs: &mut World, target: i32, effect: &EffectSpawner) { @@ -8,9 +8,24 @@ pub fn particle_to_tile(ecs: &mut World, target: i32, effect: &EffectSpawner) { let map = ecs.fetch::(); let mut particle_builder = ecs.fetch_mut::(); if delay <= 0.0 { - particle_builder.request(target % map.width, target / map.width, fg, bg, glyph, lifespan); + particle_builder.request( + target % map.width, + target / map.width, + fg, + bg, + glyph, + lifespan + ); } else { - particle_builder.delay(target % map.width, target / map.width, fg, bg, glyph, lifespan, delay); + particle_builder.delay( + target % map.width, + target / map.width, + fg, + bg, + glyph, + lifespan, + delay + ); } } } @@ -113,9 +128,14 @@ pub fn handle_line_particles(ecs: &World, entity: Entity, target: &Targets) { if let Some(part) = ecs.read_storage::().get(entity) { if let Some(start_pos) = targeting::find_item_position(ecs, entity) { match target { - Targets::Tile { target } => spawn_line_particles(ecs, start_pos, *target as i32, part), + Targets::Tile { target } => + spawn_line_particles(ecs, start_pos, *target as i32, part), Targets::TileList { targets } => { - targets.iter().for_each(|target| spawn_line_particles(ecs, start_pos, *target as i32, part)) + targets + .iter() + .for_each(|target| + spawn_line_particles(ecs, start_pos, *target as i32, part) + ) } Targets::Entity { target } => { if let Some(end_pos) = targeting::entity_position(ecs, *target) { diff --git a/src/effects/targeting.rs b/src/effects/targeting.rs index 05b99c1..1ac124c 100644 --- a/src/effects/targeting.rs +++ b/src/effects/targeting.rs @@ -1,5 +1,5 @@ use crate::{ Equipped, InBackpack, Map, Position }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub fn entity_position(ecs: &World, target: Entity) -> Option { @@ -10,8 +10,8 @@ pub fn entity_position(ecs: &World, target: Entity) -> Option { return None; } -pub fn aoe_tiles(map: &Map, target: rltk::Point, radius: i32) -> Vec { - let mut blast_tiles = rltk::field_of_view(target, radius, &*map); +pub fn aoe_tiles(map: &Map, target: Point, radius: i32) -> Vec { + let mut blast_tiles = field_of_view(target, radius, &*map); blast_tiles.retain(|p| p.x > 0 && p.x < map.width - 1 && p.y > 0 && p.y < map.height - 1); let mut result = Vec::new(); for t in blast_tiles.iter() { diff --git a/src/effects/triggers.rs b/src/effects/triggers.rs index 0cbc3fa..ac38ccb 100644 --- a/src/effects/triggers.rs +++ b/src/effects/triggers.rs @@ -30,13 +30,12 @@ use crate::{ SingleActivation, BUC, GrantsSpell, - KnownSpell, KnownSpells, Position, Viewshed, }; use crate::data::messages::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: &mut World) { // Check if the item has charges, etc. @@ -47,8 +46,10 @@ pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: gamelog::Logger::new().append(NOCHARGES_DIDNOTHING).log(); return; } - gamelog::Logger::new().colour(rltk::YELLOW).append(NOCHARGES_WREST); - ecs.write_storage::().insert(item, Consumable {}).expect("Could not insert consumable"); + gamelog::Logger::new().colour(YELLOW).append(NOCHARGES_WREST); + ecs.write_storage::() + .insert(item, Consumable {}) + .expect("Could not insert consumable"); } has_charges.uses -= 1; } @@ -83,7 +84,12 @@ struct EventInfo { // It does almost no sanity-checking to make sure the logs only appear if the effect is taking // place on the player -- once monsters can use an item, their item usage will make logs for // the player saying they were the one who used the item. This will need refactoring then. -fn event_trigger(source: Option, entity: Entity, target: &Targets, ecs: &mut World) -> bool { +fn event_trigger( + source: Option, + entity: Entity, + target: &Targets, + ecs: &mut World +) -> bool { let buc = if let Some(beatitude) = ecs.read_storage::().get(entity) { beatitude.buc.clone() } else { @@ -147,7 +153,11 @@ fn handle_restore_nutrition( return (logger, false); } -fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_magic_mapper( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if ecs.read_storage::().get(event.entity).is_some() { let mut runstate = ecs.fetch_mut::(); let cursed = if event.buc == BUC::Cursed { true } else { false }; @@ -159,9 +169,17 @@ fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamel return (logger, false); } -fn handle_grant_spell(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { - if let Some(granted_spell) = ecs.read_storage::().get(event.entity) { - if let Some(known_spells) = ecs.write_storage::().get_mut(event.source.unwrap()) { +fn handle_grant_spell( + ecs: &mut World, + event: &mut EventInfo, + logger: gamelog::Logger +) -> (gamelog::Logger, bool) { + if let Some(_granted_spell) = ecs.read_storage::().get(event.entity) { + if + let Some(_known_spells) = ecs + .write_storage::() + .get_mut(event.source.unwrap()) + { // TODO: Check if the player knows *this* spell, and add it if not. } else { // TODO: Grant the KnownSpells component, and then add the spell. @@ -170,7 +188,11 @@ fn handle_grant_spell(ecs: &mut World, event: &mut EventInfo, mut logger: gamelo return (logger, false); } -fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_healing( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if let Some(healing_item) = ecs.read_storage::().get(event.entity) { let mut rng = ecs.write_resource::(); let buc_mod = match event.buc { @@ -178,14 +200,19 @@ fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::L BUC::Cursed => -1, _ => 0, }; - let roll = rng.roll_dice(healing_item.n_dice + buc_mod, healing_item.sides) + healing_item.modifier; + let roll = + rng.roll_dice(healing_item.n_dice + buc_mod, healing_item.sides) + + healing_item.modifier; add_effect( event.source, EffectType::Healing { amount: roll, increment_max: get_noncursed(&event.buc) }, event.target.clone() ); for target in get_entity_targets(&event.target) { - if ecs.read_storage::().get(target).is_some() || ecs.read_storage::().get(target).is_some() { + if + ecs.read_storage::().get(target).is_some() || + ecs.read_storage::().get(target).is_some() + { continue; } let renderables = ecs.read_storage::(); @@ -211,11 +238,19 @@ fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::L return (logger, false); } -fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_damage( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if let Some(damage_item) = ecs.read_storage::().get(event.entity) { let mut rng = ecs.write_resource::(); let roll = rng.roll_dice(damage_item.n_dice, damage_item.sides) + damage_item.modifier; - add_effect(event.source, EffectType::Damage { amount: roll }, event.target.clone()); + add_effect( + event.source, + EffectType::Damage { amount: roll, damage_type: damage_item.damage_type }, + event.target.clone() + ); for target in get_entity_targets(&event.target) { if ecs.read_storage::().get(target).is_some() { continue; @@ -232,7 +267,9 @@ fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Lo .colour(WHITE) .append(DAMAGE_PLAYER_HIT); event.log = true; - } else if player_viewshed.visible_tiles.contains(&Point::new(target_pos.x, target_pos.y)) { + } else if + player_viewshed.visible_tiles.contains(&Point::new(target_pos.x, target_pos.y)) + { if ecs.read_storage::().get(target).is_some() { if ecs.read_storage::().get(target).is_some() { logger = logger @@ -259,9 +296,17 @@ fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Lo } #[allow(unused_mut)] -fn handle_confusion(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_confusion( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if let Some(confusion) = ecs.read_storage::().get(event.entity) { - add_effect(event.source, EffectType::Confusion { turns: confusion.turns }, event.target.clone()); + add_effect( + event.source, + EffectType::Confusion { turns: confusion.turns }, + event.target.clone() + ); return (logger, true); } return (logger, false); @@ -272,7 +317,11 @@ fn select_single(ecs: &World, runstate: RunState) { *new_runstate = runstate; } -fn handle_identify(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_identify( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if let Some(_i) = ecs.read_storage::().get(event.entity) { let mut rng = ecs.write_resource::(); let mut dm = ecs.fetch_mut::(); @@ -303,7 +352,10 @@ fn handle_identify(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog:: .get(event.source.unwrap()) .map(|b| b.known) .unwrap_or(true); - return in_this_backpack && (has_obfuscated_name || !already_identified || !known_beatitude); + let result = + in_this_backpack && + (has_obfuscated_name || !already_identified || !known_beatitude); + return result; }) { to_identify.push((e, name.name.clone())); } @@ -313,14 +365,20 @@ fn handle_identify(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog:: beatitude.known = true; } } - logger = logger.append(IDENTIFY_ALL).buc(event.buc.clone(), None, Some(IDENTIFY_ALL_BLESSED)); + logger = logger + .append(IDENTIFY_ALL) + .buc(event.buc.clone(), None, Some(IDENTIFY_ALL_BLESSED)); event.log = true; return (logger, true); } return (logger, false); } -fn handle_remove_curse(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) { +fn handle_remove_curse( + ecs: &mut World, + event: &mut EventInfo, + mut logger: gamelog::Logger +) -> (gamelog::Logger, bool) { if let Some(_r) = ecs.read_storage::().get(event.entity) { let mut to_decurse: Vec = Vec::new(); match event.buc { @@ -338,7 +396,9 @@ fn handle_remove_curse(ecs: &mut World, event: &mut EventInfo, mut logger: gamel &ecs.read_storage::(), ) .join() - .filter(|(_e, _i, bp, b)| bp.owner == event.source.unwrap() && b.buc == BUC::Cursed) { + .filter( + |(_e, _i, bp, b)| bp.owner == event.source.unwrap() && b.buc == BUC::Cursed + ) { to_decurse.push(entity); } } @@ -367,7 +427,9 @@ fn handle_remove_curse(ecs: &mut World, event: &mut EventInfo, mut logger: gamel } let mut beatitudes = ecs.write_storage::(); for e in to_decurse { - beatitudes.insert(e, Beatitude { buc: BUC::Uncursed, known: true }).expect("Unable to insert beatitude"); + beatitudes + .insert(e, Beatitude { buc: BUC::Uncursed, known: true }) + .expect("Unable to insert beatitude"); } logger = logger.append(REMOVECURSE).buc(event.buc.clone(), None, Some(REMOVECURSE_BLESSED)); event.log = true; diff --git a/src/gamelog/builder.rs b/src/gamelog/builder.rs index 5c66b86..50c9375 100644 --- a/src/gamelog/builder.rs +++ b/src/gamelog/builder.rs @@ -1,6 +1,6 @@ use super::{ append_entry, LogFragment }; use crate::BUC; -use rltk::prelude::*; +use bracket_lib::prelude::*; pub struct Logger { current_colour: RGB, @@ -10,7 +10,7 @@ pub struct Logger { impl Logger { /// Creates a blank builder for making message log entries. pub fn new() -> Self { - Logger { current_colour: RGB::named(rltk::WHITE), fragments: Vec::new() } + Logger { current_colour: RGB::named(WHITE), fragments: Vec::new() } } /// Sets the colour of the current message logger. @@ -42,11 +42,23 @@ impl Logger { pub fn buc(mut self, buc: BUC, cursed: Option, blessed: Option) -> Self { if buc == BUC::Cursed && cursed.is_some() { - self.fragments.push(LogFragment { colour: RGB::named(SALMON), text: cursed.unwrap().to_string() }); - self.fragments.push(LogFragment { colour: self.current_colour, text: ". ".to_string() }); + self.fragments.push(LogFragment { + colour: RGB::named(SALMON), + text: cursed.unwrap().to_string(), + }); + self.fragments.push(LogFragment { + colour: self.current_colour, + text: ". ".to_string(), + }); } else if buc == BUC::Blessed && blessed.is_some() { - self.fragments.push(LogFragment { colour: RGB::named(CYAN), text: blessed.unwrap().to_string() }); - self.fragments.push(LogFragment { colour: self.current_colour, text: ". ".to_string() }); + self.fragments.push(LogFragment { + colour: RGB::named(CYAN), + text: blessed.unwrap().to_string(), + }); + self.fragments.push(LogFragment { + colour: self.current_colour, + text: ". ".to_string(), + }); } return self; } diff --git a/src/gamelog/events.rs b/src/gamelog/events.rs index 0ef2d40..bef5ff6 100644 --- a/src/gamelog/events.rs +++ b/src/gamelog/events.rs @@ -5,7 +5,7 @@ use crate::data::names::*; lazy_static! { /// A count of each event that has happened over the run. i.e. "turns", "descended", "ascended" - static ref EVENT_COUNTER: Mutex> = Mutex::new(HashMap::new()); + pub static ref EVENT_COUNTER: Mutex> = Mutex::new(HashMap::new()); // A record of events that happened on a given turn. i.e. "Advanced to level 2". pub static ref EVENTS: Mutex>> = Mutex::new(HashMap::new()); // A record of floors visited, and monsters killed. Used to determine if an event is significant. @@ -41,8 +41,9 @@ pub fn restore_events(events: HashMap>) { } /// Wipes all events - for starting a new game. pub fn clear_events() { - EVENT_COUNTER.lock().unwrap().clear(); - EVENTS.lock().unwrap().clear(); + let (mut events, mut event_counts) = (EVENTS.lock().unwrap(), EVENT_COUNTER.lock().unwrap()); + events.clear(); + event_counts.clear(); } #[allow(unused_mut)] @@ -73,12 +74,12 @@ pub fn record_event(event: EVENT) { let mut new_event: String = "unknown event".to_string(); let mut significant_event = true; match event { - EVENT::TURN(n) => { + EVENT::Turn(n) => { modify_event_count(EVENT::COUNT_TURN, n); significant_event = false; } // If de-levelling is ever implemented, this needs refactoring (along with a lot of stuff). - EVENT::LEVEL(n) => { + EVENT::Level(n) => { modify_event_count(EVENT::COUNT_LEVEL, n); let new_lvl = get_event_count(EVENT::COUNT_LEVEL); if new_lvl == 1 { @@ -87,7 +88,7 @@ pub fn record_event(event: EVENT) { new_event = format!("Advanced to level {}", new_lvl); } } - EVENT::CHANGED_FLOOR(n) => { + EVENT::ChangedFloor(n) => { modify_event_count(EVENT::COUNT_CHANGED_FLOOR, 1); if VISITED.lock().unwrap().contains(&n) { significant_event = false; @@ -96,23 +97,23 @@ pub fn record_event(event: EVENT) { new_event = format!("Visited {} for the first time", n); } } - EVENT::KICKED_SOMETHING(n) => { + EVENT::KickedSomething(n) => { modify_event_count(EVENT::COUNT_KICK, n); significant_event = false; } - EVENT::BROKE_DOOR(n) => { + EVENT::BrokeDoor(n) => { modify_event_count(EVENT::COUNT_BROKE_DOOR, n); significant_event = false; } - EVENT::PLAYER_CONFUSED(n) => { + EVENT::PlayerConfused(n) => { modify_event_count(EVENT::COUNT_PLAYER_CONFUSED, n); significant_event = false; } - EVENT::LOOKED_FOR_HELP(n) => { + EVENT::LookedForHelp(n) => { modify_event_count(EVENT::COUNT_LOOKED_FOR_HELP, n); significant_event = false; } - EVENT::KILLED(name) => { + EVENT::Killed(name) => { modify_event_count(EVENT::COUNT_KILLED, 1); if KILLED.lock().unwrap().contains(&name) { significant_event = false; @@ -121,13 +122,13 @@ pub fn record_event(event: EVENT) { new_event = format!("Killed your first {}", name); } } - EVENT::DISCOVERED(name) => { + EVENT::Discovered(name) => { new_event = format!("Discovered {}", name); } - EVENT::IDENTIFIED(name) => { + EVENT::Identified(name) => { new_event = format!("Identified {}", name); } - EVENT::PLAYER_DIED(str) => { + EVENT::PlayerDied(str) => { // Generating the String is handled in the death effect, to avoid passing the ecs here. new_event = format!("{}", str); } diff --git a/src/gamelog/logstore.rs b/src/gamelog/logstore.rs index 876dce0..edea95b 100644 --- a/src/gamelog/logstore.rs +++ b/src/gamelog/logstore.rs @@ -1,5 +1,5 @@ use super::{ events, LogFragment, Logger }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use std::sync::Mutex; lazy_static! { @@ -19,7 +19,13 @@ pub fn clear_log() { LOG.lock().unwrap().clear(); } -pub fn print_log(console: &mut Box, pos: Point, _descending: bool, len: usize, maximum_len: i32) { +pub fn print_log( + console: &mut Box, + pos: Point, + _descending: bool, + len: usize, + maximum_len: i32 +) { let mut y = pos.y; let mut x = pos.x; // Reverse the log, take the number we want to show, and iterate through them @@ -61,7 +67,13 @@ pub fn print_log(console: &mut Box, pos: Point, _descending: bool, } // Stay within bounds if y > pos.y - (len as i32) { - console.print_color(x, y, frag.colour.into(), RGB::named(rltk::BLACK).into(), part); + console.print_color( + x, + y, + frag.colour.into(), + RGB::named(BLACK).into(), + part + ); } x += part.len() as i32; } @@ -80,7 +92,7 @@ pub fn setup_log() { Logger::new() .append("Welcome!") - .colour(rltk::CYAN) + .colour(CYAN) .append_n("Press [?] at any time to view controls") .period() .log(); diff --git a/src/gamelog/mod.rs b/src/gamelog/mod.rs index f67b436..2289c9f 100644 --- a/src/gamelog/mod.rs +++ b/src/gamelog/mod.rs @@ -7,7 +7,7 @@ mod events; pub use events::*; use serde::{ Deserialize, Serialize }; -use rltk::prelude::*; +use bracket_lib::prelude::*; #[derive(Serialize, Deserialize, Clone)] pub struct LogFragment { pub colour: RGB, diff --git a/src/gamesystem.rs b/src/gamesystem.rs index 130a02c..6644723 100644 --- a/src/gamesystem.rs +++ b/src/gamesystem.rs @@ -2,7 +2,7 @@ use super::{ Skill, Skills }; use crate::gui::{ Ancestry, Class }; use crate::data::entity; use crate::data::char_create::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use std::cmp::max; /// Returns the attribute bonus for a given attribute score, where every 2 points above @@ -12,13 +12,13 @@ pub fn attr_bonus(value: i32) -> i32 { } /// Returns the number of HP gained per level for a given constitution score. -pub fn hp_per_level(rng: &mut rltk::RandomNumberGenerator, constitution: i32) -> i32 { +pub fn hp_per_level(rng: &mut RandomNumberGenerator, constitution: i32) -> i32 { return max(rng.roll_dice(1, entity::STANDARD_HIT_DIE) + attr_bonus(constitution), 1); } #[allow(dead_code)] /// Returns a total HP roll for a player, based on a given constitution score and level. -pub fn player_hp_at_level(rng: &mut rltk::RandomNumberGenerator, constitution: i32, level: i32) -> i32 { +pub fn player_hp_at_level(rng: &mut RandomNumberGenerator, constitution: i32, level: i32) -> i32 { let mut total = entity::STANDARD_HIT_DIE + attr_bonus(constitution); for _i in 0..level { total += hp_per_level(rng, constitution); @@ -27,7 +27,7 @@ pub fn player_hp_at_level(rng: &mut rltk::RandomNumberGenerator, constitution: i } /// Returns a total HP roll for an NPC, based on a given constitution score and level. -pub fn npc_hp_at_level(rng: &mut rltk::RandomNumberGenerator, constitution: i32, level: i32) -> i32 { +pub fn npc_hp_at_level(rng: &mut RandomNumberGenerator, constitution: i32, level: i32) -> i32 { if level == 0 { return rng.roll_dice(1, entity::STANDARD_HIT_DIE_0); } @@ -39,12 +39,12 @@ pub fn npc_hp_at_level(rng: &mut rltk::RandomNumberGenerator, constitution: i32, } /// Returns the number of mana gained per level for a given intelligence score. -pub fn mana_per_level(rng: &mut rltk::RandomNumberGenerator, intelligence: i32) -> i32 { +pub fn mana_per_level(rng: &mut RandomNumberGenerator, intelligence: i32) -> i32 { return max(rng.roll_dice(1, entity::STANDARD_MANA_DIE) + attr_bonus(intelligence), 1); } /// Returns the number of mana gained per level for a given intelligence score. -pub fn mana_at_level(rng: &mut rltk::RandomNumberGenerator, intelligence: i32, level: i32) -> i32 { +pub fn mana_at_level(rng: &mut RandomNumberGenerator, intelligence: i32, level: i32) -> i32 { let mut total = entity::MINIMUM_MANA; for _i in 0..level { total += mana_per_level(rng, intelligence); @@ -63,7 +63,7 @@ pub fn skill_bonus(skill: Skill, skills: &Skills) -> i32 { /// Roll 4d6 and drop the lowest, for rolling d20-style stats #[allow(unused)] -pub fn roll_4d6(rng: &mut rltk::RandomNumberGenerator) -> i32 { +pub fn roll_4d6(rng: &mut RandomNumberGenerator) -> i32 { let mut rolls: Vec = Vec::new(); for _i in 0..4 { rolls.push(rng.roll_dice(1, 6)); diff --git a/src/gui/character_creation.rs b/src/gui/character_creation.rs index c198b92..d95d978 100644 --- a/src/gui/character_creation.rs +++ b/src/gui/character_creation.rs @@ -24,7 +24,7 @@ use crate::{ Telepath, BUC, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use serde::{ Deserialize, Serialize }; use specs::prelude::*; use std::collections::HashMap; @@ -119,7 +119,7 @@ pub fn character_creation(gs: &mut State, ctx: &mut Rltk) -> CharCreateResult { let mut y = 11; let column_width = 20; - ctx.print_color(x, y, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK), CHAR_CREATE_HEADER); + ctx.print_color(x, y, RGB::named(WHITE), RGB::named(BLACK), CHAR_CREATE_HEADER); y += 2; if let RunState::CharacterCreation { ancestry, class } = *runstate { @@ -271,9 +271,9 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { Ancestry::Dwarf => { renderables .insert(*player, Renderable { - glyph: rltk::to_cp437(DWARF_GLYPH), + glyph: to_cp437(DWARF_GLYPH), fg: RGB::named(DWARF_COLOUR), - bg: RGB::named(rltk::BLACK), + bg: RGB::named(BLACK), render_order: 0, }) .expect("Unable to insert renderable component"); @@ -282,9 +282,9 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { Ancestry::Elf => { renderables .insert(*player, Renderable { - glyph: rltk::to_cp437(ELF_GLYPH), + glyph: to_cp437(ELF_GLYPH), fg: RGB::named(ELF_COLOUR), - bg: RGB::named(rltk::BLACK), + bg: RGB::named(BLACK), render_order: 0, }) .expect("Unable to insert renderable component"); @@ -307,9 +307,9 @@ pub fn setup_player_ancestry(ecs: &mut World, ancestry: Ancestry) { Ancestry::Catfolk => { renderables .insert(*player, Renderable { - glyph: rltk::to_cp437(CATFOLK_GLYPH), + glyph: to_cp437(CATFOLK_GLYPH), fg: RGB::named(CATFOLK_COLOUR), - bg: RGB::named(rltk::BLACK), + bg: RGB::named(BLACK), render_order: 0, }) .expect("Unable to insert renderable component"); @@ -453,11 +453,11 @@ fn pick_random_table_item( rng: &mut RandomNumberGenerator, push_to: &mut Vec, table: &'static str, - dice: &'static str, + dice_str: &'static str, difficulty: Option ) { - let (n, d, m) = raws::parse_dice_string(dice); - for _i in 0..rng.roll_dice(n, d) + m { + let dice = parse_dice_string(dice_str).expect("Error parsing dice"); + for _i in 0..rng.roll_dice(dice.n_dice, dice.die_type) + dice.bonus { push_to.push(raws::table_by_name(&raws::RAWS.lock().unwrap(), table, difficulty).roll(rng)); } } diff --git a/src/gui/cheat_menu.rs b/src/gui/cheat_menu.rs index 6831d9c..eae6f4c 100644 --- a/src/gui/cheat_menu.rs +++ b/src/gui/cheat_menu.rs @@ -1,5 +1,5 @@ use super::State; -use rltk::prelude::*; +use bracket_lib::prelude::*; #[derive(PartialEq, Copy, Clone)] pub enum CheatMenuResult { @@ -12,13 +12,13 @@ pub enum CheatMenuResult { GodMode, } -pub fn show_cheat_menu(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult { +pub fn show_cheat_menu(_gs: &mut State, ctx: &mut BTerm) -> CheatMenuResult { let (x_offset, y_offset) = (1, 10); ctx.print_color( 1 + x_offset, 1 + y_offset, - RGB::named(rltk::RED), - RGB::named(rltk::BLACK), + RGB::named(RED), + RGB::named(BLACK), "DEBUG MENU! [aA-zZ][Esc.]" ); let x = 1 + x_offset; @@ -26,26 +26,26 @@ pub fn show_cheat_menu(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult { let count = 5; let width = 19; - ctx.draw_box(x, y, width, (count + 1) as i32, RGB::named(rltk::RED), RGB::named(rltk::BLACK)); + ctx.draw_box(x, y, width, (count + 1) as i32, RGB::named(RED), RGB::named(BLACK)); y += 1; // Asc - ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('a')); + ctx.set(x_offset + 2, y, RGB::named(YELLOW), RGB::named(BLACK), to_cp437('a')); ctx.print(x_offset + 4, y, "ASCEND A FLOOR"); y += 1; // Desc - ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('d')); + ctx.set(x_offset + 2, y, RGB::named(YELLOW), RGB::named(BLACK), to_cp437('d')); ctx.print(x_offset + 4, y, "DESCEND A FLOOR"); y += 1; // Heal - ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('h')); + ctx.set(x_offset + 2, y, RGB::named(YELLOW), RGB::named(BLACK), to_cp437('h')); ctx.print(x_offset + 4, y, "HEAL TO FULL"); y += 1; // Reveal map - ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('m')); + ctx.set(x_offset + 2, y, RGB::named(YELLOW), RGB::named(BLACK), to_cp437('m')); ctx.print(x_offset + 4, y, "MAGIC MAP REVEAL"); y += 1; // Godmode - ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('g')); + ctx.set(x_offset + 2, y, RGB::named(YELLOW), RGB::named(BLACK), to_cp437('g')); ctx.print(x_offset + 4, y, "GOD MODE"); // Match keys match ctx.key { diff --git a/src/gui/farlook.rs b/src/gui/farlook.rs index 2c232df..69a9c7e 100644 --- a/src/gui/farlook.rs +++ b/src/gui/farlook.rs @@ -1,5 +1,5 @@ use super::{ State, RunState, tooltip::draw_tooltips, camera::get_screen_bounds }; -use rltk::prelude::*; +use bracket_lib::prelude::*; #[derive(PartialEq, Copy, Clone)] pub enum FarlookResult { @@ -10,7 +10,7 @@ pub enum FarlookResult { Cancel, } -pub fn show_farlook(gs: &mut State, ctx: &mut Rltk) -> FarlookResult { +pub fn show_farlook(gs: &mut State, ctx: &mut BTerm) -> FarlookResult { let runstate = gs.ecs.fetch::(); let (_min_x, _max_x, _min_y, _max_y, x_offset, y_offset) = get_screen_bounds(&gs.ecs, ctx); @@ -27,7 +27,7 @@ pub fn show_farlook(gs: &mut State, ctx: &mut Rltk) -> FarlookResult { let x = x.clamp(x_offset, x_offset - 1 + (screen_x as i32)); let y = y.clamp(y_offset, y_offset - 1 + (screen_y as i32)); - ctx.set(x, y, RGB::named(WHITE), RGB::named(BLACK), rltk::to_cp437('X')); + ctx.set(x, y, RGB::named(WHITE), RGB::named(BLACK), to_cp437('X')); draw_tooltips(&gs.ecs, ctx, Some((x, y))); return match ctx.key { diff --git a/src/gui/identify_menu.rs b/src/gui/identify_menu.rs index b8f7bed..14e0686 100644 --- a/src/gui/identify_menu.rs +++ b/src/gui/identify_menu.rs @@ -21,12 +21,12 @@ use crate::{ Renderable, states::state::*, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::BTreeMap; /// Handles the Identify menu. -pub fn identify(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option) { +pub fn identify(gs: &mut State, ctx: &mut BTerm) -> (ItemMenuResult, Option) { let player_entity = gs.ecs.fetch::(); let equipped = gs.ecs.read_storage::(); let backpack = gs.ecs.read_storage::(); @@ -58,7 +58,8 @@ pub fn identify(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option (ItemMenuResult, Option().get(entity) { + let beatitude_status = if + let Some(beatitude) = gs.ecs.read_storage::().get(entity) + { match beatitude.buc { BUC::Blessed => 1, BUC::Uncursed => 2, @@ -125,8 +128,8 @@ pub fn identify(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option (ItemMenuResult, Option (ItemMenuResult::Cancel, None), _ => { - let selection = rltk::letter_to_option(key); + let selection = letter_to_option(key); if selection > -1 && selection < (count as i32) { let item = player_inventory .iter() diff --git a/src/gui/letter_to_option.rs b/src/gui/letter_to_option.rs index a346bff..8b32109 100644 --- a/src/gui/letter_to_option.rs +++ b/src/gui/letter_to_option.rs @@ -1,4 +1,4 @@ -use rltk::prelude::*; +use bracket_lib::prelude::*; pub fn letter_to_option(key: VirtualKeyCode, shift: bool) -> i32 { if shift { diff --git a/src/gui/mod.rs b/src/gui/mod.rs index 5359344..86e8ddd 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -62,9 +62,9 @@ pub use farlook::*; /// Gives a popup box with a message and a title, and waits for a keypress. #[allow(unused)] -pub fn yes_no(ctx: &mut Rltk, question: String) -> Option { - ctx.print_color_centered(15, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), question); - ctx.print_color_centered(17, RGB::named(rltk::CYAN), RGB::named(rltk::BLACK), "(y)es or (n)o"); +pub fn yes_no(ctx: &mut BTerm, question: String) -> Option { + ctx.print_color_centered(15, RGB::named(YELLOW), RGB::named(BLACK), question); + ctx.print_color_centered(17, RGB::named(CYAN), RGB::named(BLACK), "(y)es or (n)o"); match ctx.key { None => None, Some(key) => @@ -77,7 +77,7 @@ pub fn yes_no(ctx: &mut Rltk, question: String) -> Option { } pub fn draw_lerping_bar( - ctx: &mut Rltk, + ctx: &mut BTerm, sx: i32, sy: i32, width: i32, @@ -181,8 +181,8 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { ctx.print_color( 26 * TEXT_FONT_MOD, 54, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), + RGB::named(WHITE), + RGB::named(BLACK), format!("XP{}/{}", stats.level, stats.xp) ); // Draw attributes @@ -327,7 +327,7 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { } // Draw equipment let renderables = ecs.read_storage::(); - let mut equipment: Vec<(String, RGB, RGB, rltk::FontCharType)> = Vec::new(); + let mut equipment: Vec<(String, RGB, RGB, FontCharType)> = Vec::new(); let entities = ecs.entities(); for (entity, _equipped, renderable) in (&entities, &equipped, &renderables) .join() @@ -472,7 +472,7 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { let (render_fg, glyph) = if let Some(renderable) = renderables.get(entity) { (renderable.fg, renderable.glyph) } else { - (RGB::named(rltk::WHITE), rltk::to_cp437('-')) + (RGB::named(WHITE), to_cp437('-')) }; seen_entities.push(( obfuscate_name_ecs(ecs, entity).0, @@ -587,7 +587,7 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { pub fn get_input_direction( ecs: &mut World, - ctx: &mut Rltk, + ctx: &mut BTerm, function: fn(i: i32, j: i32, ecs: &mut World) -> RunState ) -> RunState { let (_, _, _, _, x_offset, y_offset) = camera::get_screen_bounds(ecs, ctx); @@ -595,8 +595,8 @@ pub fn get_input_direction( ctx.print_color( 1 + x_offset, 1 + y_offset, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), + RGB::named(WHITE), + RGB::named(BLACK), "In what direction? [0-9]/[YUHJKLBN]" ); match ctx.key { @@ -681,14 +681,14 @@ pub fn print_options( x += 2; let fg = RGB::from_u8(item.renderables.0, item.renderables.1, item.renderables.2); - ctx.set(x, y, fg, RGB::named(rltk::BLACK), item.glyph); + ctx.set(x, y, fg, RGB::named(BLACK), item.glyph); x += 2; let fg = RGB::from_u8(item.rgb.0, item.rgb.1, item.rgb.2); if item_count > &1 { // If more than one, print the number and pluralise // i.e. (a) 3 daggers - ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), item_count); + ctx.print_color(x, y, fg, RGB::named(BLACK), item_count); x += 2; ctx.print_color( x, @@ -701,7 +701,7 @@ pub fn print_options( width = if width > this_width { width } else { this_width }; } else { if item.display_name.singular.to_lowercase().ends_with("s") { - ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "some"); + ctx.print_color(x, y, fg, RGB::named(BLACK), "some"); x += 5; } else if ['a', 'e', 'i', 'o', 'u'] @@ -710,12 +710,12 @@ pub fn print_options( { // If one and starts with a vowel, print 'an' // i.e. (a) an apple - ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "an"); + ctx.print_color(x, y, fg, RGB::named(BLACK), "an"); x += 3; } else { // If one and not a vowel, print 'a' // i.e. (a) a dagger - ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "a"); + ctx.print_color(x, y, fg, RGB::named(BLACK), "a"); x += 2; } ctx.print_color( @@ -951,7 +951,7 @@ pub fn item_colour(item: Entity, beatitudes: &ReadStorage) -> (u8, u8 return WHITE; } -pub fn show_help(ctx: &mut Rltk) -> YesNoResult { +pub fn show_help(ctx: &mut BTerm) -> YesNoResult { let mut x = 3; let mut y = 12; let height = 22; @@ -967,7 +967,7 @@ pub fn show_help(ctx: &mut Rltk) -> YesNoResult { ); x += 2; y += 2; - ctx.print_color(x, y, RGB::named(rltk::GREEN), RGB::named(rltk::BLACK), "MOVE COMMANDS"); + ctx.print_color(x, y, RGB::named(GREEN), RGB::named(BLACK), "MOVE COMMANDS"); y += 2; ctx.print(x, y, "y k u 7 8 9 > down"); ctx.print(x, y + 1, " \\|/ \\|/"); @@ -975,7 +975,7 @@ pub fn show_help(ctx: &mut Rltk) -> YesNoResult { ctx.print(x, y + 3, " /|\\ /|\\"); ctx.print(x, y + 4, "b j n 1 2 3 . wait"); y += 7; - ctx.print_color(x, y, RGB::named(rltk::GREEN), RGB::named(rltk::BLACK), "OBJECT INTERACTION"); + ctx.print_color(x, y, RGB::named(GREEN), RGB::named(BLACK), "OBJECT INTERACTION"); y += 2; ctx.print(x, y, "g get d drop"); y += 1; @@ -985,7 +985,7 @@ pub fn show_help(ctx: &mut Rltk) -> YesNoResult { y += 1; ctx.print(x, y, "f force x farlook"); y += 2; - ctx.print_color(x, y, RGB::named(rltk::GREEN), RGB::named(rltk::BLACK), "MOUSE CONTROL"); + ctx.print_color(x, y, RGB::named(GREEN), RGB::named(BLACK), "MOUSE CONTROL"); y += 2; ctx.print(x, y, "hover for tooltips"); @@ -1139,7 +1139,7 @@ pub fn show_inventory(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option } } -pub fn drop_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option) { +pub fn drop_item_menu(gs: &mut State, ctx: &mut BTerm) -> (ItemMenuResult, Option) { let player_inventory = get_player_inventory(&gs.ecs); let count = player_inventory.len(); @@ -1179,7 +1179,7 @@ pub fn drop_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option match key { VirtualKeyCode::Escape => (ItemMenuResult::Cancel, None), _ => { - let selection = rltk::letter_to_option(key); + let selection = letter_to_option(key); if selection > -1 && selection < (count as i32) { if on_overmap { gamelog::Logger @@ -1204,7 +1204,7 @@ pub fn drop_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option } } -pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option) { +pub fn remove_item_menu(gs: &mut State, ctx: &mut BTerm) -> (ItemMenuResult, Option) { let player_entity = gs.ecs.fetch::(); let backpack = gs.ecs.read_storage::(); let entities = gs.ecs.entities(); @@ -1216,8 +1216,8 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti ctx.print_color( 1 + x_offset, 1 + y_offset, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), + RGB::named(WHITE), + RGB::named(BLACK), "Unequip what? [aA-zZ][Esc.]" ); @@ -1235,7 +1235,7 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti let x = 1 + x_offset; let mut y = 3 + y_offset; - ctx.draw_box(x, y, width, (count + 1) as i32, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK)); + ctx.draw_box(x, y, width, (count + 1) as i32, RGB::named(WHITE), RGB::named(BLACK)); y += 1; let mut j = 0; @@ -1244,7 +1244,7 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti let (mut fg, glyph) = if let Some(renderable) = renderables.get(*e) { (renderable.fg, renderable.glyph) } else { - (RGB::named(rltk::WHITE), rltk::to_cp437('-')) + (RGB::named(WHITE), to_cp437('-')) }; ctx.set( x + 1, @@ -1255,7 +1255,7 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti ); ctx.set(x + 3, y, fg, RGB::named(rltk::BLACK), glyph); fg = RGB::named(item_colour_ecs(&gs.ecs, *e)); - ctx.print_color(x + 5, y, fg, RGB::named(rltk::BLACK), name); + ctx.print_color(x + 5, y, fg, RGB::named(BLACK), name); y += 1; j += 1; } @@ -1266,7 +1266,7 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti match key { VirtualKeyCode::Escape => (ItemMenuResult::Cancel, None), _ => { - let selection = rltk::letter_to_option(key); + let selection = letter_to_option(key); if selection > -1 && selection < (count as i32) { return (ItemMenuResult::Selected, Some(equippable[selection as usize].0)); } @@ -1288,7 +1288,7 @@ pub enum TargetResult { pub fn ranged_target( gs: &mut State, - ctx: &mut Rltk, + ctx: &mut BTerm, x: i32, y: i32, range: i32, @@ -1302,8 +1302,8 @@ pub fn ranged_target( ctx.print_color( 1 + x_offset, 1 + y_offset, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), + RGB::named(WHITE), + RGB::named(BLACK), "Targeting which tile? [mouse input]" ); @@ -1313,7 +1313,7 @@ pub fn ranged_target( if let Some(visible) = visible { // We have a viewshed for idx in visible.visible_tiles.iter() { - let distance = rltk::DistanceAlg::Pythagoras.distance2d(*player_pos, *idx); + let distance = DistanceAlg::Pythagoras.distance2d(*player_pos, *idx); if distance <= (range as f32) { let screen_x = idx.x - min_x; let screen_y = idx.y - min_y; @@ -1354,7 +1354,7 @@ pub fn ranged_target( } let mut result = (TargetResult::NoResponse { x, y }, None); if valid_target { - let path = rltk::line2d( + let path = line2d( LineAlg::Bresenham, Point::new(player_pos.x, player_pos.y), Point::new(mouse_pos_adjusted.0, mouse_pos_adjusted.1) @@ -1374,7 +1374,7 @@ pub fn ranged_target( if aoe > 0 { // We adjust for camera position when getting FOV, but then we need to adjust back // when iterating through the tiles themselves, by taking away min_x/min_y. - let mut blast_tiles = rltk::field_of_view( + let mut blast_tiles = field_of_view( Point::new(mouse_pos_adjusted.0, mouse_pos_adjusted.1), aoe, &*map @@ -1411,7 +1411,7 @@ pub fn ranged_target( } }; } else { - ctx.set_bg(mouse_pos.0, mouse_pos.1, RGB::named(rltk::RED)); + ctx.set_bg(mouse_pos.0, mouse_pos.1, RGB::named(RED)); } result = match ctx.key { @@ -1450,7 +1450,7 @@ pub enum MainMenuResult { }, } -pub fn main_menu(gs: &mut State, ctx: &mut Rltk) -> MainMenuResult { +pub fn main_menu(gs: &mut State, ctx: &mut BTerm) -> MainMenuResult { let save_exists = super::saveload_system::does_save_exist(); let runstate = gs.ecs.fetch::(); let assets = gs.ecs.fetch::(); @@ -1464,8 +1464,8 @@ pub fn main_menu(gs: &mut State, ctx: &mut Rltk) -> MainMenuResult { height -= 1; } - ctx.draw_box_double(x, y - 4, 13, height, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK)); - ctx.print_color(x + 3, y - 2, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "RUST-RL!"); + ctx.draw_box_double(x, y - 4, 13, height, RGB::named(WHITE), RGB::named(BLACK)); + ctx.print_color(x + 3, y - 2, RGB::named(YELLOW), RGB::named(BLACK), "RUST-RL!"); if let RunState::MainMenu { menu_selection: selection } = *runstate { if save_exists { @@ -1491,19 +1491,19 @@ pub fn main_menu(gs: &mut State, ctx: &mut Rltk) -> MainMenuResult { y += 1; } if selection == MainMenuSelection::NewGame { - ctx.print_color(x + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "["); - ctx.print_color(x + 3, y, RGB::named(rltk::GREEN), RGB::named(rltk::BLACK), "new game"); - ctx.print_color(x + 11, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "]"); + ctx.print_color(x + 2, y, RGB::named(YELLOW), RGB::named(BLACK), "["); + ctx.print_color(x + 3, y, RGB::named(GREEN), RGB::named(BLACK), "new game"); + ctx.print_color(x + 11, y, RGB::named(YELLOW), RGB::named(BLACK), "]"); } else { - ctx.print_color(x + 3, y, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK), "new game"); + ctx.print_color(x + 3, y, RGB::named(WHITE), RGB::named(BLACK), "new game"); } y += 1; if selection == MainMenuSelection::Quit { - ctx.print_color(x + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "["); - ctx.print_color(x + 3, y, RGB::named(rltk::GREEN), RGB::named(rltk::BLACK), "goodbye!"); - ctx.print_color(x + 11, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "]"); + ctx.print_color(x + 2, y, RGB::named(YELLOW), RGB::named(BLACK), "["); + ctx.print_color(x + 3, y, RGB::named(GREEN), RGB::named(BLACK), "goodbye!"); + ctx.print_color(x + 11, y, RGB::named(YELLOW), RGB::named(BLACK), "]"); } else { - ctx.print_color(x + 5, y, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK), "quit"); + ctx.print_color(x + 5, y, RGB::named(WHITE), RGB::named(BLACK), "quit"); } match ctx.key { @@ -1578,18 +1578,18 @@ pub enum YesNoResult { No, } -pub fn game_over(ctx: &mut Rltk) -> YesNoResult { +pub fn game_over(ctx: &mut BTerm) -> YesNoResult { let mut x = 3; let mut y = 12; let width = 45; let height = 20; - ctx.draw_box(x, y, width, height, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK)); - ctx.print_color(x + 3, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "You died!"); + ctx.draw_box(x, y, width, height, RGB::named(WHITE), RGB::named(BLACK)); + ctx.print_color(x + 3, y, RGB::named(YELLOW), RGB::named(BLACK), "You died!"); ctx.print_color( x + 3, y + height, - RGB::named(rltk::YELLOW), - RGB::named(rltk::BLACK), + RGB::named(YELLOW), + RGB::named(BLACK), " Write a morgue file? [y/n] " ); x += 2; @@ -1597,8 +1597,8 @@ pub fn game_over(ctx: &mut Rltk) -> YesNoResult { ctx.print_color( x, y, - RGB::named(rltk::GREEN), - RGB::named(rltk::BLACK), + RGB::named(GREEN), + RGB::named(BLACK), format!("You survived for {} turns.", crate::gamelog::get_event_count(EVENT::COUNT_TURN)) ); y += 2; @@ -1627,8 +1627,8 @@ pub fn game_over(ctx: &mut Rltk) -> YesNoResult { ctx.print_color( x + 1, y, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), + RGB::named(WHITE), + RGB::named(BLACK), format!( "- kicked {} time(s), breaking {} object(s)", crate::gamelog::get_event_count(EVENT::COUNT_KICK), diff --git a/src/gui/remove_curse_menu.rs b/src/gui/remove_curse_menu.rs index d5dbb7e..f8d1f14 100644 --- a/src/gui/remove_curse_menu.rs +++ b/src/gui/remove_curse_menu.rs @@ -7,13 +7,24 @@ use super::{ ItemMenuResult, UniqueInventoryItem, }; -use crate::{ gamelog, Beatitude, Entity, Equipped, InBackpack, Item, Name, Renderable, states::state::*, BUC }; -use rltk::prelude::*; +use crate::{ + gamelog, + Beatitude, + Entity, + Equipped, + InBackpack, + Item, + Name, + Renderable, + states::state::*, + BUC, +}; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::BTreeMap; /// Handles the Remove Curse menu. -pub fn remove_curse(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option) { +pub fn remove_curse(gs: &mut State, ctx: &mut BTerm) -> (ItemMenuResult, Option) { let player_entity = gs.ecs.fetch::(); let equipped = gs.ecs.read_storage::(); let backpack = gs.ecs.read_storage::(); @@ -24,33 +35,35 @@ pub fn remove_curse(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option(); let build_cursed_iterator = || { - (&entities, &items, &beatitudes, &renderables, &names).join().filter(|(item_entity, _i, b, _r, _n)| { - // Set all items to FALSE initially. - let mut keep = false; - // If found in the player's backpack, set to TRUE - if let Some(bp) = backpack.get(*item_entity) { - if bp.owner == *player_entity { - keep = true; + (&entities, &items, &beatitudes, &renderables, &names) + .join() + .filter(|(item_entity, _i, b, _r, _n)| { + // Set all items to FALSE initially. + let mut keep = false; + // If found in the player's backpack, set to TRUE + if let Some(bp) = backpack.get(*item_entity) { + if bp.owner == *player_entity { + keep = true; + } } - } - // If found in the player's equipslot, set to TRUE - if let Some(equip) = equipped.get(*item_entity) { - if equip.owner == *player_entity { - keep = true; + // If found in the player's equipslot, set to TRUE + if let Some(equip) = equipped.get(*item_entity) { + if equip.owner == *player_entity { + keep = true; + } } - } - // If it's not OUR item, RETURN FALSE. - if !keep { - return false; - } - // If it's identified as noncursed, RETURN FALSE. - if b.known && b.buc != BUC::Cursed { - return false; - } - // Otherwise, return: returns any items that are unidentified, - // or identified as being cursed. - return true; - }) + // If it's not OUR item, RETURN FALSE. + if !keep { + return false; + } + // If it's identified as noncursed, RETURN FALSE. + if b.known && b.buc != BUC::Cursed { + return false; + } + // Otherwise, return: returns any items that are unidentified, + // or identified as being cursed. + return true; + }) }; // Build list of items to display @@ -76,7 +89,9 @@ pub fn remove_curse(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option().get(entity) { + let beatitude_status = if + let Some(beatitude) = gs.ecs.read_storage::().get(entity) + { match beatitude.buc { BUC::Blessed => 1, BUC::Uncursed => 2, @@ -108,8 +123,8 @@ pub fn remove_curse(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option (ItemMenuResult, Option (ItemMenuResult::Cancel, None), _ => { - let selection = rltk::letter_to_option(key); + let selection = letter_to_option(key); if selection > -1 && selection < (count as i32) { let item = player_inventory .iter() diff --git a/src/gui/tooltip.rs b/src/gui/tooltip.rs index acd1d78..aabe0c4 100644 --- a/src/gui/tooltip.rs +++ b/src/gui/tooltip.rs @@ -7,13 +7,12 @@ use super::{ Pools, Position, Renderable, - Rltk, World, RGB, }; use crate::TileType; use crate::data::ids::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; struct Tooltip { @@ -63,7 +62,7 @@ impl Tooltip { } #[rustfmt::skip] -pub fn draw_tooltips(ecs: &World, ctx: &mut Rltk, xy: Option<(i32, i32)>) { +pub fn draw_tooltips(ecs: &World, ctx: &mut BTerm, xy: Option<(i32, i32)>) { let (min_x, _max_x, min_y, _max_y, x_offset, y_offset) = get_screen_bounds(ecs, ctx); let map = ecs.fetch::(); let names = ecs.read_storage::(); @@ -164,7 +163,7 @@ pub fn draw_tooltips(ecs: &World, ctx: &mut Rltk, xy: Option<(i32, i32)>) { if tooltips.is_empty() { return ; } - let white = RGB::named(rltk::WHITE); + let white = RGB::named(WHITE); let arrow; let arrow_x; diff --git a/src/hunger_system.rs b/src/hunger_system.rs index 7670554..7a1b0fd 100644 --- a/src/hunger_system.rs +++ b/src/hunger_system.rs @@ -1,5 +1,14 @@ -use super::{ effects::{ add_effect, EffectType, Targets }, gamelog, Clock, HungerClock, HungerState, TakingTurn }; -use rltk::prelude::*; +use super::{ + effects::{ add_effect, EffectType, Targets }, + gamelog, + Clock, + HungerClock, + HungerState, + TakingTurn, + DamageType, + Intrinsics, +}; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::config::CONFIG; @@ -45,10 +54,11 @@ impl<'a> System<'a> for HungerSystem { ReadExpect<'a, Entity>, ReadStorage<'a, Clock>, ReadStorage<'a, TakingTurn>, + ReadStorage<'a, Intrinsics>, ); fn run(&mut self, data: Self::SystemData) { - let (entities, mut hunger_clock, player_entity, turn_clock, turns) = data; + let (entities, mut hunger_clock, player_entity, turn_clock, turns, intrinsics) = data; // If the turn clock isn't taking a turn this tick, don't bother ticking hunger. let mut ticked = false; @@ -64,16 +74,32 @@ impl<'a> System<'a> for HungerSystem { if hunger_clock.duration >= MAX_SATIATION { hunger_clock.duration = MAX_SATIATION; } else { - hunger_clock.duration -= BASE_CLOCK_DECREMENT_PER_TURN; + let mut modifier = 0; + let intrinsic_regen = if let Some(i) = intrinsics.get(entity) { + i.list.contains(&crate::Intrinsic::Regeneration) + } else { + false + }; + if intrinsic_regen { + modifier += 1; + } + hunger_clock.duration -= BASE_CLOCK_DECREMENT_PER_TURN + modifier; } let initial_state = hunger_clock.state; hunger_clock.state = get_hunger_state(hunger_clock.duration); if hunger_clock.state == HungerState::Starving { - add_effect(None, EffectType::Damage { amount: 1 }, Targets::Entity { target: entity }); + add_effect( + None, + EffectType::Damage { amount: 1, damage_type: DamageType::Forced }, + Targets::Entity { target: entity } + ); } if CONFIG.logging.log_ticks && entity == *player_entity { - rltk::console::log( - format!("HUNGER SYSTEM: Ticked for player entity. [clock: {}]", hunger_clock.duration) + console::log( + format!( + "HUNGER SYSTEM: Ticked for player entity. [clock: {}]", + hunger_clock.duration + ) ); } if hunger_clock.state == initial_state { diff --git a/src/inventory/collection_system.rs b/src/inventory/collection_system.rs index 0b8b288..2fb7276 100644 --- a/src/inventory/collection_system.rs +++ b/src/inventory/collection_system.rs @@ -12,10 +12,10 @@ use crate::{ ObfuscatedName, Position, WantsToPickupItem, - Renderable, }; use specs::prelude::*; use crate::data::messages; +use bracket_lib::prelude::*; pub struct ItemCollectionSystem {} @@ -52,7 +52,9 @@ impl<'a> System<'a> for ItemCollectionSystem { for pickup in wants_pickup.join() { positions.remove(pickup.item); - backpack.insert(pickup.item, InBackpack { owner: pickup.collected_by }).expect("Unable to pickup item."); + backpack + .insert(pickup.item, InBackpack { owner: pickup.collected_by }) + .expect("Unable to pickup item."); equipment_changed .insert(pickup.collected_by, EquipmentChanged {}) .expect("Unable to insert EquipmentChanged."); @@ -76,7 +78,7 @@ impl<'a> System<'a> for ItemCollectionSystem { ).0 ) ) - .colour(rltk::WHITE) + .colour(WHITE) .period() .log(); } diff --git a/src/inventory/drop_system.rs b/src/inventory/drop_system.rs index 2722c60..34084b4 100644 --- a/src/inventory/drop_system.rs +++ b/src/inventory/drop_system.rs @@ -15,6 +15,7 @@ use crate::{ }; use specs::prelude::*; use crate::data::messages; +use bracket_lib::prelude::*; pub struct ItemDropSystem {} @@ -52,7 +53,9 @@ impl<'a> System<'a> for ItemDropSystem { ) = data; for (entity, to_drop) in (&entities, &wants_drop).join() { - equipment_changed.insert(entity, EquipmentChanged {}).expect("Unable to insert EquipmentChanged."); + equipment_changed + .insert(entity, EquipmentChanged {}) + .expect("Unable to insert EquipmentChanged."); let mut dropper_pos: Position = Position { x: 0, y: 0 }; { let dropped_pos = positions.get(entity).unwrap(); @@ -83,7 +86,7 @@ impl<'a> System<'a> for ItemDropSystem { ).0 ) ) - .colour(rltk::WHITE) + .colour(WHITE) .period() .log(); } diff --git a/src/inventory/equip_system.rs b/src/inventory/equip_system.rs index 1d52c1d..e21db20 100644 --- a/src/inventory/equip_system.rs +++ b/src/inventory/equip_system.rs @@ -17,6 +17,7 @@ use crate::{ }; use specs::prelude::*; use crate::data::messages; +use bracket_lib::prelude::*; pub struct ItemEquipSystem {} @@ -66,7 +67,11 @@ impl<'a> System<'a> for ItemEquipSystem { // Remove any items target has in item's slot let mut can_equip = true; let mut to_unequip: Vec = Vec::new(); - for (item_entity, already_equipped, _name) in (&entities, &equipped, &names).join() { + for (item_entity, already_equipped, _name) in ( + &entities, + &equipped, + &names, + ).join() { if already_equipped.owner == target && already_equipped.slot == target_slot { if let Some(beatitude) = beatitudes.get(item_entity) { if beatitude.buc == BUC::Cursed { @@ -85,7 +90,7 @@ impl<'a> System<'a> for ItemEquipSystem { None ).0 ) - .colour(rltk::WHITE) + .colour(WHITE) .append("!"); identified_beatitude .insert(item_entity, IdentifiedBeatitude {}) @@ -101,15 +106,25 @@ impl<'a> System<'a> for ItemEquipSystem { } for item in to_unequip.iter() { equipped.remove(*item); - backpack.insert(*item, InBackpack { owner: target }).expect("Unable to insert backpack"); + backpack + .insert(*item, InBackpack { owner: target }) + .expect("Unable to insert backpack"); if target == *player_entity { logger = logger .append(messages::YOU_REMOVE_ITEM) .colour(item_colour(*item, &beatitudes)) .append_n( - obfuscate_name(*item, &names, &magic_items, &obfuscated_names, &beatitudes, &dm, None).0 + obfuscate_name( + *item, + &names, + &magic_items, + &obfuscated_names, + &beatitudes, + &dm, + None + ).0 ) - .colour(rltk::WHITE) + .colour(WHITE) .period(); } } @@ -134,7 +149,7 @@ impl<'a> System<'a> for ItemEquipSystem { None ).0 ) - .colour(rltk::WHITE) + .colour(WHITE) .period(); logger.log(); identified_items diff --git a/src/inventory/identification_system.rs b/src/inventory/identification_system.rs index 3fbe579..ce4ad23 100644 --- a/src/inventory/identification_system.rs +++ b/src/inventory/identification_system.rs @@ -1,4 +1,13 @@ -use crate::{ Beatitude, IdentifiedBeatitude, IdentifiedItem, Item, MasterDungeonMap, Name, ObfuscatedName, Player }; +use crate::{ + Beatitude, + IdentifiedBeatitude, + IdentifiedItem, + Item, + MasterDungeonMap, + Name, + ObfuscatedName, + Player, +}; use specs::prelude::*; use crate::data::events::*; use crate::gamelog; @@ -35,7 +44,7 @@ impl<'a> System<'a> for ItemIdentificationSystem { let tag = crate::raws::get_id_from_name(id.name.clone()); if !dm.identified_items.contains(&id.name) && crate::raws::is_tag_magic(&tag) { if gamelog::get_event_count(EVENT::COUNT_TURN) != 1 { - gamelog::record_event(EVENT::IDENTIFIED(id.name.clone())); + gamelog::record_event(EVENT::Identified(id.name.clone())); } dm.identified_items.insert(id.name.clone()); for (entity, _item, name) in (&entities, &items, &names).join() { diff --git a/src/inventory/remove_system.rs b/src/inventory/remove_system.rs index cbe498d..0a46bce 100644 --- a/src/inventory/remove_system.rs +++ b/src/inventory/remove_system.rs @@ -11,7 +11,7 @@ use crate::{ WantsToRemoveItem, BUC, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::data::messages; @@ -99,7 +99,9 @@ impl<'a> System<'a> for ItemRemoveSystem { .log(); } } - backpack.insert(to_remove.item, InBackpack { owner: entity }).expect("Unable to insert backpack"); + backpack + .insert(to_remove.item, InBackpack { owner: entity }) + .expect("Unable to insert backpack"); } wants_remove.clear(); diff --git a/src/lib.rs b/src/lib.rs index 100f2bc..812c7be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ // src/lib.rs // 31-Aug-2023 -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; extern crate serde; diff --git a/src/main.rs b/src/main.rs index c122e37..d04b6d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,12 @@ use rust_rl::*; use specs::prelude::*; use specs::saveload::{ SimpleMarker, SimpleMarkerAllocator }; -use rltk::prelude::*; +use bracket_lib::prelude::*; const DISPLAYWIDTH: i32 = 100; const DISPLAYHEIGHT: i32 = 56; -fn main() -> rltk::BError { +fn main() -> BError { // Embedded resources for use in wasm build const CURSES_16_16_BYTES: &[u8] = include_bytes!("../resources/curses16x16.png"); const CURSES_8_16_BYTES: &[u8] = include_bytes!("../resources/curses8x16.png"); @@ -122,6 +122,8 @@ fn main() -> rltk::BError { gs.ecs.register::(); gs.ecs.register::(); gs.ecs.register::(); + gs.ecs.register::(); + gs.ecs.register::(); gs.ecs.register::>(); gs.ecs.register::(); gs.ecs.register::(); @@ -130,11 +132,11 @@ fn main() -> rltk::BError { raws::load_raws(); // Insert calls - gs.ecs.insert(rltk::RandomNumberGenerator::new()); + gs.ecs.insert(RandomNumberGenerator::new()); gs.ecs.insert(map::MasterDungeonMap::new()); // Master map list gs.ecs.insert(Map::new(true, 1, 64, 64, 0, "New Map", "N", 0)); // Map gs.ecs.insert(Point::new(0, 0)); // Player pos - gs.ecs.insert(gui::Ancestry::Dwarf); // ancestry + gs.ecs.insert(gui::Ancestry::Human); // ancestry let player_entity = spawner::player(&mut gs.ecs, 0, 0); gs.ecs.insert(player_entity); // Player entity gs.ecs.insert(RunState::MapGeneration {}); // RunState @@ -142,8 +144,8 @@ fn main() -> rltk::BError { gs.ecs.insert(rex_assets::RexAssets::new()); gamelog::setup_log(); - gamelog::record_event(data::events::EVENT::LEVEL(1)); + gamelog::record_event(data::events::EVENT::Level(1)); gs.generate_world_map(1, TileType::Floor); - rltk::main_loop(context, gs) + main_loop(context, gs) } diff --git a/src/map/dungeon.rs b/src/map/dungeon.rs index 8d18b9a..4407efa 100644 --- a/src/map/dungeon.rs +++ b/src/map/dungeon.rs @@ -1,6 +1,6 @@ use super::{ Map, TileType }; use crate::{ gamelog, map_builders, OtherLevelPosition, Position, Telepath, Viewshed }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use serde::{ Deserialize, Serialize }; use specs::prelude::*; use std::collections::{ HashMap, HashSet }; @@ -61,7 +61,11 @@ impl MasterDungeonMap { fn make_scroll_name(rng: &mut RandomNumberGenerator) -> String { let len = 4 + rng.roll_dice(1, 6); - let space_at_i = if len > 6 && rng.roll_dice(1, 2) == 1 { rng.roll_dice(1, len - 6) + 3 } else { -1 }; + let space_at_i = if len > 6 && rng.roll_dice(1, 2) == 1 { + rng.roll_dice(1, len - 6) + 3 + } else { + -1 + }; let offset = rng.roll_dice(1, 2) - 1; let mut name = "".to_string(); for i in 0..len { @@ -142,7 +146,9 @@ const POTION_ADJECTIVES: &[&str] = &[ fn make_potion_name(rng: &mut RandomNumberGenerator, used_names: &mut HashSet) -> String { loop { let mut name: String = - POTION_ADJECTIVES[(rng.roll_dice(1, POTION_ADJECTIVES.len() as i32) as usize) - 1].to_string(); + POTION_ADJECTIVES[ + (rng.roll_dice(1, POTION_ADJECTIVES.len() as i32) as usize) - 1 + ].to_string(); name += " "; name += POTION_COLOURS[(rng.roll_dice(1, POTION_COLOURS.len() as i32) as usize) - 1]; name += " potion"; @@ -178,7 +184,8 @@ const WAND_TYPES: &[&str] = &[ fn make_wand_name(rng: &mut RandomNumberGenerator, used_names: &mut HashSet) -> String { loop { - let mut name: String = WAND_TYPES[(rng.roll_dice(1, WAND_TYPES.len() as i32) as usize) - 1].to_string(); + let mut name: String = + WAND_TYPES[(rng.roll_dice(1, WAND_TYPES.len() as i32) as usize) - 1].to_string(); name += " wand"; if !used_names.contains(&name) { @@ -227,8 +234,9 @@ fn transition_to_existing_map(ecs: &mut World, new_id: i32, dest_tile: TileType) } possible_destinations.push(((map.width * map.height) as usize) / 2); // Centre of map } - let mut rng = ecs.write_resource::(); - let idx = possible_destinations[(rng.roll_dice(1, possible_destinations.len() as i32) as usize) - 1]; + let mut rng = ecs.write_resource::(); + let idx = + possible_destinations[(rng.roll_dice(1, possible_destinations.len() as i32) as usize) - 1]; let mut player_position = ecs.write_resource::(); *player_position = Point::new((idx as i32) % w, (idx as i32) / w); let mut position_components = ecs.write_storage::(); @@ -253,7 +261,7 @@ fn transition_to_existing_map(ecs: &mut World, new_id: i32, dest_tile: TileType) } fn transition_to_new_map(ecs: &mut World, new_id: i32, _dest_tile: TileType) -> Vec { - let mut rng = ecs.write_resource::(); + let mut rng = ecs.write_resource::(); // Might need this to fallback to 1, but if player // level isn't found at all, there's a bigger concern // concern than just this function not working. @@ -346,7 +354,9 @@ pub fn thaw_entities(ecs: &mut World) { let mut pos_to_delete: Vec = Vec::new(); for (entity, pos) in (&entities, &other_positions).join() { if entity != *player_entity && pos.id == map_id { - positions.insert(entity, Position { x: pos.x, y: pos.y }).expect("Failed to insert OtherLevelPosition"); + positions + .insert(entity, Position { x: pos.x, y: pos.y }) + .expect("Failed to insert OtherLevelPosition"); pos_to_delete.push(entity); } } diff --git a/src/map/interval_spawning_system.rs b/src/map/interval_spawning_system.rs index 80e910e..b03918a 100644 --- a/src/map/interval_spawning_system.rs +++ b/src/map/interval_spawning_system.rs @@ -1,5 +1,15 @@ -use crate::{ config::CONFIG, gamelog, raws, spawner, Clock, Map, RandomNumberGenerator, TakingTurn }; +use crate::{ + config::CONFIG, + gamelog, + raws, + spawner, + Clock, + Map, + RandomNumberGenerator, + TakingTurn, +}; use specs::prelude::*; +use bracket_lib::prelude::*; use crate::data::events::*; const TRY_SPAWN_CHANCE: i32 = 70; @@ -15,7 +25,7 @@ pub fn maybe_map_message(ecs: &mut World) { { let clock = ecs.read_storage::(); let turns = ecs.read_storage::(); - let mut rng = ecs.write_resource::(); + let mut rng = ecs.write_resource::(); for (_c, _t) in (&clock, &turns).join() { if rng.roll_dice(1, FEATURE_MESSAGE_CHANCE) == 1 { maybe_message = true; @@ -42,7 +52,7 @@ pub fn try_spawn_interval(ecs: &mut World) { } let clock = ecs.read_storage::(); let turns = ecs.read_storage::(); - let mut rng = ecs.write_resource::(); + let mut rng = ecs.write_resource::(); for (_c, _t) in (&clock, &turns).join() { if rng.roll_dice(1, TRY_SPAWN_CHANCE) == 1 { try_spawn = true; @@ -51,7 +61,7 @@ pub fn try_spawn_interval(ecs: &mut World) { } if try_spawn { if CONFIG.logging.log_spawning { - rltk::console::log("SPAWNINFO: Trying spawn."); + console::log("SPAWNINFO: Trying spawn."); } spawn_random_mob_in_free_nonvisible_tile(ecs); } @@ -61,11 +71,11 @@ fn spawn_random_mob_in_free_nonvisible_tile(ecs: &mut World) { let map = ecs.fetch::(); let mut available_tiles = populate_unblocked_nonvisible(&map); let player_level = gamelog::get_event_count(EVENT::COUNT_LEVEL); - rltk::console::log(player_level); + console::log(player_level); let difficulty = (map.difficulty + player_level) / 2; if available_tiles.len() == 0 { if CONFIG.logging.log_spawning { - rltk::console::log("SPAWNINFO: No free tiles; not spawning anything.."); + console::log("SPAWNINFO: No free tiles; not spawning anything.."); } return; } @@ -84,7 +94,7 @@ fn spawn_random_mob_in_free_nonvisible_tile(ecs: &mut World) { // For every idx in the spawn list, spawn mob. for idx in spawn_locations { if CONFIG.logging.log_spawning { - rltk::console::log(format!("SPAWNINFO: Spawning {} at {}, {}.", key, idx.0, idx.1)); + console::log(format!("SPAWNINFO: Spawning {} at {}, {}.", key, idx.0, idx.1)); } raws::spawn_named_entity( &raws::RAWS.lock().unwrap(), @@ -109,8 +119,12 @@ fn populate_unblocked_nonvisible(map: &Map) -> Vec { } /// Picks a random index from a vector of indexes, and removes it from the vector. -fn get_random_idx_from_tiles(rng: &mut rltk::RandomNumberGenerator, area: &mut Vec) -> usize { - let idx = if area.len() == 1 { 0usize } else { (rng.roll_dice(1, area.len() as i32) - 1) as usize }; +fn get_random_idx_from_tiles(rng: &mut RandomNumberGenerator, area: &mut Vec) -> usize { + let idx = if area.len() == 1 { + 0usize + } else { + (rng.roll_dice(1, area.len() as i32) - 1) as usize + }; area.remove(idx); return area[idx]; } diff --git a/src/map/mod.rs b/src/map/mod.rs index df7de7f..9bcacca 100644 --- a/src/map/mod.rs +++ b/src/map/mod.rs @@ -1,4 +1,4 @@ -use rltk::prelude::*; +use bracket_lib::prelude::*; use serde::{ Deserialize, Serialize }; use std::collections::{ HashSet, HashMap }; mod tiletype; @@ -75,7 +75,7 @@ impl Map { lit_tiles: vec![true; map_tile_count], // NYI: Light sources. Once those exist, we can set this to false. telepath_tiles: vec![false; map_tile_count], colour_offset: vec![((0.0, 0.0, 0.0), (0.0, 0.0, 0.0)); map_tile_count], - additional_fg_offset: rltk::RGB::from_u8( + additional_fg_offset: RGB::from_u8( BRIGHTEN_FG_COLOUR_BY as u8, BRIGHTEN_FG_COLOUR_BY as u8, BRIGHTEN_FG_COLOUR_BY as u8 @@ -90,7 +90,7 @@ impl Map { view_blocked: HashSet::new(), }; - let mut rng = rltk::RandomNumberGenerator::new(); + let mut rng = RandomNumberGenerator::new(); for idx in 0..map.colour_offset.len() { map.colour_offset[idx].0 = ( @@ -146,12 +146,12 @@ impl BaseMap for Map { let w = self.width as usize; let p1 = Point::new(idx1 % w, idx1 / w); let p2 = Point::new(idx2 % w, idx2 / w); - rltk::DistanceAlg::Pythagoras.distance2d(p1, p2) + DistanceAlg::Pythagoras.distance2d(p1, p2) } /// Evaluate every possible exit from a given tile in a cardinal direction, and return it as a vector. - fn get_available_exits(&self, idx: usize) -> rltk::SmallVec<[(usize, f32); 10]> { - let mut exits = rltk::SmallVec::new(); + fn get_available_exits(&self, idx: usize) -> SmallVec<[(usize, f32); 10]> { + let mut exits = SmallVec::new(); let x = (idx as i32) % self.width; let y = (idx as i32) / self.width; let w = self.width as usize; diff --git a/src/map/themes.rs b/src/map/themes.rs index 790086e..8ddcc2a 100644 --- a/src/map/themes.rs +++ b/src/map/themes.rs @@ -2,7 +2,7 @@ use super::{ Map, Point, TileType }; use crate::data::visuals::*; use crate::config::CONFIG; use crate::data::ids::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use std::ops::{ Add, Mul }; /// Gets the renderables for a tile, with darkening/offset/post-processing/etc. Passing a val for "debug" will ignore viewshed. @@ -11,7 +11,7 @@ pub fn get_tile_renderables_for_id( map: &Map, other_pos: Option, debug: Option -) -> (rltk::FontCharType, RGB, RGB) { +) -> (FontCharType, RGB, RGB) { let coloured_bg = CONFIG.visuals.use_coloured_tile_bg; let (glyph, mut fg, mut bg, fg_offset, bg_offset) = match map.id { @@ -78,8 +78,8 @@ pub fn get_tile_renderables_for_id( } #[rustfmt::skip] -pub fn get_default_theme_renderables(idx: usize, map: &Map, debug: Option) -> (rltk::FontCharType, RGB, RGB, (i32, i32, i32), (i32, i32, i32)) { - let glyph: rltk::FontCharType; +pub fn get_default_theme_renderables(idx: usize, map: &Map, debug: Option) -> (FontCharType, RGB, RGB, (i32, i32, i32), (i32, i32, i32)) { + let glyph: FontCharType; #[allow(unused_assignments)] let mut fg: RGB = RGB::new(); #[allow(unused_assignments)] @@ -88,25 +88,25 @@ pub fn get_default_theme_renderables(idx: usize, map: &Map, debug: Option) let mut bg_offsets: (i32, i32, i32) = (-1, -1, -1); match map.tiles[idx] { - TileType::Floor => { glyph = rltk::to_cp437(FLOOR_GLYPH); fg = RGB::named(FLOOR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = FLOOR_OFFSETS; } - TileType::WoodFloor => { glyph = rltk::to_cp437(WOOD_FLOOR_GLYPH); bg = RGB::named(WOOD_FLOOR_COLOUR); offsets = WOOD_FLOOR_OFFSETS; } - TileType::Fence => { glyph = rltk::to_cp437(FENCE_GLYPH); fg = RGB::named(FENCE_FG_COLOUR); bg = RGB::named(FENCE_COLOUR); offsets = FENCE_OFFSETS; } + TileType::Floor => { glyph = to_cp437(FLOOR_GLYPH); fg = RGB::named(FLOOR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = FLOOR_OFFSETS; } + TileType::WoodFloor => { glyph = to_cp437(WOOD_FLOOR_GLYPH); bg = RGB::named(WOOD_FLOOR_COLOUR); offsets = WOOD_FLOOR_OFFSETS; } + TileType::Fence => { glyph = to_cp437(FENCE_GLYPH); fg = RGB::named(FENCE_FG_COLOUR); bg = RGB::named(FENCE_COLOUR); offsets = FENCE_OFFSETS; } TileType::Wall => { let x = idx as i32 % map.width; let y = idx as i32 / map.width; glyph = wall_glyph(&*map, x, y, debug); fg = RGB::named(WALL_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = WALL_OFFSETS; bg_offsets = DEFAULT_BG_OFFSETS } - TileType::DownStair => { glyph = rltk::to_cp437(DOWN_STAIR_GLYPH); fg = RGB::named(STAIR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = STAIR_OFFSETS;} - TileType::UpStair => { glyph = rltk::to_cp437(UP_STAIR_GLYPH); fg = RGB::named(STAIR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = STAIR_OFFSETS; } - TileType::Bridge => { glyph = rltk::to_cp437(BRIDGE_GLYPH); bg = RGB::named(BRIDGE_COLOUR); offsets = BRIDGE_OFFSETS; } - TileType::Gravel => { glyph = rltk::to_cp437(GRAVEL_GLYPH); bg = RGB::named(GRAVEL_COLOUR); offsets = GRAVEL_OFFSETS;} - TileType::Road => { glyph = rltk::to_cp437(ROAD_GLYPH); bg = RGB::named(ROAD_COLOUR); offsets = ROAD_OFFSETS;} - TileType::Grass => { glyph = rltk::to_cp437(GRASS_GLYPH); bg = RGB::named(GRASS_COLOUR); offsets = GRASS_OFFSETS; } - TileType::Foliage => { glyph = rltk::to_cp437(FOLIAGE_GLYPH); bg = RGB::named(FOLIAGE_COLOUR); offsets = FOLIAGE_OFFSETS; } - TileType::HeavyFoliage => { glyph = rltk::to_cp437(HEAVY_FOLIAGE_GLYPH); bg = RGB::named(HEAVY_FOLIAGE_COLOUR); offsets = HEAVY_FOLIAGE_OFFSETS; } - TileType::Sand => { glyph = rltk::to_cp437(SAND_GLYPH); bg = RGB::named(SAND_COLOUR); offsets = SAND_OFFSETS; } - TileType::ShallowWater => { glyph = rltk::to_cp437(SHALLOW_WATER_GLYPH); bg = RGB::named(SHALLOW_WATER_COLOUR); offsets = SHALLOW_WATER_OFFSETS; } - TileType::DeepWater => { glyph = rltk::to_cp437(DEEP_WATER_GLYPH); bg = RGB::named(DEEP_WATER_COLOUR); offsets = DEEP_WATER_OFFSETS; } - TileType::Bars => { glyph = rltk::to_cp437(BARS_GLYPH); fg = RGB::named(BARS_COLOUR); bg = RGB::named(FLOOR_COLOUR); } - TileType::ImpassableMountain => { glyph = rltk::to_cp437(IMPASSABLE_MOUNTAIN_GLYPH); bg = RGB::named(IMPASSABLE_MOUNTAIN_COLOUR); offsets = IMPASSABLE_MOUNTAIN_OFFSETS } - TileType::ToOvermap(_) => { glyph = rltk::to_cp437(TO_OVERMAP_GLYPH); fg = RGB::named(TO_OVERMAP_COLOUR); bg = RGB::named(GRASS_COLOUR); } - TileType::ToLocal(_) => { glyph = rltk::to_cp437(TO_TOWN_GLYPH); fg = RGB::named(TO_TOWN_COLOUR); bg = RGB::named(GRASS_COLOUR); } + TileType::DownStair => { glyph = to_cp437(DOWN_STAIR_GLYPH); fg = RGB::named(STAIR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = STAIR_OFFSETS;} + TileType::UpStair => { glyph = to_cp437(UP_STAIR_GLYPH); fg = RGB::named(STAIR_COLOUR); bg = RGB::named(DEFAULT_BG_COLOUR); offsets = STAIR_OFFSETS; } + TileType::Bridge => { glyph = to_cp437(BRIDGE_GLYPH); bg = RGB::named(BRIDGE_COLOUR); offsets = BRIDGE_OFFSETS; } + TileType::Gravel => { glyph = to_cp437(GRAVEL_GLYPH); bg = RGB::named(GRAVEL_COLOUR); offsets = GRAVEL_OFFSETS;} + TileType::Road => { glyph = to_cp437(ROAD_GLYPH); bg = RGB::named(ROAD_COLOUR); offsets = ROAD_OFFSETS;} + TileType::Grass => { glyph = to_cp437(GRASS_GLYPH); bg = RGB::named(GRASS_COLOUR); offsets = GRASS_OFFSETS; } + TileType::Foliage => { glyph = to_cp437(FOLIAGE_GLYPH); bg = RGB::named(FOLIAGE_COLOUR); offsets = FOLIAGE_OFFSETS; } + TileType::HeavyFoliage => { glyph = to_cp437(HEAVY_FOLIAGE_GLYPH); bg = RGB::named(HEAVY_FOLIAGE_COLOUR); offsets = HEAVY_FOLIAGE_OFFSETS; } + TileType::Sand => { glyph = to_cp437(SAND_GLYPH); bg = RGB::named(SAND_COLOUR); offsets = SAND_OFFSETS; } + TileType::ShallowWater => { glyph = to_cp437(SHALLOW_WATER_GLYPH); bg = RGB::named(SHALLOW_WATER_COLOUR); offsets = SHALLOW_WATER_OFFSETS; } + TileType::DeepWater => { glyph = to_cp437(DEEP_WATER_GLYPH); bg = RGB::named(DEEP_WATER_COLOUR); offsets = DEEP_WATER_OFFSETS; } + TileType::Bars => { glyph = to_cp437(BARS_GLYPH); fg = RGB::named(BARS_COLOUR); bg = RGB::named(FLOOR_COLOUR); } + TileType::ImpassableMountain => { glyph = to_cp437(IMPASSABLE_MOUNTAIN_GLYPH); bg = RGB::named(IMPASSABLE_MOUNTAIN_COLOUR); offsets = IMPASSABLE_MOUNTAIN_OFFSETS } + TileType::ToOvermap(_) => { glyph = to_cp437(TO_OVERMAP_GLYPH); fg = RGB::named(TO_OVERMAP_COLOUR); bg = RGB::named(GRASS_COLOUR); } + TileType::ToLocal(_) => { glyph = to_cp437(TO_TOWN_GLYPH); fg = RGB::named(TO_TOWN_COLOUR); bg = RGB::named(GRASS_COLOUR); } } if bg_offsets == (-1, -1, -1) { bg_offsets = offsets; @@ -115,7 +115,7 @@ pub fn get_default_theme_renderables(idx: usize, map: &Map, debug: Option) } #[rustfmt::skip] -fn get_forest_theme_renderables(idx:usize, map: &Map, debug: Option) -> (rltk::FontCharType, RGB, RGB, (i32, i32, i32), (i32, i32, i32)) { +fn get_forest_theme_renderables(idx:usize, map: &Map, debug: Option) -> (FontCharType, RGB, RGB, (i32, i32, i32), (i32, i32, i32)) { let glyph; #[allow(unused_assignments)] let mut fg = RGB::new(); @@ -125,9 +125,9 @@ fn get_forest_theme_renderables(idx:usize, map: &Map, debug: Option) -> (r let mut bg_offsets: (i32, i32, i32) = (-1, -1, -1); match map.tiles[idx] { - TileType::Wall => { glyph = rltk::to_cp437(FOREST_WALL_GLYPH); fg = RGB::named(FOREST_WALL_COLOUR); bg = RGB::named(GRASS_COLOUR); offsets = GRASS_OFFSETS; } - TileType::Road => { glyph = rltk::to_cp437(ROAD_GLYPH); bg = RGB::named(ROAD_COLOUR); } - TileType::ShallowWater => { glyph = rltk::to_cp437(SHALLOW_WATER_GLYPH); bg = RGB::named(SHALLOW_WATER_COLOUR); offsets = SHALLOW_WATER_OFFSETS; } + TileType::Wall => { glyph = to_cp437(FOREST_WALL_GLYPH); fg = RGB::named(FOREST_WALL_COLOUR); bg = RGB::named(GRASS_COLOUR); offsets = GRASS_OFFSETS; } + TileType::Road => { glyph = to_cp437(ROAD_GLYPH); bg = RGB::named(ROAD_COLOUR); } + TileType::ShallowWater => { glyph = to_cp437(SHALLOW_WATER_GLYPH); bg = RGB::named(SHALLOW_WATER_COLOUR); offsets = SHALLOW_WATER_OFFSETS; } _ => { (glyph, fg, _, offsets, _) = get_default_theme_renderables(idx, map, debug); bg = RGB::named(GRASS_COLOUR); bg_offsets = GRASS_OFFSETS; } } if bg_offsets == (-1, -1, -1) { @@ -142,7 +142,7 @@ fn is_revealed_and_wall(map: &Map, x: i32, y: i32, debug: Option) -> bool (if debug.is_none() { map.revealed_tiles[idx] } else { true }) } -fn wall_glyph(map: &Map, x: i32, y: i32, debug: Option) -> rltk::FontCharType { +fn wall_glyph(map: &Map, x: i32, y: i32, debug: Option) -> FontCharType { if x < 1 || x > map.width - 2 || @@ -315,15 +315,15 @@ pub fn add_i32_offsets(rgb: RGB, offsets: (f32, f32, f32)) -> RGB { let g = rgb.g + (offsets.1 as f32) / 255.0; let b = rgb.b + (offsets.2 as f32) / 255.0; - return rltk::RGB::from_f32(r, g, b); + return RGB::from_f32(r, g, b); } -pub fn multiply_by_float(rgb: rltk::RGB, offsets: (f32, f32, f32)) -> RGB { +pub fn multiply_by_float(rgb: RGB, offsets: (f32, f32, f32)) -> RGB { let r = rgb.r * offsets.0; let g = rgb.g * offsets.1; let b = rgb.b * offsets.2; - return rltk::RGB::from_f32(r, g, b); + return RGB::from_f32(r, g, b); } fn darken_by_distance(pos: Point, other_pos: Point) -> f32 { diff --git a/src/map_builders/area_starting_points.rs b/src/map_builders/area_starting_points.rs index 23c014f..9707ed6 100644 --- a/src/map_builders/area_starting_points.rs +++ b/src/map_builders/area_starting_points.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, MetaMapBuilder, Position }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; #[allow(dead_code)] pub enum XStart { @@ -21,7 +21,7 @@ pub struct AreaStartingPosition { } impl MetaMapBuilder for AreaStartingPosition { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -64,15 +64,18 @@ impl AreaStartingPosition { if crate::tile_walkable(*tiletype) { available_floors.push(( idx, - rltk::DistanceAlg::PythagorasSquared.distance2d( - rltk::Point::new((idx as i32) % build_data.map.width, (idx as i32) / build_data.map.width), - rltk::Point::new(seed_x, seed_y) + DistanceAlg::PythagorasSquared.distance2d( + Point::new( + (idx as i32) % build_data.map.width, + (idx as i32) / build_data.map.width + ), + Point::new(seed_x, seed_y) ), )); } } if available_floors.is_empty() { - panic!("No valid floors to start on"); + unreachable!("No valid floors to start on."); } available_floors.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); diff --git a/src/map_builders/bsp_dungeon.rs b/src/map_builders/bsp_dungeon.rs index 65c8b70..5180d29 100644 --- a/src/map_builders/bsp_dungeon.rs +++ b/src/map_builders/bsp_dungeon.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, InitialMapBuilder, Rect, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct BspDungeonBuilder { rects: Vec, @@ -7,7 +7,7 @@ pub struct BspDungeonBuilder { impl InitialMapBuilder for BspDungeonBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } diff --git a/src/map_builders/bsp_interior.rs b/src/map_builders/bsp_interior.rs index 697a885..1b81753 100644 --- a/src/map_builders/bsp_interior.rs +++ b/src/map_builders/bsp_interior.rs @@ -1,5 +1,5 @@ use super::{ draw_corridor, BuilderMap, InitialMapBuilder, Rect, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; const MIN_ROOM_SIZE: i32 = 8; @@ -9,7 +9,7 @@ pub struct BspInteriorBuilder { impl InitialMapBuilder for BspInteriorBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } diff --git a/src/map_builders/cellular_automata.rs b/src/map_builders/cellular_automata.rs index 5bbf361..69f2015 100644 --- a/src/map_builders/cellular_automata.rs +++ b/src/map_builders/cellular_automata.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, InitialMapBuilder, MetaMapBuilder, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct CellularAutomataBuilder { floor_tile: TileType, @@ -7,14 +7,14 @@ pub struct CellularAutomataBuilder { impl InitialMapBuilder for CellularAutomataBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } impl MetaMapBuilder for CellularAutomataBuilder { #[allow(dead_code)] - fn build_map(&mut self, _rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, _rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.apply_iteration(build_data); } } @@ -69,16 +69,28 @@ impl CellularAutomataBuilder { if build_data.map.tiles[idx + (build_data.map.width as usize)] == TileType::Wall { neighbors += 1; } - if build_data.map.tiles[idx - ((build_data.map.width as usize) - 1)] == TileType::Wall { + if + build_data.map.tiles[idx - ((build_data.map.width as usize) - 1)] == + TileType::Wall + { neighbors += 1; } - if build_data.map.tiles[idx - ((build_data.map.width as usize) + 1)] == TileType::Wall { + if + build_data.map.tiles[idx - ((build_data.map.width as usize) + 1)] == + TileType::Wall + { neighbors += 1; } - if build_data.map.tiles[idx + ((build_data.map.width as usize) - 1)] == TileType::Wall { + if + build_data.map.tiles[idx + ((build_data.map.width as usize) - 1)] == + TileType::Wall + { neighbors += 1; } - if build_data.map.tiles[idx + ((build_data.map.width as usize) + 1)] == TileType::Wall { + if + build_data.map.tiles[idx + ((build_data.map.width as usize) + 1)] == + TileType::Wall + { neighbors += 1; } diff --git a/src/map_builders/cull_unreachable.rs b/src/map_builders/cull_unreachable.rs index 7f1e2e8..b53559e 100644 --- a/src/map_builders/cull_unreachable.rs +++ b/src/map_builders/cull_unreachable.rs @@ -1,11 +1,11 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; use crate::tile_walkable; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct CullUnreachable {} impl MetaMapBuilder for CullUnreachable { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -21,7 +21,7 @@ impl CullUnreachable { let start_idx = build_data.map.xy_idx(starting_pos.x, starting_pos.y); build_data.map.populate_blocked(); let map_starts: Vec = vec![start_idx]; - let dijkstra_map = rltk::DijkstraMap::new( + let dijkstra_map = DijkstraMap::new( build_data.map.width as usize, build_data.map.height as usize, &map_starts, diff --git a/src/map_builders/distant_exit.rs b/src/map_builders/distant_exit.rs index 5b7126d..771e0b2 100644 --- a/src/map_builders/distant_exit.rs +++ b/src/map_builders/distant_exit.rs @@ -1,11 +1,11 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; use crate::tile_walkable; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct DistantExit {} impl MetaMapBuilder for DistantExit { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -21,7 +21,7 @@ impl DistantExit { let start_idx = build_data.map.xy_idx(starting_pos.x, starting_pos.y); build_data.map.populate_blocked(); let map_starts: Vec = vec![start_idx]; - let dijkstra_map = rltk::DijkstraMap::new( + let dijkstra_map = DijkstraMap::new( build_data.map.width as usize, build_data.map.height as usize, &map_starts, diff --git a/src/map_builders/dla.rs b/src/map_builders/dla.rs index c5d97fc..d1b7a4a 100644 --- a/src/map_builders/dla.rs +++ b/src/map_builders/dla.rs @@ -1,5 +1,5 @@ use super::{ paint, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, Symmetry, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; #[derive(PartialEq, Copy, Clone)] #[allow(dead_code)] @@ -18,14 +18,14 @@ pub struct DLABuilder { impl InitialMapBuilder for DLABuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } impl MetaMapBuilder for DLABuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -94,7 +94,10 @@ impl DLABuilder { #[allow(clippy::map_entry)] fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { // Carve a starting seed - let starting_position = Position { x: build_data.map.width / 2, y: build_data.map.height / 2 }; + let starting_position = Position { + x: build_data.map.width / 2, + y: build_data.map.height / 2, + }; let start_idx = build_data.map.xy_idx(starting_position.x, starting_position.y); build_data.take_snapshot(); build_data.map.tiles[start_idx] = TileType::Floor; @@ -189,10 +192,10 @@ impl DLABuilder { let mut prev_y = digger_y; let mut digger_idx = build_data.map.xy_idx(digger_x, digger_y); - let mut path = rltk::line2d( - rltk::LineAlg::Bresenham, - rltk::Point::new(digger_x, digger_y), - rltk::Point::new(starting_position.x, starting_position.y) + let mut path = line2d( + LineAlg::Bresenham, + Point::new(digger_x, digger_y), + Point::new(starting_position.x, starting_position.y) ); while build_data.map.tiles[digger_idx] == TileType::Wall && !path.is_empty() { diff --git a/src/map_builders/door_placement.rs b/src/map_builders/door_placement.rs index e19f8e7..53f5967 100644 --- a/src/map_builders/door_placement.rs +++ b/src/map_builders/door_placement.rs @@ -1,11 +1,11 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct DoorPlacement {} impl MetaMapBuilder for DoorPlacement { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.doors(rng, build_data); } } @@ -30,7 +30,11 @@ impl DoorPlacement { // There are no corridors - scan for possible places let tiles = build_data.map.tiles.clone(); for (i, tile) in tiles.iter().enumerate() { - if *tile == TileType::Floor && self.door_possible(build_data, i) && rng.roll_dice(1, 6) == 1 { + if + *tile == TileType::Floor && + self.door_possible(build_data, i) && + rng.roll_dice(1, 6) == 1 + { build_data.spawn_list.push((i, "door".to_string())); } } diff --git a/src/map_builders/drunkard.rs b/src/map_builders/drunkard.rs index 9e56892..eef629c 100644 --- a/src/map_builders/drunkard.rs +++ b/src/map_builders/drunkard.rs @@ -1,5 +1,5 @@ use super::{ paint, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, Symmetry, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; #[derive(PartialEq, Copy, Clone)] #[allow(dead_code)] @@ -22,14 +22,14 @@ pub struct DrunkardsWalkBuilder { impl InitialMapBuilder for DrunkardsWalkBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } impl MetaMapBuilder for DrunkardsWalkBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -107,7 +107,10 @@ impl DrunkardsWalkBuilder { fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { // Set a central starting point - let starting_position = Position { x: build_data.map.width / 2, y: build_data.map.height / 2 }; + let starting_position = Position { + x: build_data.map.width / 2, + y: build_data.map.height / 2, + }; let start_idx = build_data.map.xy_idx(starting_position.x, starting_position.y); build_data.map.tiles[start_idx] = TileType::Floor; @@ -144,7 +147,13 @@ impl DrunkardsWalkBuilder { if build_data.map.tiles[drunk_idx] == TileType::Wall { did_something = true; } - paint(&mut build_data.map, self.settings.symmetry, self.settings.brush_size, drunk_x, drunk_y); + paint( + &mut build_data.map, + self.settings.symmetry, + self.settings.brush_size, + drunk_x, + drunk_y + ); build_data.map.tiles[drunk_idx] = TileType::DownStair; let stagger_direction = rng.roll_dice(1, 4); diff --git a/src/map_builders/fill_edges.rs b/src/map_builders/fill_edges.rs index b05e691..6d8c624 100644 --- a/src/map_builders/fill_edges.rs +++ b/src/map_builders/fill_edges.rs @@ -1,6 +1,6 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; use crate::tile_walkable; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct FillEdges { fill_with: TileType, @@ -9,7 +9,7 @@ pub struct FillEdges { impl MetaMapBuilder for FillEdges { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.fill_edges(rng, build_data); } } diff --git a/src/map_builders/foliage.rs b/src/map_builders/foliage.rs index 34b5151..1988ddc 100644 --- a/src/map_builders/foliage.rs +++ b/src/map_builders/foliage.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct Foliage { start_tile: TileType, @@ -8,7 +8,7 @@ pub struct Foliage { impl MetaMapBuilder for Foliage { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.apply(rng, build_data); } } diff --git a/src/map_builders/forest.rs b/src/map_builders/forest.rs index 82aa5be..e30f270 100644 --- a/src/map_builders/forest.rs +++ b/src/map_builders/forest.rs @@ -11,12 +11,12 @@ use super::{ YStart, Foliage, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use crate::data::names::*; pub fn forest_builder( new_id: i32, - _rng: &mut rltk::RandomNumberGenerator, + _rng: &mut RandomNumberGenerator, width: i32, height: i32, difficulty: i32, @@ -76,7 +76,7 @@ impl RoadExit { } } if available_floors.is_empty() { - panic!("No valid floors to start on."); + unreachable!("No valid floors to start on."); } available_floors.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); let end_x = (available_floors[0].0 as i32) % build_data.map.width; diff --git a/src/map_builders/maze.rs b/src/map_builders/maze.rs index 5ca908c..4b0de71 100644 --- a/src/map_builders/maze.rs +++ b/src/map_builders/maze.rs @@ -1,11 +1,11 @@ use super::{ BuilderMap, InitialMapBuilder, Map, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct MazeBuilder {} impl InitialMapBuilder for MazeBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -75,7 +75,14 @@ struct Grid<'a> { impl<'a> Grid<'a> { fn new(width: i32, height: i32, rng: &mut RandomNumberGenerator) -> Grid { - let mut grid = Grid { width, height, cells: Vec::new(), backtrace: Vec::new(), current: 0, rng }; + let mut grid = Grid { + width, + height, + cells: Vec::new(), + backtrace: Vec::new(), + current: 0, + rng, + }; for row in 0..height { for column in 0..width { @@ -122,7 +129,9 @@ impl<'a> Grid<'a> { if neighbors.len() == 1 { return Some(neighbors[0]); } else { - return Some(neighbors[(self.rng.roll_dice(1, neighbors.len() as i32) - 1) as usize]); + return Some( + neighbors[(self.rng.roll_dice(1, neighbors.len() as i32) - 1) as usize] + ); } } None @@ -141,7 +150,9 @@ impl<'a> Grid<'a> { // __lower_part__ __higher_part_ // / \ / \ // --------cell1------ | cell2----------- - let (lower_part, higher_part) = self.cells.split_at_mut(std::cmp::max(self.current, next)); + let (lower_part, higher_part) = self.cells.split_at_mut( + std::cmp::max(self.current, next) + ); let cell1 = &mut lower_part[std::cmp::min(self.current, next)]; let cell2 = &mut higher_part[0]; cell1.remove_walls(cell2); diff --git a/src/map_builders/mod.rs b/src/map_builders/mod.rs index 83d4a4b..81045c6 100644 --- a/src/map_builders/mod.rs +++ b/src/map_builders/mod.rs @@ -1,4 +1,6 @@ use super::{ spawner, Map, Position, Rect, TileType }; +use bracket_lib::prelude::*; + mod bsp_dungeon; use bsp_dungeon::BspDungeonBuilder; mod bsp_interior; @@ -68,7 +70,7 @@ use forest::forest_builder; mod foliage; use foliage::Foliage; mod room_themer; -use room_themer::{ Theme, ThemeRooms }; +use room_themer::ThemeRooms; // Shared data to be passed around build chain pub struct BuilderMap { @@ -135,7 +137,7 @@ impl BuilderChain { None => { self.starter = Some(starter); } - Some(_) => panic!("You can only have one starting builder."), + Some(_) => unreachable!("You can only have one starting builder."), }; } @@ -143,9 +145,9 @@ impl BuilderChain { self.builders.push(metabuilder); } - pub fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator) { + pub fn build_map(&mut self, rng: &mut RandomNumberGenerator) { match &mut self.starter { - None => panic!("Cannot run a map builder chain without a starting build system"), + None => unreachable!("Cannot run a map builder chain without a starting build system"), Some(starter) => { // Build the starting map starter.build_map(rng, &mut self.build_data); @@ -165,20 +167,20 @@ impl BuilderChain { spawner::spawn_entity(ecs, &(&entity.0, &entity.1)); } if CONFIG.logging.log_spawning { - rltk::console::log(format!("DEBUGINFO: SPAWNED ENTITIES = {:?}", spawned_entities)); + console::log(format!("DEBUGINFO: SPAWNED ENTITIES = {:?}", spawned_entities)); } } } pub trait InitialMapBuilder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap); + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap); } pub trait MetaMapBuilder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap); + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap); } -fn random_start_position(rng: &mut rltk::RandomNumberGenerator) -> (XStart, YStart) { +fn random_start_position(rng: &mut RandomNumberGenerator) -> (XStart, YStart) { let x; let xroll = rng.roll_dice(1, 3); match xroll { @@ -210,11 +212,7 @@ fn random_start_position(rng: &mut rltk::RandomNumberGenerator) -> (XStart, YSta (x, y) } -fn random_room_builder( - rng: &mut rltk::RandomNumberGenerator, - builder: &mut BuilderChain, - end: bool -) { +fn random_room_builder(rng: &mut RandomNumberGenerator, builder: &mut BuilderChain, end: bool) { let build_roll = rng.roll_dice(1, 3); // Start with a room builder. match build_roll { @@ -296,7 +294,7 @@ fn random_room_builder( } fn random_shape_builder( - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, builder: &mut BuilderChain, end: bool ) -> bool { @@ -368,7 +366,7 @@ pub enum BuildType { pub fn random_builder( new_id: i32, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, width: i32, height: i32, difficulty: i32, @@ -377,7 +375,7 @@ pub fn random_builder( end: bool, build_type: BuildType ) -> BuilderChain { - rltk::console::log(format!("DEBUGINFO: Building random (ID:{}, DIFF:{})", new_id, difficulty)); + console::log(format!("DEBUGINFO: Building random (ID:{}, DIFF:{})", new_id, difficulty)); let mut builder = BuilderChain::new( false, new_id, @@ -441,7 +439,7 @@ pub fn random_builder( pub fn level_builder( new_id: i32, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, width: i32, height: i32, initial_player_level: i32 diff --git a/src/map_builders/prefab_builder/mod.rs b/src/map_builders/prefab_builder/mod.rs index 478db11..582577d 100644 --- a/src/map_builders/prefab_builder/mod.rs +++ b/src/map_builders/prefab_builder/mod.rs @@ -1,5 +1,5 @@ use super::{ spawner, BuilderMap, InitialMapBuilder, MetaMapBuilder, Position, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub mod prefab_levels; pub mod prefab_sections; pub mod prefab_vaults; @@ -25,14 +25,14 @@ pub struct PrefabBuilder { } impl MetaMapBuilder for PrefabBuilder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } impl InitialMapBuilder for PrefabBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -65,7 +65,8 @@ impl PrefabBuilder { fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { match self.mode { - PrefabMode::Overmap => self.load_ascii_map(&prefab_levels::OVERMAP, rng, build_data, true), + PrefabMode::Overmap => + self.load_ascii_map(&prefab_levels::OVERMAP, rng, build_data, true), PrefabMode::Constant { level } => self.load_ascii_map(&level, rng, build_data, false), PrefabMode::Sectional { section } => self.apply_sectional(§ion, rng, build_data), PrefabMode::RoomVaults => self.apply_room_vaults(rng, build_data), @@ -73,7 +74,13 @@ impl PrefabBuilder { build_data.take_snapshot(); } - fn char_to_map(&mut self, ch: char, idx: usize, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { + fn char_to_map( + &mut self, + ch: char, + idx: usize, + rng: &mut RandomNumberGenerator, + build_data: &mut BuilderMap + ) { let difficulty = (build_data.map.difficulty + build_data.initial_player_level) / 2; match ch { ' ' => { @@ -123,7 +130,10 @@ impl PrefabBuilder { } '!' => { build_data.map.tiles[idx] = TileType::Floor; - build_data.spawn_list.push((idx, spawner::potion_table(Some(difficulty)).roll(rng))); + build_data.spawn_list.push(( + idx, + spawner::potion_table(Some(difficulty)).roll(rng), + )); } '/' => { build_data.map.tiles[idx] = TileType::Floor; @@ -131,14 +141,20 @@ impl PrefabBuilder { } '?' => { build_data.map.tiles[idx] = TileType::Floor; - build_data.spawn_list.push((idx, spawner::scroll_table(Some(difficulty)).roll(rng))); + build_data.spawn_list.push(( + idx, + spawner::scroll_table(Some(difficulty)).roll(rng), + )); } ')' => { build_data.map.tiles[idx] = TileType::Floor; - build_data.spawn_list.push((idx, spawner::equipment_table(Some(difficulty)).roll(rng))); + build_data.spawn_list.push(( + idx, + spawner::equipment_table(Some(difficulty)).roll(rng), + )); } _ => { - rltk::console::log(format!("Unknown glyph '{}' when loading prefab", ch as u8 as char)); + console::log(format!("Unknown glyph '{}' when loading prefab", ch as u8 as char)); } } } @@ -185,14 +201,19 @@ impl PrefabBuilder { build_data.map.tiles[idx] = TileType::ToLocal(ID_INFINITE); } _ => { - rltk::console::log(format!("Unknown glyph '{}' when loading overmap", ch as u8 as char)); + console::log(format!("Unknown glyph '{}' when loading overmap", ch as u8 as char)); } } } #[allow(dead_code)] - fn load_rex_map(&mut self, path: &str, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { - let xp_file = rltk::rex::XpFile::from_resource(path).unwrap(); + fn load_rex_map( + &mut self, + path: &str, + rng: &mut RandomNumberGenerator, + build_data: &mut BuilderMap + ) { + let xp_file = rex::XpFile::from_resource(path).unwrap(); for layer in &xp_file.layers { for y in 0..layer.height { diff --git a/src/map_builders/room_based_spawner.rs b/src/map_builders/room_based_spawner.rs index 107ea22..8b86a7f 100644 --- a/src/map_builders/room_based_spawner.rs +++ b/src/map_builders/room_based_spawner.rs @@ -1,10 +1,10 @@ use super::{ spawner, BuilderMap, MetaMapBuilder }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct RoomBasedSpawner {} impl MetaMapBuilder for RoomBasedSpawner { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -27,7 +27,7 @@ impl RoomBasedSpawner { ); } } else { - panic!("RoomBasedSpawner only works after rooms have been created"); + unreachable!("RoomBasedSpawner tried to run without any rooms."); } } } diff --git a/src/map_builders/room_based_stairs.rs b/src/map_builders/room_based_stairs.rs index 05a59aa..c849e00 100644 --- a/src/map_builders/room_based_stairs.rs +++ b/src/map_builders/room_based_stairs.rs @@ -1,10 +1,10 @@ use super::{ BuilderMap, MetaMapBuilder, TileType }; -use rltk::prelude::*; +use bracket_lib::prelude::*; pub struct RoomBasedStairs {} impl MetaMapBuilder for RoomBasedStairs { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -22,7 +22,7 @@ impl RoomBasedStairs { build_data.map.tiles[stairs_idx] = TileType::DownStair; build_data.take_snapshot(); } else { - panic!("RoomBasedStairs only works after rooms have been created"); + unreachable!("RoomBasedStairs tried to run without any rooms."); } } } diff --git a/src/map_builders/room_based_starting_position.rs b/src/map_builders/room_based_starting_position.rs index 906e301..16d092b 100644 --- a/src/map_builders/room_based_starting_position.rs +++ b/src/map_builders/room_based_starting_position.rs @@ -1,10 +1,10 @@ use super::{ BuilderMap, MetaMapBuilder, Position }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct RoomBasedStartingPosition {} impl MetaMapBuilder for RoomBasedStartingPosition { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -20,7 +20,7 @@ impl RoomBasedStartingPosition { let start_pos = rooms[0].center(); build_data.starting_position = Some(Position { x: start_pos.x, y: start_pos.y }); } else { - panic!("RoomBasedStartingPosition only works after rooms have been created"); + unreachable!("RoomBasedStartingPosition tried to run without any rooms."); } } } diff --git a/src/map_builders/room_corner_rounding.rs b/src/map_builders/room_corner_rounding.rs index 6af2b5e..516635f 100644 --- a/src/map_builders/room_corner_rounding.rs +++ b/src/map_builders/room_corner_rounding.rs @@ -1,10 +1,10 @@ use super::{ BuilderMap, MetaMapBuilder, Rect, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct RoomCornerRounder {} impl MetaMapBuilder for RoomCornerRounder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -42,7 +42,7 @@ impl RoomCornerRounder { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("RoomCornerRounding requires a builder with rooms."); + unreachable!("RoomCornerRounding tried to run without any rooms."); } for room in rooms.iter() { diff --git a/src/map_builders/room_draw.rs b/src/map_builders/room_draw.rs index 10019eb..8169b82 100644 --- a/src/map_builders/room_draw.rs +++ b/src/map_builders/room_draw.rs @@ -1,10 +1,10 @@ use super::{ BuilderMap, MetaMapBuilder, Rect, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct RoomDrawer {} impl MetaMapBuilder for RoomDrawer { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -29,14 +29,11 @@ impl RoomDrawer { fn circle(&mut self, build_data: &mut BuilderMap, room: &Rect) { let radius = (i32::min(room.x2 - room.x1, room.y2 - room.y1) as f32) / 2.0; let center = room.center(); - let center_pt = rltk::Point::new(center.x, center.y); + let center_pt = Point::new(center.x, center.y); for y in room.y1..=room.y2 { for x in room.x1..=room.x2 { let idx = build_data.map.xy_idx(x, y); - let distance = rltk::DistanceAlg::Pythagoras.distance2d( - center_pt, - rltk::Point::new(x, y) - ); + let distance = DistanceAlg::Pythagoras.distance2d(center_pt, Point::new(x, y)); if idx > 0 && idx < ((build_data.map.width * build_data.map.height - 1) as usize) && @@ -53,7 +50,7 @@ impl RoomDrawer { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("RoomDrawer require a builder with rooms"); + unreachable!("RoomDrawer tried to run without any rooms."); } for room in rooms.iter() { diff --git a/src/map_builders/room_exploder.rs b/src/map_builders/room_exploder.rs index 254183e..eea3875 100644 --- a/src/map_builders/room_exploder.rs +++ b/src/map_builders/room_exploder.rs @@ -1,10 +1,10 @@ use super::{ paint, BuilderMap, MetaMapBuilder, Rect, Symmetry, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct RoomExploder {} impl MetaMapBuilder for RoomExploder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -20,7 +20,7 @@ impl RoomExploder { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("RoomExploder requires a builder with rooms."); + unreachable!("RoomExploder tried to run without any rooms."); } for room in rooms.iter() { let start = room.center(); diff --git a/src/map_builders/room_sorter.rs b/src/map_builders/room_sorter.rs index c2b8009..074d439 100644 --- a/src/map_builders/room_sorter.rs +++ b/src/map_builders/room_sorter.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, MetaMapBuilder, Rect }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; #[allow(dead_code)] pub enum RoomSort { @@ -16,7 +16,7 @@ pub struct RoomSorter { impl MetaMapBuilder for RoomSorter { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.sorter(rng, build_data); } } @@ -50,21 +50,18 @@ impl RoomSorter { .unwrap() .sort_by(|a, b| b.y2.cmp(&a.y2)), RoomSort::CENTRAL => { - let map_centre = rltk::Point::new( - build_data.map.width / 2, - build_data.map.height / 2 - ); + let map_centre = Point::new(build_data.map.width / 2, build_data.map.height / 2); build_data.rooms .as_mut() .unwrap() .sort_by(|a: &Rect, b: &Rect| { - let a_centre_pt = rltk::Point::new(a.center().x, a.center().y); - let b_centre_pt = rltk::Point::new(b.center().x, b.center().y); - let distance_a = rltk::DistanceAlg::Pythagoras.distance2d( + let a_centre_pt = Point::new(a.center().x, a.center().y); + let b_centre_pt = Point::new(b.center().x, b.center().y); + let distance_a = DistanceAlg::Pythagoras.distance2d( a_centre_pt, map_centre ); - let distance_b = rltk::DistanceAlg::Pythagoras.distance2d( + let distance_b = DistanceAlg::Pythagoras.distance2d( b_centre_pt, map_centre ); diff --git a/src/map_builders/room_themer.rs b/src/map_builders/room_themer.rs index 14c7112..2cc4ca1 100644 --- a/src/map_builders/room_themer.rs +++ b/src/map_builders/room_themer.rs @@ -7,7 +7,7 @@ use crate::data::messages::{ FEATURE_BARRACKS_ORC, }; use crate::raws; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; use std::collections::HashSet; pub enum Theme { @@ -22,7 +22,7 @@ pub struct ThemeRooms { } impl MetaMapBuilder for ThemeRooms { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -141,7 +141,7 @@ impl ThemeRooms { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("RoomCornerRounding requires a builder with rooms."); + unreachable!("RoomCornerRounding tried to run without any rooms."); } let count = roll_until_fail(rng, self.percent); @@ -173,7 +173,7 @@ fn roll_until_fail(rng: &mut RandomNumberGenerator, target: i32) -> i32 { loop { if rng.roll_dice(1, 100) <= target - accumulator { accumulator += 1; - rltk::console::log(accumulator); + console::log(accumulator); } else { break; } diff --git a/src/map_builders/rooms_corridors_bresenham.rs b/src/map_builders/rooms_corridors_bresenham.rs index c32ce7c..53e7d26 100644 --- a/src/map_builders/rooms_corridors_bresenham.rs +++ b/src/map_builders/rooms_corridors_bresenham.rs @@ -1,12 +1,12 @@ use super::{ BuilderMap, MetaMapBuilder, Rect, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; use std::collections::HashSet; pub struct BresenhamCorridors {} impl MetaMapBuilder for BresenhamCorridors { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.corridors(rng, build_data); } } @@ -22,7 +22,7 @@ impl BresenhamCorridors { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("BresenhamCorridors require a builder with room structures"); + unreachable!("BresenhamCorridors tried to run without any rooms."); } let mut connected: HashSet = HashSet::new(); @@ -30,12 +30,12 @@ impl BresenhamCorridors { for (i, room) in rooms.iter().enumerate() { let mut room_distance: Vec<(usize, f32)> = Vec::new(); let room_centre = room.center(); - let room_centre_pt = rltk::Point::new(room_centre.x, room_centre.y); + let room_centre_pt = Point::new(room_centre.x, room_centre.y); for (j, other_room) in rooms.iter().enumerate() { if i != j && !connected.contains(&j) { let other_centre = other_room.center(); - let other_centre_pt = rltk::Point::new(other_centre.x, other_centre.y); - let distance = rltk::DistanceAlg::Pythagoras.distance2d( + let other_centre_pt = Point::new(other_centre.x, other_centre.y); + let distance = DistanceAlg::Pythagoras.distance2d( room_centre_pt, other_centre_pt ); @@ -46,10 +46,10 @@ impl BresenhamCorridors { if !room_distance.is_empty() { room_distance.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); let dest_centre = rooms[room_distance[0].0].center(); - let line = rltk::line2d( - rltk::LineAlg::Bresenham, + let line = line2d( + LineAlg::Bresenham, room_centre_pt, - rltk::Point::new(dest_centre.x, dest_centre.y) + Point::new(dest_centre.x, dest_centre.y) ); let mut corridor = Vec::new(); for cell in line.iter() { diff --git a/src/map_builders/rooms_corridors_bsp.rs b/src/map_builders/rooms_corridors_bsp.rs index 6b4f764..052897c 100644 --- a/src/map_builders/rooms_corridors_bsp.rs +++ b/src/map_builders/rooms_corridors_bsp.rs @@ -1,11 +1,11 @@ use super::{ draw_corridor, BuilderMap, MetaMapBuilder, Rect }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct BspCorridors {} impl MetaMapBuilder for BspCorridors { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.corridors(rng, build_data); } } @@ -21,7 +21,7 @@ impl BspCorridors { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("BSP Corridors require a builder with room structures"); + unreachable!("BSP Corridors tried to run without any rooms."); } let mut corridors: Vec> = Vec::new(); @@ -30,8 +30,10 @@ impl BspCorridors { let next_room = rooms[i + 1]; let start_x = room.x1 + (rng.roll_dice(1, i32::abs(room.x1 - room.x2)) - 1); let start_y = room.y1 + (rng.roll_dice(1, i32::abs(room.y1 - room.y2)) - 1); - let end_x = next_room.x1 + (rng.roll_dice(1, i32::abs(next_room.x1 - next_room.x2)) - 1); - let end_y = next_room.y1 + (rng.roll_dice(1, i32::abs(next_room.y1 - next_room.y2)) - 1); + let end_x = + next_room.x1 + (rng.roll_dice(1, i32::abs(next_room.x1 - next_room.x2)) - 1); + let end_y = + next_room.y1 + (rng.roll_dice(1, i32::abs(next_room.y1 - next_room.y2)) - 1); let corridor = draw_corridor(&mut build_data.map, start_x, start_y, end_x, end_y); corridors.push(corridor); build_data.take_snapshot(); diff --git a/src/map_builders/rooms_corridors_dogleg.rs b/src/map_builders/rooms_corridors_dogleg.rs index c7cc436..907a1a4 100644 --- a/src/map_builders/rooms_corridors_dogleg.rs +++ b/src/map_builders/rooms_corridors_dogleg.rs @@ -1,11 +1,11 @@ use super::{ apply_horizontal_tunnel, apply_vertical_tunnel, BuilderMap, MetaMapBuilder, Rect }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct DoglegCorridors {} impl MetaMapBuilder for DoglegCorridors { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.corridors(rng, build_data); } } @@ -21,7 +21,7 @@ impl DoglegCorridors { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("DoglegCorridors require a builder with rooms."); + unreachable!("DoglegCorridors tried to run without any rooms."); } let mut corridors: Vec> = Vec::new(); diff --git a/src/map_builders/rooms_corridors_nearest.rs b/src/map_builders/rooms_corridors_nearest.rs index de7f02a..21b0312 100644 --- a/src/map_builders/rooms_corridors_nearest.rs +++ b/src/map_builders/rooms_corridors_nearest.rs @@ -1,12 +1,12 @@ use super::{ draw_corridor, BuilderMap, MetaMapBuilder, Rect }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; use std::collections::HashSet; pub struct NearestCorridors {} impl MetaMapBuilder for NearestCorridors { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.corridors(rng, build_data); } } @@ -22,7 +22,7 @@ impl NearestCorridors { if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { - panic!("NearestCorridors requires a builder with rooms"); + unreachable!("NearestCorridors tried to run without any rooms."); } let mut connected: HashSet = HashSet::new(); @@ -30,12 +30,12 @@ impl NearestCorridors { for (i, room) in rooms.iter().enumerate() { let mut room_distance: Vec<(usize, f32)> = Vec::new(); let room_centre = room.center(); - let room_centre_pt = rltk::Point::new(room_centre.x, room_centre.y); + let room_centre_pt = Point::new(room_centre.x, room_centre.y); for (j, other_room) in rooms.iter().enumerate() { if i != j && !connected.contains(&j) { let other_centre = other_room.center(); - let other_centre_pt = rltk::Point::new(other_centre.x, other_centre.y); - let distance = rltk::DistanceAlg::Pythagoras.distance2d( + let other_centre_pt = Point::new(other_centre.x, other_centre.y); + let distance = DistanceAlg::Pythagoras.distance2d( room_centre_pt, other_centre_pt ); diff --git a/src/map_builders/rooms_corridors_spawner.rs b/src/map_builders/rooms_corridors_spawner.rs index 06d5912..a62c87a 100644 --- a/src/map_builders/rooms_corridors_spawner.rs +++ b/src/map_builders/rooms_corridors_spawner.rs @@ -1,10 +1,10 @@ use super::{ spawner, BuilderMap, MetaMapBuilder }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct CorridorSpawner {} impl MetaMapBuilder for CorridorSpawner { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -27,7 +27,7 @@ impl CorridorSpawner { ); } } else { - panic!("CorridorSpawner only works after corridors have been created"); + unreachable!("CorridorSpawner tried to run without any corridors."); } } } diff --git a/src/map_builders/scaffold.txt b/src/map_builders/scaffold.txt index e0f7ed9..d8d7ee4 100644 --- a/src/map_builders/scaffold.txt +++ b/src/map_builders/scaffold.txt @@ -2,7 +2,7 @@ use super::{ generate_voronoi_spawn_regions, remove_unreachable_areas_returning_most_distant, spawner, Map, MapBuilder, Position, TileType, SHOW_MAPGEN, }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::HashMap; diff --git a/src/map_builders/simple_map.rs b/src/map_builders/simple_map.rs index 0cc1915..54ab237 100644 --- a/src/map_builders/simple_map.rs +++ b/src/map_builders/simple_map.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, InitialMapBuilder, Rect }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; pub struct SimpleMapBuilder { room_params: (i32, i32, i32), @@ -7,7 +7,7 @@ pub struct SimpleMapBuilder { impl InitialMapBuilder for SimpleMapBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build_rooms(rng, build_data); } } diff --git a/src/map_builders/town.rs b/src/map_builders/town.rs index ea423f9..c9cf3f9 100644 --- a/src/map_builders/town.rs +++ b/src/map_builders/town.rs @@ -1,16 +1,17 @@ use super::{ BuilderChain, BuilderMap, InitialMapBuilder, Position, TileType, FillEdges }; use std::collections::HashSet; use crate::data::names::*; +use bracket_lib::prelude::*; pub fn town_builder( new_id: i32, - _rng: &mut rltk::RandomNumberGenerator, + _rng: &mut RandomNumberGenerator, width: i32, height: i32, difficulty: i32, initial_player_level: i32 ) -> BuilderChain { - rltk::console::log(format!("DEBUGINFO: Building town (ID:{}, DIFF:{})", new_id, difficulty)); + console::log(format!("DEBUGINFO: Building town (ID:{}, DIFF:{})", new_id, difficulty)); let mut chain = BuilderChain::new( false, new_id, @@ -32,7 +33,7 @@ pub struct TownBuilder {} impl InitialMapBuilder for TownBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build_map(rng, build_data); } } @@ -52,7 +53,7 @@ impl TownBuilder { return Box::new(TownBuilder {}); } - pub fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + pub fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { // Make visible for snapshot for t in build_data.map.visible_tiles.iter_mut() { *t = true; @@ -64,8 +65,20 @@ impl TownBuilder { let (mut available_building_tiles, wall_gap_y) = self.town_walls(rng, build_data); let mut buildings = self.buildings(rng, build_data, &mut available_building_tiles); let doors = self.add_doors(rng, build_data, &mut buildings, wall_gap_y); - self.path_from_tiles_to_nearest_tiletype(build_data, &doors, TileType::Road, TileType::Road, true); - self.path_from_tiles_to_nearest_tiletype(build_data, &piers, TileType::Road, TileType::Road, false); + self.path_from_tiles_to_nearest_tiletype( + build_data, + &doors, + TileType::Road, + TileType::Road, + true + ); + self.path_from_tiles_to_nearest_tiletype( + build_data, + &piers, + TileType::Road, + TileType::Road, + false + ); // Spawn entities let building_size = self.sort_buildings(&buildings); @@ -81,7 +94,10 @@ impl TownBuilder { build_data.take_snapshot(); } - fn sort_buildings(&mut self, buildings: &[(i32, i32, i32, i32)]) -> Vec<(usize, i32, BuildingTag)> { + fn sort_buildings( + &mut self, + buildings: &[(i32, i32, i32, i32)] + ) -> Vec<(usize, i32, BuildingTag)> { // Sort buildings by size, defaulting them to Unassigned buildings let mut building_size: Vec<(usize, i32, BuildingTag)> = Vec::new(); for (i, building) in buildings.iter().enumerate() { @@ -105,7 +121,7 @@ impl TownBuilder { fn building_factory( &mut self, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, buildings: &[(i32, i32, i32, i32)], building_index: &[(usize, i32, BuildingTag)] @@ -124,7 +140,7 @@ impl TownBuilder { } } - fn spawn_dockers(&mut self, build_data: &mut BuilderMap, rng: &mut rltk::RandomNumberGenerator) { + fn spawn_dockers(&mut self, build_data: &mut BuilderMap, rng: &mut RandomNumberGenerator) { for (idx, tt) in build_data.map.tiles.iter().enumerate() { if *tt == TileType::Bridge && rng.roll_dice(1, 20) == 1 { let roll = rng.roll_dice(1, 2); @@ -139,7 +155,7 @@ impl TownBuilder { fn spawn_townsfolk( &mut self, build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, available_building_tiles: &mut HashSet ) { for idx in available_building_tiles.iter() { @@ -176,7 +192,7 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, to_place: &mut Vec<&str>, avoid_tile: usize ) { @@ -201,9 +217,12 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { - let player_idx = build_data.map.xy_idx(building.0 + building.2 / 2, building.1 + building.3 / 2); + let player_idx = build_data.map.xy_idx( + building.0 + building.2 / 2, + building.1 + building.3 / 2 + ); // Place other items let mut to_place: Vec<&str> = vec![ @@ -224,7 +243,7 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { let mut to_place: Vec<&str> = vec![ "npc_priest", @@ -244,10 +263,13 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { // Place exit - let exit_idx = build_data.map.xy_idx(building.0 + building.2 / 2, building.1 + building.3 / 2); + let exit_idx = build_data.map.xy_idx( + building.0 + building.2 / 2, + building.1 + building.3 / 2 + ); build_data.map.tiles[exit_idx] = TileType::DownStair; let mut to_place: Vec<&str> = vec!["npc_miner", "npc_miner", "npc_guard", "prop_chair"]; self.random_building_spawn(building, build_data, rng, &mut to_place, exit_idx) @@ -257,9 +279,15 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { - let mut to_place: Vec<&str> = vec!["prop_bed", "prop_table", "dog_little", "prop_chair", "prop_chair"]; + let mut to_place: Vec<&str> = vec![ + "prop_bed", + "prop_table", + "dog_little", + "prop_chair", + "prop_chair" + ]; self.random_building_spawn(building, build_data, rng, &mut to_place, 0); } @@ -267,9 +295,14 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { - let mut to_place: Vec<&str> = vec!["npc_townsperson", "prop_bed", "prop_table", "prop_chair"]; + let mut to_place: Vec<&str> = vec![ + "npc_townsperson", + "prop_bed", + "prop_table", + "prop_chair" + ]; self.random_building_spawn(building, build_data, rng, &mut to_place, 0); } @@ -277,7 +310,7 @@ impl TownBuilder { &mut self, building: &(i32, i32, i32, i32), build_data: &mut BuilderMap, - rng: &mut rltk::RandomNumberGenerator + rng: &mut RandomNumberGenerator ) { let mut to_place: Vec<&str> = vec!["rat", "rat", "rat", "prop_table", "prop_chair"]; self.random_building_spawn(building, build_data, rng, &mut to_place, 0); @@ -291,7 +324,11 @@ impl TownBuilder { build_data.take_snapshot(); } - fn water_and_piers(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) -> Vec { + fn water_and_piers( + &mut self, + rng: &mut RandomNumberGenerator, + build_data: &mut BuilderMap + ) -> Vec { let mut n = (rng.roll_dice(1, 65535) as f32) / 65535f32; let mut water_width: Vec = Vec::new(); let variance = 5; @@ -300,7 +337,8 @@ impl TownBuilder { let sand_width = shallow_width + 4; for y in 0..build_data.height { - let n_water = ((f32::sin(n) * (variance as f32)) as i32) + minimum_width + rng.roll_dice(1, 2); + let n_water = + ((f32::sin(n) * (variance as f32)) as i32) + minimum_width + rng.roll_dice(1, 2); water_width.push(n_water); n += 0.1; for x in 0..n_water { @@ -374,7 +412,7 @@ impl TownBuilder { fn town_walls( &mut self, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap ) -> (HashSet, i32) { let mut available_building_tiles: HashSet = HashSet::new(); @@ -385,7 +423,10 @@ impl TownBuilder { const HALF_PATH_THICKNESS: i32 = 3; let wall_gap_y = - build_data.height / 2 + rng.roll_dice(1, PATH_OFFSET_FROM_CENTRE * 2) - 1 - PATH_OFFSET_FROM_CENTRE; + build_data.height / 2 + + rng.roll_dice(1, PATH_OFFSET_FROM_CENTRE * 2) - + 1 - + PATH_OFFSET_FROM_CENTRE; for y in BORDER..build_data.height - BORDER { if !(y > wall_gap_y - HALF_PATH_THICKNESS && y < wall_gap_y + HALF_PATH_THICKNESS) { @@ -438,7 +479,7 @@ impl TownBuilder { fn buildings( &mut self, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, available_building_tiles: &mut HashSet ) -> Vec<(i32, i32, i32, i32)> { @@ -452,7 +493,9 @@ impl TownBuilder { const MAX_BUILDING_SIZE: i32 = 10; while n_buildings < REQUIRED_BUILDINGS { - let bx = rng.roll_dice(1, build_data.map.width - OFFSET_FROM_LEFT - BORDER) + OFFSET_FROM_LEFT; + let bx = + rng.roll_dice(1, build_data.map.width - OFFSET_FROM_LEFT - BORDER) + + OFFSET_FROM_LEFT; let by = rng.roll_dice(1, build_data.map.height) - BORDER; let bw = rng.roll_dice(1, MAX_BUILDING_SIZE - MIN_BUILDING_SIZE) + MIN_BUILDING_SIZE; let bh = rng.roll_dice(1, MAX_BUILDING_SIZE - MIN_BUILDING_SIZE) + MIN_BUILDING_SIZE; @@ -500,10 +543,16 @@ impl TownBuilder { if build_data.map.tiles[idx + 1] != TileType::WoodFloor { neighbours += 1; } - if build_data.map.tiles[idx - (build_data.width as usize)] != TileType::WoodFloor { + if + build_data.map.tiles[idx - (build_data.width as usize)] != + TileType::WoodFloor + { neighbours += 1; } - if build_data.map.tiles[idx + (build_data.width as usize)] != TileType::WoodFloor { + if + build_data.map.tiles[idx + (build_data.width as usize)] != + TileType::WoodFloor + { neighbours += 1; } if neighbours > 0 { @@ -520,7 +569,7 @@ impl TownBuilder { fn add_doors( &mut self, - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap, buildings: &mut Vec<(i32, i32, i32, i32)>, wall_gap_y: i32 @@ -556,23 +605,26 @@ impl TownBuilder { build_data.map.populate_blocked(); for tile_idx in tiles.iter() { let mut nearest_tiletype: Vec<(usize, f32)> = Vec::new(); - let tile_pt = rltk::Point::new( + let tile_pt = Point::new( (*tile_idx as i32) % (build_data.map.width as i32), (*tile_idx as i32) / (build_data.map.width as i32) ); for r in roads.iter() { nearest_tiletype.push(( *r, - rltk::DistanceAlg::Manhattan.distance2d( + DistanceAlg::Manhattan.distance2d( tile_pt, - rltk::Point::new((*r as i32) % build_data.map.width, (*r as i32) / build_data.map.width) + Point::new( + (*r as i32) % build_data.map.width, + (*r as i32) / build_data.map.width + ) ), )); } nearest_tiletype.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); let destination = nearest_tiletype[0].0; - let path = rltk::a_star_search(*tile_idx, destination, &mut build_data.map); + let path = a_star_search(*tile_idx, destination, &mut build_data.map); if path.success { for step in path.steps.iter() { let idx = *step as usize; diff --git a/src/map_builders/voronoi.rs b/src/map_builders/voronoi.rs index 80d814e..585a1b2 100644 --- a/src/map_builders/voronoi.rs +++ b/src/map_builders/voronoi.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, InitialMapBuilder, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; #[derive(PartialEq, Copy, Clone)] #[allow(dead_code)] @@ -16,7 +16,7 @@ pub struct VoronoiBuilder { impl InitialMapBuilder for VoronoiBuilder { #[allow(dead_code)] - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -40,20 +40,21 @@ impl VoronoiBuilder { #[allow(clippy::map_entry)] fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { // Make a Voronoi diagram. We'll do this the hard way to learn about the technique! - let mut voronoi_seeds: Vec<(usize, rltk::Point)> = Vec::new(); + let mut voronoi_seeds: Vec<(usize, Point)> = Vec::new(); while voronoi_seeds.len() < self.n_seeds { let vx = rng.roll_dice(1, build_data.map.width - 1); let vy = rng.roll_dice(1, build_data.map.height - 1); let vidx = build_data.map.xy_idx(vx, vy); - let candidate = (vidx, rltk::Point::new(vx, vy)); + let candidate = (vidx, Point::new(vx, vy)); if !voronoi_seeds.contains(&candidate) { voronoi_seeds.push(candidate); } } let mut voronoi_distance = vec![(0, 0.0f32); self.n_seeds]; - let mut voronoi_membership: Vec = vec![0; build_data.map.width as usize * build_data.map.height as usize]; + let mut voronoi_membership: Vec = + vec![0; build_data.map.width as usize * build_data.map.height as usize]; for (i, vid) in voronoi_membership.iter_mut().enumerate() { let x = (i as i32) % build_data.map.width; let y = (i as i32) / build_data.map.width; @@ -62,13 +63,16 @@ impl VoronoiBuilder { let distance; match self.distance_algorithm { DistanceAlgorithm::Pythagoras => { - distance = rltk::DistanceAlg::PythagorasSquared.distance2d(rltk::Point::new(x, y), pos.1); + distance = DistanceAlg::PythagorasSquared.distance2d( + Point::new(x, y), + pos.1 + ); } DistanceAlgorithm::Manhattan => { - distance = rltk::DistanceAlg::Manhattan.distance2d(rltk::Point::new(x, y), pos.1); + distance = DistanceAlg::Manhattan.distance2d(Point::new(x, y), pos.1); } DistanceAlgorithm::Chebyshev => { - distance = rltk::DistanceAlg::Chebyshev.distance2d(rltk::Point::new(x, y), pos.1); + distance = DistanceAlg::Chebyshev.distance2d(Point::new(x, y), pos.1); } } voronoi_distance[seed] = (seed, distance); diff --git a/src/map_builders/voronoi_spawning.rs b/src/map_builders/voronoi_spawning.rs index 8c448a7..9a25d50 100644 --- a/src/map_builders/voronoi_spawning.rs +++ b/src/map_builders/voronoi_spawning.rs @@ -1,12 +1,12 @@ -use super::{ spawner, BuilderMap, MetaMapBuilder, TileType }; +use super::{ spawner, BuilderMap, MetaMapBuilder }; use crate::tile_walkable; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; use std::collections::HashMap; pub struct VoronoiSpawning {} impl MetaMapBuilder for VoronoiSpawning { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -20,10 +20,10 @@ impl VoronoiSpawning { #[allow(clippy::map_entry)] fn build(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { let mut noise_areas: HashMap> = HashMap::new(); - let mut noise = rltk::FastNoise::seeded(rng.roll_dice(1, 65536) as u64); - noise.set_noise_type(rltk::NoiseType::Cellular); + let mut noise = FastNoise::seeded(rng.roll_dice(1, 65536) as u64); + noise.set_noise_type(NoiseType::Cellular); noise.set_frequency(0.08); - noise.set_cellular_distance_function(rltk::CellularDistanceFunction::Manhattan); + noise.set_cellular_distance_function(CellularDistanceFunction::Manhattan); for y in 1..build_data.map.height - 1 { for x in 1..build_data.map.width - 1 { diff --git a/src/map_builders/wfc/constraints.rs b/src/map_builders/wfc/constraints.rs index e9504a0..3851a6e 100644 --- a/src/map_builders/wfc/constraints.rs +++ b/src/map_builders/wfc/constraints.rs @@ -1,7 +1,13 @@ -use super::{Map, MapChunk, TileType}; +use super::{ Map, MapChunk, TileType }; use std::collections::HashSet; +use bracket_lib::prelude::*; -pub fn build_patterns(map: &Map, chunk_size: i32, include_flipping: bool, dedupe: bool) -> Vec> { +pub fn build_patterns( + map: &Map, + chunk_size: i32, + include_flipping: bool, + dedupe: bool +) -> Vec> { let chunks_x = map.width / chunk_size; let chunks_y = map.height / chunk_size; let mut patterns = Vec::new(); @@ -49,16 +55,22 @@ pub fn build_patterns(map: &Map, chunk_size: i32, include_flipping: bool, dedupe // Dedupe if dedupe { - rltk::console::log(format!("Pre de-duplication, there are {} patterns.", patterns.len())); + console::log(format!("Pre de-duplication, there are {} patterns.", patterns.len())); let set: HashSet> = patterns.drain(..).collect(); // Dedupes patterns.extend(set.into_iter()); - rltk::console::log(format!("There are {} patterns.", patterns.len())); + console::log(format!("There are {} patterns.", patterns.len())); } return patterns; } -pub fn render_pattern_to_map(map: &mut Map, chunk: &MapChunk, chunk_size: i32, start_x: i32, start_y: i32) { +pub fn render_pattern_to_map( + map: &mut Map, + chunk: &MapChunk, + chunk_size: i32, + start_x: i32, + start_y: i32 +) { let mut i = 0usize; for tile_y in 0..chunk_size { for tile_x in 0..chunk_size { @@ -70,25 +82,25 @@ pub fn render_pattern_to_map(map: &mut Map, chunk: &MapChunk, chunk_size: i32, s } for (x, northbound) in chunk.exits[0].iter().enumerate() { if *northbound { - let map_idx = map.xy_idx(start_x + x as i32, start_y); + let map_idx = map.xy_idx(start_x + (x as i32), start_y); map.tiles[map_idx] = TileType::DownStair; } } for (x, southbound) in chunk.exits[1].iter().enumerate() { if *southbound { - let map_idx = map.xy_idx(start_x + x as i32, start_y + chunk_size - 1); + let map_idx = map.xy_idx(start_x + (x as i32), start_y + chunk_size - 1); map.tiles[map_idx] = TileType::DownStair; } } for (x, westbound) in chunk.exits[2].iter().enumerate() { if *westbound { - let map_idx = map.xy_idx(start_x, start_y + x as i32); + let map_idx = map.xy_idx(start_x, start_y + (x as i32)); map.tiles[map_idx] = TileType::DownStair; } } for (x, eastbound) in chunk.exits[3].iter().enumerate() { if *eastbound { - let map_idx = map.xy_idx(start_x + chunk_size - 1, start_y + x as i32); + let map_idx = map.xy_idx(start_x + chunk_size - 1, start_y + (x as i32)); map.tiles[map_idx] = TileType::DownStair; } } diff --git a/src/map_builders/wfc/mod.rs b/src/map_builders/wfc/mod.rs index 2cc2ff2..3ee7504 100644 --- a/src/map_builders/wfc/mod.rs +++ b/src/map_builders/wfc/mod.rs @@ -1,5 +1,5 @@ use super::{ BuilderMap, Map, MetaMapBuilder, TileType }; -use rltk::RandomNumberGenerator; +use bracket_lib::prelude::*; mod common; use common::*; mod constraints; @@ -11,7 +11,7 @@ use solver::*; pub struct WaveFunctionCollapseBuilder {} impl MetaMapBuilder for WaveFunctionCollapseBuilder { - fn build_map(&mut self, rng: &mut rltk::RandomNumberGenerator, build_data: &mut BuilderMap) { + fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) { self.build(rng, build_data); } } @@ -54,7 +54,12 @@ impl WaveFunctionCollapseBuilder { build_data.spawn_list.clear(); } - fn render_tile_gallery(&mut self, constraints: &[MapChunk], chunk_size: i32, build_data: &mut BuilderMap) { + fn render_tile_gallery( + &mut self, + constraints: &[MapChunk], + chunk_size: i32, + build_data: &mut BuilderMap + ) { build_data.map = Map::new( false, 0, diff --git a/src/map_builders/wfc/solver.rs b/src/map_builders/wfc/solver.rs index 548f4df..1a8f826 100644 --- a/src/map_builders/wfc/solver.rs +++ b/src/map_builders/wfc/solver.rs @@ -1,5 +1,6 @@ -use super::{Map, MapChunk}; +use super::{ Map, MapChunk }; use std::collections::HashSet; +use bracket_lib::prelude::*; pub struct Solver { constraints: Vec, @@ -16,7 +17,7 @@ impl Solver { let chunks_x = (map.width / chunk_size) as usize; let chunks_y = (map.height / chunk_size) as usize; let mut remaining: Vec<(usize, i32)> = Vec::new(); - for i in 0..(chunks_x * chunks_y) { + for i in 0..chunks_x * chunks_y { remaining.push((i, 0)); } @@ -32,7 +33,7 @@ impl Solver { } fn chunk_idx(&self, x: usize, y: usize) -> usize { - return ((y * self.chunks_x) + x) as usize; + return (y * self.chunks_x + x) as usize; } fn count_neighbours(&self, chunk_x: usize, chunk_y: usize) -> i32 { @@ -99,8 +100,11 @@ impl Solver { self.remaining = remain_copy; // Pick a random chunk we haven't dealt with yet and get its index, remove from remaining list - let remaining_index = - if !neighbours_exist { (rng.roll_dice(1, self.remaining.len() as i32) - 1) as usize } else { 0usize }; + let remaining_index = if !neighbours_exist { + (rng.roll_dice(1, self.remaining.len() as i32) - 1) as usize + } else { + 0usize + }; let chunk_index = self.remaining[remaining_index].0; self.remaining.remove(remaining_index); @@ -158,10 +162,10 @@ impl Solver { // There is nothing nearby, so we can have anything! let new_chunk_idx = (rng.roll_dice(1, self.constraints.len() as i32) - 1) as usize; self.chunks[chunk_index] = Some(new_chunk_idx); - let left_x = chunk_x as i32 * self.chunk_size as i32; - let right_x = (chunk_x as i32 + 1) * self.chunk_size as i32; - let top_y = chunk_y as i32 * self.chunk_size as i32; - let bottom_y = (chunk_y as i32 + 1) * self.chunk_size as i32; + let left_x = (chunk_x as i32) * (self.chunk_size as i32); + let right_x = ((chunk_x as i32) + 1) * (self.chunk_size as i32); + let top_y = (chunk_y as i32) * (self.chunk_size as i32); + let bottom_y = ((chunk_y as i32) + 1) * (self.chunk_size as i32); let mut i: usize = 0; for y in top_y..bottom_y { @@ -195,18 +199,21 @@ impl Solver { } if possible_options.is_empty() { - rltk::console::log("Oh no! It's not possible!"); + console::log("Oh no! It's not possible!"); self.possible = false; return true; } else { - let new_chunk_idx = - if possible_options.len() == 1 { 0 } else { rng.roll_dice(1, possible_options.len() as i32) - 1 }; + let new_chunk_idx = if possible_options.len() == 1 { + 0 + } else { + rng.roll_dice(1, possible_options.len() as i32) - 1 + }; self.chunks[chunk_index] = Some(new_chunk_idx as usize); - let left_x = chunk_x as i32 * self.chunk_size as i32; - let right_x = (chunk_x as i32 + 1) * self.chunk_size as i32; - let top_y = chunk_y as i32 * self.chunk_size as i32; - let bottom_y = (chunk_y as i32 + 1) * self.chunk_size as i32; + let left_x = (chunk_x as i32) * (self.chunk_size as i32); + let right_x = ((chunk_x as i32) + 1) * (self.chunk_size as i32); + let top_y = (chunk_y as i32) * (self.chunk_size as i32); + let bottom_y = ((chunk_y as i32) + 1) * (self.chunk_size as i32); let mut i: usize = 0; for y in top_y..bottom_y { diff --git a/src/melee_combat_system.rs b/src/melee_combat_system.rs index 55171e3..cc63807 100644 --- a/src/melee_combat_system.rs +++ b/src/melee_combat_system.rs @@ -25,7 +25,7 @@ use super::{ WeaponAttribute, config::CONFIG, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub struct MeleeCombatSystem {} @@ -50,7 +50,7 @@ impl<'a> System<'a> for MeleeCombatSystem { ReadStorage<'a, HungerClock>, ReadStorage<'a, MultiAttack>, ReadStorage<'a, Blind>, - WriteExpect<'a, rltk::RandomNumberGenerator>, + WriteExpect<'a, RandomNumberGenerator>, ); fn run(&mut self, data: Self::SystemData) { @@ -123,6 +123,7 @@ impl<'a> System<'a> for MeleeCombatSystem { } else { attacks.push(( MeleeWeapon { + damage_type: crate::DamageType::Physical, attribute: WeaponAttribute::Strength, damage_n_dice: 1, damage_die_type: 4, @@ -194,7 +195,8 @@ impl<'a> System<'a> for MeleeCombatSystem { armour_ac_bonus += ac.amount; } } - let actual_armour_class = bac - attribute_ac_bonus - skill_ac_bonus - armour_ac_bonus; + let actual_armour_class = + bac - attribute_ac_bonus - skill_ac_bonus - armour_ac_bonus; let mut armour_class_roll = actual_armour_class; if actual_armour_class < 0 { @@ -205,13 +207,17 @@ impl<'a> System<'a> for MeleeCombatSystem { } // Monster attacks receive a +10 to-hit bonus against the player. - let monster_v_player_bonus = if wants_melee.target == *player_entity { 10 } else { 0 }; + let monster_v_player_bonus = if wants_melee.target == *player_entity { + 10 + } else { + 0 + }; let target_number = monster_v_player_bonus + armour_class_roll + attacker_bonuses; let target_name = names.get(wants_melee.target).unwrap(); if CONFIG.logging.log_combat { - rltk::console::log( + console::log( format!( "ATTACKLOG: {} *{}* {}: rolled ({}) 1d20 vs. {} ({} + {}AC + {}to-hit)", &name.name, @@ -228,8 +234,14 @@ impl<'a> System<'a> for MeleeCombatSystem { if d20 < target_number { // Target hit! - let base_damage = rng.roll_dice(weapon_info.damage_n_dice, weapon_info.damage_die_type); - let skill_damage_bonus = gamesystem::skill_bonus(Skill::Melee, &*attacker_skills); + let base_damage = rng.roll_dice( + weapon_info.damage_n_dice, + weapon_info.damage_die_type + ); + let skill_damage_bonus = gamesystem::skill_bonus( + Skill::Melee, + &*attacker_skills + ); let mut attribute_damage_bonus = weapon_info.damage_bonus; match weapon_info.attribute { WeaponAttribute::Dexterity => { @@ -239,17 +251,23 @@ impl<'a> System<'a> for MeleeCombatSystem { attribute_damage_bonus += attacker_attributes.strength.bonus; } WeaponAttribute::Finesse => { - if attacker_attributes.dexterity.bonus > attacker_attributes.strength.bonus { + if + attacker_attributes.dexterity.bonus > + attacker_attributes.strength.bonus + { attribute_damage_bonus += attacker_attributes.dexterity.bonus; } else { attribute_damage_bonus += attacker_attributes.strength.bonus; } } } - let mut damage = i32::max(0, base_damage + skill_damage_bonus + attribute_damage_bonus); + let mut damage = i32::max( + 0, + base_damage + skill_damage_bonus + attribute_damage_bonus + ); if CONFIG.logging.log_combat { - rltk::console::log( + console::log( format!( "ATTACKLOG: {} HIT for {} ({}[{}d{}]+{}[skill]+{}[attr])", &name.name, @@ -267,7 +285,7 @@ impl<'a> System<'a> for MeleeCombatSystem { let ac_damage_reduction = rng.roll_dice(1, -actual_armour_class); damage = i32::min(1, damage - ac_damage_reduction); if CONFIG.logging.log_combat { - rltk::console::log( + console::log( format!( "ATTACKLOG: {} reduced their damage taken by {} (1dAC), and took {} hp damage.", &target_name.name, @@ -284,7 +302,7 @@ impl<'a> System<'a> for MeleeCombatSystem { } add_effect( Some(entity), - EffectType::Damage { amount: damage }, + EffectType::Damage { amount: damage, damage_type: weapon_info.damage_type }, Targets::Entity { target: wants_melee.target } ); if entity == *player_entity { @@ -321,7 +339,7 @@ impl<'a> System<'a> for MeleeCombatSystem { } } else { if CONFIG.logging.log_combat { - rltk::console::log(format!("ATTACKLOG: {} *MISSED*", &name.name)); + console::log(format!("ATTACKLOG: {} *MISSED*", &name.name)); } let pos = positions.get(wants_melee.target); @@ -365,7 +383,7 @@ impl<'a> System<'a> for MeleeCombatSystem { } fn get_natural_attacks( - rng: &mut rltk::RandomNumberGenerator, + rng: &mut RandomNumberGenerator, nat: NaturalAttacks, multi_attack: bool, attacks: &mut Vec<(MeleeWeapon, String)> @@ -375,6 +393,7 @@ fn get_natural_attacks( for a in nat.attacks.iter() { attacks.push(( MeleeWeapon { + damage_type: a.damage_type, attribute: WeaponAttribute::Strength, hit_bonus: a.hit_bonus, damage_n_dice: a.damage_n_dice, @@ -392,6 +411,7 @@ fn get_natural_attacks( }; attacks.push(( MeleeWeapon { + damage_type: nat.attacks[attack_index].damage_type, attribute: WeaponAttribute::Strength, hit_bonus: nat.attacks[attack_index].hit_bonus, damage_n_dice: nat.attacks[attack_index].damage_n_dice, diff --git a/src/morgue.rs b/src/morgue.rs index 1a8283f..b0160d9 100644 --- a/src/morgue.rs +++ b/src/morgue.rs @@ -6,8 +6,8 @@ use crate::gamelog; use crate::components::*; use crate::gui::{ Class, Ancestry, unobf_name_ecs }; use specs::prelude::*; -use rltk::prelude::*; -use rltk::to_char; +use bracket_lib::prelude::*; +use to_char; use std::collections::HashMap; use crate::data::events::*; @@ -49,7 +49,14 @@ fn create_file_name(ecs: &World, morgue_dir: &str) -> String { Ancestry::Catfolk => "catfolk", Ancestry::NULL => "NULL", }; - return format!("{}/lv{}-{}-{}-{}.txt", morgue_dir, &pool.level, &ancestry, &class, get_timestamp()); + return format!( + "{}/lv{}-{}-{}-{}.txt", + morgue_dir, + &pool.level, + &ancestry, + &class, + get_timestamp() + ); } fn create_morgue_string(ecs: &World) -> String { @@ -165,7 +172,12 @@ fn draw_map(ecs: &World) -> String { } }); } else { - glyph_u16 = crate::map::themes::get_tile_renderables_for_id(idx, &*map, None, Some(true)).0; + glyph_u16 = crate::map::themes::get_tile_renderables_for_id( + idx, + &*map, + None, + Some(true) + ).0; } let char = to_char((glyph_u16 & 0xff) as u8); result.push_str(&char.to_string()); @@ -201,7 +213,11 @@ fn draw_equipment(ecs: &World) -> String { EquipmentSlot::Back => "back -", EquipmentSlot::Neck => "neck -", }; - let name = if item.1 != 1 { unobf_name_ecs(ecs, item.0).1 } else { unobf_name_ecs(ecs, item.0).0 }; + let name = if item.1 != 1 { + unobf_name_ecs(ecs, item.0).1 + } else { + unobf_name_ecs(ecs, item.0).0 + }; result.push_str(&format!("{:>8} {}\n", slot, name)); } result.push_str("\n"); @@ -211,7 +227,11 @@ fn draw_equipment(ecs: &World) -> String { fn draw_backpack(ecs: &World) -> String { // Get all of the player's backpack. let mut pack: HashMap<(String, String), (i32, Entity)> = HashMap::new(); - for (entity, _bp, _n) in (&ecs.entities(), &ecs.read_storage::(), &ecs.read_storage::()) + for (entity, _bp, _n) in ( + &ecs.entities(), + &ecs.read_storage::(), + &ecs.read_storage::(), + ) .join() .filter(|item| item.1.owner == *ecs.fetch::()) { pack.entry(unobf_name_ecs(ecs, entity)) diff --git a/src/particle_system.rs b/src/particle_system.rs index 912a4ae..69e12b7 100644 --- a/src/particle_system.rs +++ b/src/particle_system.rs @@ -1,5 +1,5 @@ -use super::{ ParticleLifetime, Position, Renderable, Rltk }; -use rltk::RGB; +use super::{ ParticleLifetime, Position, Renderable, BTerm }; +use bracket_lib::prelude::*; use specs::prelude::*; use crate::data::visuals::{ DEFAULT_PARTICLE_LIFETIME, SHORT_PARTICLE_LIFETIME }; @@ -8,12 +8,12 @@ use crate::data::visuals::{ DEFAULT_PARTICLE_LIFETIME, SHORT_PARTICLE_LIFETIME } // running through a list and removing the frame_time_ms from the // delay. When delay is <= 0, make a particle_builder.request for // the particle. -pub fn particle_ticker(ecs: &mut World, ctx: &Rltk) { +pub fn particle_ticker(ecs: &mut World, ctx: &BTerm) { cull_dead_particles(ecs, ctx); create_delayed_particles(ecs, ctx); } -fn cull_dead_particles(ecs: &mut World, ctx: &Rltk) { +fn cull_dead_particles(ecs: &mut World, ctx: &BTerm) { let mut dead_particles: Vec = Vec::new(); { // Age out particles @@ -39,7 +39,7 @@ pub fn check_queue(ecs: &World) -> bool { return false; } -fn create_delayed_particles(ecs: &mut World, ctx: &Rltk) { +fn create_delayed_particles(ecs: &mut World, ctx: &BTerm) { let mut particle_builder = ecs.write_resource::(); let mut handled_particles: Vec = Vec::new(); for delayed_particle in particle_builder.delayed_requests.iter_mut() { @@ -76,11 +76,20 @@ fn create_delayed_particles(ecs: &mut World, ctx: &Rltk) { .unwrap(); particle_builder.delayed_requests.remove(index); let p = entities.create(); - positions.insert(p, Position { x: handled.x, y: handled.y }).expect("Could not insert position"); + positions + .insert(p, Position { x: handled.x, y: handled.y }) + .expect("Could not insert position"); renderables - .insert(p, Renderable { fg: handled.fg, bg: handled.bg, glyph: handled.glyph, render_order: 0 }) + .insert(p, Renderable { + fg: handled.fg, + bg: handled.bg, + glyph: handled.glyph, + render_order: 0, + }) .expect("Could not insert renderables"); - particles.insert(p, ParticleLifetime { lifetime_ms: handled.lifetime }).expect("Could not insert lifetime"); + particles + .insert(p, ParticleLifetime { lifetime_ms: handled.lifetime }) + .expect("Could not insert lifetime"); } } @@ -90,7 +99,7 @@ pub struct ParticleRequest { y: i32, fg: RGB, bg: RGB, - glyph: rltk::FontCharType, + glyph: FontCharType, lifetime: f32, } @@ -112,11 +121,28 @@ impl ParticleBuilder { } /// Makes a single particle request. - pub fn request(&mut self, x: i32, y: i32, fg: RGB, bg: RGB, glyph: rltk::FontCharType, lifetime: f32) { + pub fn request( + &mut self, + x: i32, + y: i32, + fg: RGB, + bg: RGB, + glyph: FontCharType, + lifetime: f32 + ) { self.requests.push(ParticleRequest { x, y, fg, bg, glyph, lifetime }); } - pub fn delay(&mut self, x: i32, y: i32, fg: RGB, bg: RGB, glyph: rltk::FontCharType, lifetime: f32, delay: f32) { + pub fn delay( + &mut self, + x: i32, + y: i32, + fg: RGB, + bg: RGB, + glyph: FontCharType, + lifetime: f32, + delay: f32 + ) { self.delayed_requests.push(DelayedParticleRequest { delay: delay, particle: ParticleRequest { x, y, fg, bg, glyph, lifetime }, @@ -127,9 +153,9 @@ impl ParticleBuilder { self.request( x, y, - rltk::RGB::named(rltk::ORANGE), - rltk::RGB::named(rltk::BLACK), - rltk::to_cp437('‼'), + RGB::named(ORANGE), + RGB::named(BLACK), + to_cp437('‼'), DEFAULT_PARTICLE_LIFETIME ); } @@ -138,9 +164,9 @@ impl ParticleBuilder { self.request( x, y, - rltk::RGB::named(rltk::CYAN), - rltk::RGB::named(rltk::BLACK), - rltk::to_cp437('‼'), + RGB::named(CYAN), + RGB::named(BLACK), + to_cp437('‼'), DEFAULT_PARTICLE_LIFETIME ); } @@ -149,9 +175,9 @@ impl ParticleBuilder { self.request( x, y, - rltk::RGB::named(rltk::CHOCOLATE), - rltk::RGB::named(rltk::BLACK), - rltk::to_cp437('‼'), + RGB::named(CHOCOLATE), + RGB::named(BLACK), + to_cp437('‼'), SHORT_PARTICLE_LIFETIME ); } @@ -164,57 +190,97 @@ impl ParticleBuilder { y: i32, fg: RGB, bg: RGB, - glyph: rltk::FontCharType, + glyph: FontCharType, lifetime: f32, secondary_fg: RGB ) { let eighth_l = lifetime / 8.0; let quarter_l = eighth_l * 2.0; self.request(x, y, fg, bg, glyph, lifetime); - self.delay(x + 1, y + 1, secondary_fg.lerp(bg, 0.8), bg, rltk::to_cp437('/'), quarter_l, eighth_l); - self.delay(x + 1, y - 1, secondary_fg.lerp(bg, 0.6), bg, rltk::to_cp437('\\'), quarter_l, quarter_l); - self.delay(x - 1, y - 1, secondary_fg.lerp(bg, 0.2), bg, rltk::to_cp437('/'), quarter_l, eighth_l * 3.0); - self.delay(x - 1, y + 1, secondary_fg.lerp(bg, 0.4), bg, rltk::to_cp437('\\'), quarter_l, lifetime); + self.delay( + x + 1, + y + 1, + secondary_fg.lerp(bg, 0.8), + bg, + to_cp437('/'), + quarter_l, + eighth_l + ); + self.delay( + x + 1, + y - 1, + secondary_fg.lerp(bg, 0.6), + bg, + to_cp437('\\'), + quarter_l, + quarter_l + ); + self.delay( + x - 1, + y - 1, + secondary_fg.lerp(bg, 0.2), + bg, + to_cp437('/'), + quarter_l, + eighth_l * 3.0 + ); + self.delay( + x - 1, + y + 1, + secondary_fg.lerp(bg, 0.4), + bg, + to_cp437('\\'), + quarter_l, + lifetime + ); } // Makes a rainbow particle request in the shape of an 'x'. Sort of. #[allow(dead_code)] - pub fn request_rainbow_star(&mut self, x: i32, y: i32, glyph: rltk::FontCharType, lifetime: f32) { - let bg = RGB::named(rltk::BLACK); + pub fn request_rainbow_star(&mut self, x: i32, y: i32, glyph: FontCharType, lifetime: f32) { + let bg = RGB::named(BLACK); let eighth_l = lifetime / 8.0; let quarter_l = eighth_l * 2.0; let half_l = quarter_l * 2.0; - self.request(x, y, RGB::named(rltk::CYAN), bg, glyph, lifetime); - self.delay(x + 1, y + 1, RGB::named(rltk::RED), bg, rltk::to_cp437('\\'), half_l, eighth_l); - self.delay(x + 1, y - 1, RGB::named(rltk::ORANGE), bg, rltk::to_cp437('/'), half_l, quarter_l); - self.delay(x - 1, y - 1, RGB::named(rltk::GREEN), bg, rltk::to_cp437('\\'), half_l, eighth_l * 3.0); - self.delay(x - 1, y + 1, RGB::named(rltk::YELLOW), bg, rltk::to_cp437('/'), half_l, half_l); + self.request(x, y, RGB::named(CYAN), bg, glyph, lifetime); + self.delay(x + 1, y + 1, RGB::named(RED), bg, to_cp437('\\'), half_l, eighth_l); + self.delay(x + 1, y - 1, RGB::named(ORANGE), bg, to_cp437('/'), half_l, quarter_l); + self.delay(x - 1, y - 1, RGB::named(GREEN), bg, to_cp437('\\'), half_l, eighth_l * 3.0); + self.delay(x - 1, y + 1, RGB::named(YELLOW), bg, to_cp437('/'), half_l, half_l); } // Makes a rainbow particle request. Sort of. #[allow(dead_code)] - pub fn request_rainbow(&mut self, x: i32, y: i32, glyph: rltk::FontCharType, lifetime: f32) { - let bg = RGB::named(rltk::BLACK); + pub fn request_rainbow(&mut self, x: i32, y: i32, glyph: FontCharType, lifetime: f32) { + let bg = RGB::named(BLACK); let eighth_l = lifetime / 8.0; - self.request(x, y, RGB::named(rltk::RED), bg, glyph, eighth_l); - self.delay(x, y, RGB::named(rltk::ORANGE), bg, glyph, eighth_l, eighth_l); - self.delay(x, y, RGB::named(rltk::YELLOW), bg, glyph, eighth_l, eighth_l * 2.0); - self.delay(x, y, RGB::named(rltk::GREEN), bg, glyph, eighth_l, eighth_l * 3.0); - self.delay(x, y, RGB::named(rltk::BLUE), bg, glyph, eighth_l, eighth_l * 4.0); - self.delay(x, y, RGB::named(rltk::INDIGO), bg, glyph, eighth_l, eighth_l * 5.0); - self.delay(x, y, RGB::named(rltk::VIOLET), bg, glyph, eighth_l, eighth_l * 6.0); + self.request(x, y, RGB::named(RED), bg, glyph, eighth_l); + self.delay(x, y, RGB::named(ORANGE), bg, glyph, eighth_l, eighth_l); + self.delay(x, y, RGB::named(YELLOW), bg, glyph, eighth_l, eighth_l * 2.0); + self.delay(x, y, RGB::named(GREEN), bg, glyph, eighth_l, eighth_l * 3.0); + self.delay(x, y, RGB::named(BLUE), bg, glyph, eighth_l, eighth_l * 4.0); + self.delay(x, y, RGB::named(INDIGO), bg, glyph, eighth_l, eighth_l * 5.0); + self.delay(x, y, RGB::named(VIOLET), bg, glyph, eighth_l, eighth_l * 6.0); } /// Makes a particle request in the shape of a +. #[allow(dead_code)] - pub fn request_plus(&mut self, x: i32, y: i32, fg: RGB, bg: RGB, glyph: rltk::FontCharType, lifetime: f32) { + pub fn request_plus( + &mut self, + x: i32, + y: i32, + fg: RGB, + bg: RGB, + glyph: FontCharType, + lifetime: f32 + ) { self.request(x, y, fg, bg, glyph, lifetime * 2.0); - self.request(x + 1, y, fg, bg, rltk::to_cp437('─'), lifetime); - self.request(x - 1, y, fg, bg, rltk::to_cp437('─'), lifetime); - self.request(x, y + 1, fg, bg, rltk::to_cp437('│'), lifetime); - self.request(x, y - 1, fg, bg, rltk::to_cp437('│'), lifetime); + self.request(x + 1, y, fg, bg, to_cp437('─'), lifetime); + self.request(x - 1, y, fg, bg, to_cp437('─'), lifetime); + self.request(x, y + 1, fg, bg, to_cp437('│'), lifetime); + self.request(x, y - 1, fg, bg, to_cp437('│'), lifetime); } } @@ -235,7 +301,9 @@ impl<'a> System<'a> for ParticleSpawnSystem { for new_particle in particle_builder.requests.iter() { let p = entities.create(); - positions.insert(p, Position { x: new_particle.x, y: new_particle.y }).expect("Could not insert position"); + positions + .insert(p, Position { x: new_particle.x, y: new_particle.y }) + .expect("Could not insert position"); renderables .insert(p, Renderable { fg: new_particle.fg, diff --git a/src/player.rs b/src/player.rs index 3a2970b..dd8ecf3 100644 --- a/src/player.rs +++ b/src/player.rs @@ -19,7 +19,6 @@ use super::{ Item, Map, Name, - ParticleBuilder, Player, Pools, Position, @@ -33,9 +32,9 @@ use super::{ WantsToPickupItem, get_dest, Destination, + DamageType, }; -use rltk::prelude::*; -use rltk::{ Point, RandomNumberGenerator, Rltk, VirtualKeyCode }; +use bracket_lib::prelude::*; use specs::prelude::*; use std::cmp::{ max, min }; use crate::data::events::*; @@ -133,7 +132,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState { std::mem::drop(renderables); let mut renderables = ecs.write_storage::(); let render_data = renderables.get_mut(potential_target).unwrap(); - render_data.glyph = rltk::to_cp437('+'); // Nethack open door, maybe just use '/' instead. + render_data.glyph = to_cp437('+'); // Nethack open door, maybe just use '/' instead. door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); } result = RunState::Ticking; @@ -230,7 +229,7 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState { std::mem::drop(renderables); let mut renderables = ecs.write_storage::(); let render_data = renderables.get_mut(potential_target).unwrap(); - render_data.glyph = rltk::to_cp437('▓'); // Nethack open door, maybe just use '/' instead. + render_data.glyph = to_cp437('▓'); // Nethack open door, maybe just use '/' instead. door_pos = Some(Point::new(pos.x + delta_x, pos.y + delta_y)); } result = RunState::Ticking; @@ -292,7 +291,7 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState { if rng.roll_dice(1, 20) == 20 { add_effect( None, - EffectType::Damage { amount: 1 }, + EffectType::Damage { amount: 1, damage_type: DamageType::Physical }, Targets::Entity { target: entity } ); gamelog::Logger @@ -352,7 +351,7 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState { destroyed_pos = Some( Point::new(pos.x + delta_x, pos.y + delta_y) ); - gamelog::record_event(EVENT::BROKE_DOOR(1)); + gamelog::record_event(EVENT::BrokeDoor(1)); return false; // 66% chance of just kicking it. } else { @@ -416,7 +415,7 @@ pub fn kick(i: i32, j: i32, ecs: &mut World) -> RunState { ecs.delete_entity(destroyed_thing).expect("Unable to delete."); } - gamelog::record_event(EVENT::KICKED_SOMETHING(1)); + gamelog::record_event(EVENT::KickedSomething(1)); return RunState::Ticking; } @@ -505,7 +504,7 @@ pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) -> RunState ::new() .append("The") .colour(colour) - .append_n(&name.name) + .append(&name.name) .colour(WHITE) .append("is in your way.") .log(); @@ -643,7 +642,7 @@ fn get_item(ecs: &mut World) -> RunState { } } -pub fn player_input(gs: &mut State, ctx: &mut Rltk, on_overmap: bool) -> RunState { +pub fn player_input(gs: &mut State, ctx: &mut BTerm, on_overmap: bool) -> RunState { match ctx.key { None => { return RunState::AwaitingInput; @@ -878,7 +877,7 @@ pub fn auto_explore(ecs: &mut World) { } } - let path = rltk::a_star_search(map.xy_idx(player_pos.x, player_pos.y), unexplored_tile.0, &*map); + let path = a_star_search(map.xy_idx(player_pos.x, player_pos.y), unexplored_tile.0, &*map); if path.success && path.steps.len() > 1 { let mut idx = map.xy_idx(player_pos.x, player_pos.y); map.blocked[idx] = false; diff --git a/src/random_table.rs b/src/random_table.rs index 4baa921..d4720f0 100644 --- a/src/random_table.rs +++ b/src/random_table.rs @@ -1,4 +1,4 @@ -use rltk::RandomNumberGenerator; +use bracket_lib::random::RandomNumberGenerator; // FIXME: note to self, // passing around strings here is super inefficient, so this is diff --git a/src/raws/mob_structs.rs b/src/raws/mob_structs.rs index cfd673b..854149b 100644 --- a/src/raws/mob_structs.rs +++ b/src/raws/mob_structs.rs @@ -14,7 +14,7 @@ pub struct Mob { pub attacks: Option>, pub attributes: Option, pub skills: Option>, - pub vision_range: i32, + pub vision_range: Option, pub telepathy_range: Option, pub equipped: Option>, pub loot: Option, diff --git a/src/raws/mod.rs b/src/raws/mod.rs index d336f1b..7fc28ed 100644 --- a/src/raws/mod.rs +++ b/src/raws/mod.rs @@ -15,6 +15,7 @@ mod reaction_structs; pub use reaction_structs::Reaction; use reaction_structs::{ AncestryData, FactionData }; use std::sync::Mutex; +use bracket_lib::prelude::*; lazy_static! { pub static ref RAWS: Mutex = Mutex::new(RawMaster::empty()); @@ -31,22 +32,22 @@ pub struct Raws { pub ancestries: Vec, } -rltk::embedded_resource!(RAW_ITEMS, "../../raws/items.json"); -rltk::embedded_resource!(RAW_MOBS, "../../raws/mobs.json"); -rltk::embedded_resource!(RAW_PROPS, "../../raws/props.json"); -rltk::embedded_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); -rltk::embedded_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); -rltk::embedded_resource!(RAW_FACTIONS, "../../raws/factions.json"); -rltk::embedded_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); +embedded_resource!(RAW_ITEMS, "../../raws/items.json"); +embedded_resource!(RAW_MOBS, "../../raws/mobs.json"); +embedded_resource!(RAW_PROPS, "../../raws/props.json"); +embedded_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); +embedded_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); +embedded_resource!(RAW_FACTIONS, "../../raws/factions.json"); +embedded_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); pub fn load_raws() { - rltk::link_resource!(RAW_ITEMS, "../../raws/items.json"); - rltk::link_resource!(RAW_MOBS, "../../raws/mobs.json"); - rltk::link_resource!(RAW_PROPS, "../../raws/props.json"); - rltk::link_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); - rltk::link_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); - rltk::link_resource!(RAW_FACTIONS, "../../raws/factions.json"); - rltk::link_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); + link_resource!(RAW_ITEMS, "../../raws/items.json"); + link_resource!(RAW_MOBS, "../../raws/mobs.json"); + link_resource!(RAW_PROPS, "../../raws/props.json"); + link_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); + link_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); + link_resource!(RAW_FACTIONS, "../../raws/factions.json"); + link_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); let decoded_raws = get_decoded_raws(); RAWS.lock().unwrap().load(decoded_raws); @@ -56,10 +57,18 @@ pub fn get_decoded_raws() -> Raws { let items: Vec = ParseJson::parse_raws_into_vector("../../raws/items.json".to_string()); let mobs: Vec = ParseJson::parse_raws_into_vector("../../raws/mobs.json".to_string()); let props: Vec = ParseJson::parse_raws_into_vector("../../raws/props.json".to_string()); - let spawn_tables: Vec = ParseJson::parse_raws_into_vector("../../raws/spawn_tables.json".to_string()); - let loot_tables: Vec = ParseJson::parse_raws_into_vector("../../raws/loot_tables.json".to_string()); - let factions: Vec = ParseJson::parse_raws_into_vector("../../raws/factions.json".to_string()); - let ancestries: Vec = ParseJson::parse_raws_into_vector("../../raws/ancestries.json".to_string()); + let spawn_tables: Vec = ParseJson::parse_raws_into_vector( + "../../raws/spawn_tables.json".to_string() + ); + let loot_tables: Vec = ParseJson::parse_raws_into_vector( + "../../raws/loot_tables.json".to_string() + ); + let factions: Vec = ParseJson::parse_raws_into_vector( + "../../raws/factions.json".to_string() + ); + let ancestries: Vec = ParseJson::parse_raws_into_vector( + "../../raws/ancestries.json".to_string() + ); return Raws { items, mobs, props, spawn_tables, loot_tables, factions, ancestries }; } @@ -71,7 +80,7 @@ macro_rules! impl_ParseJson { (for $($t:ty),+) => { $(impl ParseJson for $t { fn parse_raws_into_vector(path: String) -> $t { - let raw_data = rltk::embedding::EMBED.lock().get_resource(path).unwrap(); + let raw_data = EMBED.lock().get_resource(path).unwrap(); let raw_string = std::str::from_utf8(&raw_data).expect("Failed to convert UTF-8 to &str."); return serde_json::from_str(&raw_string).expect("Failed to convert &str to json"); } diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index 63f06b3..813dbe2 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -5,8 +5,8 @@ use crate::gui::Ancestry; use crate::random_table::RandomTable; use crate::config::CONFIG; use crate::data::visuals::BLOODSTAIN_COLOUR; -use regex::Regex; -use rltk::prelude::*; +use crate::data::entity::DEFAULT_VIEWSHED_STANDARD; +use bracket_lib::prelude::*; use specs::prelude::*; use specs::saveload::{ MarkedBuilder, SimpleMarker }; use std::collections::{ HashMap, HashSet }; @@ -19,13 +19,13 @@ macro_rules! apply_effects { let effect_name = effect.0.as_str(); match effect_name { "heal" => { - let (n_dice, sides, modifier) = parse_dice_string(effect.1.as_str()); - $eb = $eb.with(ProvidesHealing { n_dice, sides, modifier }) + let dice = parse_dice_string(effect.1.as_str()).expect("Failed to parse dice string"); + $eb = $eb.with(ProvidesHealing { n_dice: dice.n_dice, sides: dice.die_type, modifier: dice.bonus }) } "ranged" => $eb = $eb.with(Ranged { range: effect.1.parse::().unwrap() }), "damage" => { - let (n_dice, sides, modifier) = parse_dice_string(effect.1.as_str()); - $eb = $eb.with(InflictsDamage { n_dice, sides, modifier }) + let (damage_type, dice) = parse_damage_string(effect.1.as_str()); + $eb = $eb.with(InflictsDamage { damage_type, n_dice: dice.n_dice, sides: dice.die_type, modifier: dice.bonus }) } "aoe" => $eb = $eb.with(AOE { radius: effect.1.parse::().unwrap() }), "confusion" => $eb = $eb.with(Confusion { turns: effect.1.parse::().unwrap() }), @@ -44,6 +44,7 @@ macro_rules! apply_effects { /// flags are components that have no parameters to modify. macro_rules! apply_flags { ($flags:expr, $eb:expr) => { + let mut damage_modifiers: HashMap = HashMap::new(); for flag in $flags.iter() { match flag.as_str() { // --- PROP FLAGS BEGIN HERE --- @@ -88,6 +89,22 @@ macro_rules! apply_flags { "NEUTRAL" => $eb = $eb.with(Faction { name: "neutral".to_string() }), "HERBIVORE" => $eb = $eb.with(Faction { name: "herbivore".to_string() }), "CARNIVORE" => $eb = $eb.with(Faction { name: "carnivore".to_string() }), + // --- DAMAGE MODIFIERS --- + "PHYS_IMMUNITY" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Immune); } + "PHYS_WEAK" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Weakness); } + "PHYS_RES" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Resistance); } + "MAGIC_IMMUNITY" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Immune); } + "MAGIC_WEAK" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Weakness); } + "MAGIC_RES" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Resistance); } + "FIRE_IMMUNITY" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Immune); } + "FIRE_WEAK" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Weakness); } + "FIRE_RES" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Resistance); } + "COLD_IMMUNITY" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Immune); } + "COLD_WEAK" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Weakness); } + "COLD_RES" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Resistance); } + "POISON_IMMUNITY" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Immune); } + "POISON_WEAK" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Weakness); } + "POISON_RES" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Resistance); } // --- MOVEMENT MODES --- ( defaults to WANDER ) "STATIC" => $eb = $eb.with(MoveMode { mode: Movement::Static }), "RANDOM_PATH" => $eb = $eb.with(MoveMode { mode: Movement::RandomWaypoint { path: None } }), @@ -98,9 +115,12 @@ macro_rules! apply_flags { "LARGE_GROUP" => {} // and don't need to apply a component. "MULTIATTACK" => $eb = $eb.with(MultiAttack {}), "BLIND" => $eb = $eb.with(Blind {}), - _ => rltk::console::log(format!("Unrecognised flag: {}", flag.as_str())), + _ => console::log(format!("Unrecognised flag: {}", flag.as_str())), } } + if damage_modifiers.len() > 0 { + $eb = $eb.with(HasDamageModifiers { modifiers: damage_modifiers }); + } }; } @@ -203,13 +223,13 @@ impl RawMaster { /// Checks a string against a HashSet, logging if a duplicate is found. fn check_for_duplicate_entries(used_names: &HashSet, id: &String) { if used_names.contains(id) { - rltk::console::log(format!("DEBUGINFO: Duplicate ID found in raws [{}]", id)); + console::log(format!("DEBUGINFO: Duplicate ID found in raws [{}]", id)); } } /// Checks a string against a HashSet, logging if the string isn't found. fn check_for_unspecified_entity(used_names: &HashSet, id: &String) { if !used_names.contains(id) { - rltk::console::log(format!("DEBUGINFO: Table references unspecified entity [{}]", id)); + console::log(format!("DEBUGINFO: Table references unspecified entity [{}]", id)); } } @@ -266,8 +286,14 @@ pub fn spawn_named_item( // -- DROP EVERYTHING THAT INVOLVES THE ECS BEFORE THIS POINT --- let mut eb = ecs.create_entity().marked::>(); - eb = eb.with(Name { name: item_template.name.name.clone(), plural: item_template.name.plural.clone() }); - eb = eb.with(Item { weight: item_template.weight.unwrap_or(0.0), value: item_template.value.unwrap_or(0.0) }); + eb = eb.with(Name { + name: item_template.name.name.clone(), + plural: item_template.name.plural.clone(), + }); + eb = eb.with(Item { + weight: item_template.weight.unwrap_or(0.0), + value: item_template.value.unwrap_or(0.0), + }); eb = spawn_position(pos, eb, key, raws); if let Some(renderable) = &item_template.renderable { @@ -333,17 +359,18 @@ pub fn spawn_named_item( } if let Some(weapon) = &item_template.equip { - let (n_dice, die_type, bonus) = parse_dice_string(weapon.damage.as_str()); + let (damage_type, dice) = parse_damage_string(weapon.damage.as_str()); let weapon_attribute = match weapon.flag.as_str() { "DEXTERITY" => WeaponAttribute::Dexterity, "FINESSE" => WeaponAttribute::Finesse, _ => WeaponAttribute::Strength, }; let wpn = MeleeWeapon { + damage_type, attribute: weapon_attribute, - damage_n_dice: n_dice, - damage_die_type: die_type, - damage_bonus: bonus, + damage_n_dice: dice.n_dice, + damage_die_type: dice.die_type, + damage_bonus: dice.bonus, hit_bonus: weapon.to_hit.unwrap_or(0), }; eb = eb.with(wpn); @@ -379,7 +406,15 @@ pub fn spawn_named_mob( eb = ecs.create_entity().marked::>(); eb = spawn_position(pos, eb, key, raws); eb = eb.with(Name { name: mob_template.name.clone(), plural: mob_template.name.clone() }); - eb = eb.with(Viewshed { visible_tiles: Vec::new(), range: mob_template.vision_range as i32, dirty: true }); + eb = eb.with(Viewshed { + visible_tiles: Vec::new(), + range: if let Some(range) = mob_template.vision_range { + range + } else { + DEFAULT_VIEWSHED_STANDARD + }, + dirty: true, + }); if let Some(telepath) = &mob_template.telepathy_range { eb = eb.with(Telepath { telepath_tiles: Vec::new(), range: *telepath, dirty: true }); } @@ -447,7 +482,11 @@ pub fn spawn_named_mob( let speed = if mob_template.speed.is_some() { mob_template.speed.unwrap() } else { 12 }; eb = eb.with(Energy { current: 0, speed: speed }); - let base_mob_level = if mob_template.level.is_some() { mob_template.level.unwrap() } else { 0 }; + let base_mob_level = if mob_template.level.is_some() { + mob_template.level.unwrap() + } else { + 0 + }; let mut mob_level = base_mob_level; // If the level difficulty is smaller than the mob's base level, subtract 1; // else, if the level difficulty is larger, add one-fifth of the difference @@ -464,7 +503,7 @@ pub fn spawn_named_mob( mob_level = i32::min(mob_level, (1.5 * (base_mob_level as f32)).trunc() as i32); // Should really use existing RNG here - let mut rng = rltk::RandomNumberGenerator::new(); + let mut rng = RandomNumberGenerator::new(); let mob_hp = npc_hp_at_level(&mut rng, mob_con, mob_level); let mob_mana = mana_at_level(&mut rng, mob_int, mob_level); let mob_bac = if mob_template.bac.is_some() { mob_template.bac.unwrap() } else { 10 }; @@ -497,7 +536,7 @@ pub fn spawn_named_mob( skills.skills.insert(Skill::Magic, *sk.1); } _ => { - rltk::console::log(format!("Unknown skill referenced: [{}]", sk.0)); + console::log(format!("Unknown skill referenced: [{}]", sk.0)); } } } @@ -507,13 +546,14 @@ pub fn spawn_named_mob( if let Some(natural_attacks) = &mob_template.attacks { let mut natural = NaturalAttacks { attacks: Vec::new() }; for na in natural_attacks.iter() { - let (n, d, b) = parse_dice_string(&na.damage); + let (damage_type, dice) = parse_damage_string(&na.damage); let attack = NaturalAttack { name: na.name.clone(), + damage_type, hit_bonus: na.hit_bonus, - damage_n_dice: n, - damage_die_type: d, - damage_bonus: b, + damage_n_dice: dice.n_dice, + damage_die_type: dice.die_type, + damage_bonus: dice.bonus, }; natural.attacks.push(attack); } @@ -548,7 +588,7 @@ pub fn spawn_named_mob( } if CONFIG.logging.log_spawning { - rltk::console::log( + console::log( format!( "SPAWNLOG: {} ({}HP, {}MANA, {}BAC) spawned at level {} ({}[base], {}[map difficulty], {}[player level]), worth {} XP", &mob_template.name, @@ -569,7 +609,14 @@ pub fn spawn_named_mob( // Build entity, then check for anything they're wearing if let Some(wielding) = &mob_template.equipped { for tag in wielding.iter() { - spawn_named_entity(raws, ecs, tag, None, SpawnType::Equipped { by: new_mob }, map_difficulty); + spawn_named_entity( + raws, + ecs, + tag, + None, + SpawnType::Equipped { by: new_mob }, + map_difficulty + ); } } @@ -578,7 +625,12 @@ pub fn spawn_named_mob( None } -pub fn spawn_named_prop(raws: &RawMaster, ecs: &mut World, key: &str, pos: SpawnType) -> Option { +pub fn spawn_named_prop( + raws: &RawMaster, + ecs: &mut World, + key: &str, + pos: SpawnType +) -> Option { if raws.prop_index.contains_key(key) { // ENTITY BUILDER PREP let prop_template = &raws.raws.props[raws.prop_index[key]]; @@ -610,7 +662,12 @@ pub fn spawn_named_prop(raws: &RawMaster, ecs: &mut World, key: &str, pos: Spawn None } -fn spawn_position<'a>(pos: SpawnType, new_entity: EntityBuilder<'a>, tag: &str, raws: &RawMaster) -> EntityBuilder<'a> { +fn spawn_position<'a>( + pos: SpawnType, + new_entity: EntityBuilder<'a>, + tag: &str, + raws: &RawMaster +) -> EntityBuilder<'a> { let mut eb = new_entity; match pos { @@ -629,11 +686,13 @@ fn spawn_position<'a>(pos: SpawnType, new_entity: EntityBuilder<'a>, tag: &str, eb } -fn get_renderable_component(renderable: &super::item_structs::Renderable) -> crate::components::Renderable { +fn get_renderable_component( + renderable: &super::item_structs::Renderable +) -> crate::components::Renderable { crate::components::Renderable { - glyph: rltk::to_cp437(renderable.glyph.chars().next().unwrap()), - fg: rltk::RGB::from_hex(&renderable.fg).expect("Invalid RGB"), - bg: rltk::RGB::from_hex(&renderable.bg).expect("Invalid RGB"), + glyph: to_cp437(renderable.glyph.chars().next().unwrap()), + fg: RGB::from_hex(&renderable.fg).expect("Invalid RGB"), + bg: RGB::from_hex(&renderable.bg).expect("Invalid RGB"), render_order: renderable.order, } } @@ -668,19 +727,16 @@ pub fn table_by_name(raws: &RawMaster, key: &str, optional_difficulty: Option (i32, i32, i32) { +/*pub fn parse_dice_string(dice: &str) -> (i32, i32, i32) { lazy_static! { static ref DICE_RE: Regex = Regex::new(r"(\d+)d(\d+)([\+\-]\d+)?").unwrap(); } @@ -699,11 +755,11 @@ pub fn parse_dice_string(dice: &str) -> (i32, i32, i32) { } } (n_dice, die_type, die_bonus) -} +}*/ fn find_slot_for_equippable_item(tag: &str, raws: &RawMaster) -> EquipmentSlot { if !raws.item_index.contains_key(tag) { - panic!("Trying to equip an unknown item: {}", tag); + unreachable!("Tried to equip an unknown item: {}", tag); } let item_index = raws.item_index[tag]; let item = &raws.raws.items[item_index]; @@ -738,10 +794,14 @@ fn find_slot_for_equippable_item(tag: &str, raws: &RawMaster) -> EquipmentSlot { } } } - panic!("Trying to equip {}, but it has no slot tag.", tag); + unreachable!("Tried to equip {}, but it has no slot tag.", tag); } -pub fn roll_on_loot_table(raws: &RawMaster, rng: &mut RandomNumberGenerator, key: &str) -> Option { +pub fn roll_on_loot_table( + raws: &RawMaster, + rng: &mut RandomNumberGenerator, + key: &str +) -> Option { if raws.loot_index.contains_key(key) { console::log(format!("DEBUGINFO: Rolling on loot table: {}", key)); let mut rt = RandomTable::new(); @@ -792,7 +852,11 @@ pub fn get_mob_spawn_type(raws: &RawMaster, key: &str) -> SpawnsAs { return SpawnsAs::Single; } -pub fn get_mob_spawn_amount(rng: &mut RandomNumberGenerator, spawn_type: &SpawnsAs, player_level: i32) -> i32 { +pub fn get_mob_spawn_amount( + rng: &mut RandomNumberGenerator, + spawn_type: &SpawnsAs, + player_level: i32 +) -> i32 { let n = match spawn_type { // Single mobs always spawn alone. SpawnsAs::Single => 1, @@ -893,7 +957,11 @@ pub fn faction_reaction(this_faction: &str, other_faction: &str, raws: &RawMaste return Reaction::Ignore; } -pub fn ancestry_reaction(this_ancestry: Ancestry, other_ancestry: Ancestry, raws: &RawMaster) -> Option { +pub fn ancestry_reaction( + this_ancestry: Ancestry, + other_ancestry: Ancestry, + raws: &RawMaster +) -> Option { if this_ancestry == other_ancestry { return Some(Reaction::Ignore); } else { @@ -989,3 +1057,21 @@ fn parse_particle_burst(n: &str) -> SpawnParticleBurst { trail_lifetime_ms: tokens[7].parse::().unwrap(), } } + +fn parse_damage_string(n: &str) -> (DamageType, DiceType) { + let tokens: Vec<_> = n.split(';').collect(); + let damage_type = if tokens.len() > 1 { + match tokens[1] { + "physical" => DamageType::Physical, + "magic" => DamageType::Magic, + "fire" => DamageType::Fire, + "cold" => DamageType::Cold, + "poison" => DamageType::Poison, + _ => unreachable!("Unrecognised damage type in raws: {}", tokens[1]), + } + } else { + DamageType::Physical + }; + let dice = parse_dice_string(tokens[0]).expect("Failed to parse dice string"); + return (damage_type, dice); +} diff --git a/src/rex_assets.rs b/src/rex_assets.rs index b451e94..4302c34 100644 --- a/src/rex_assets.rs +++ b/src/rex_assets.rs @@ -1,8 +1,8 @@ -use rltk::rex::XpFile; +use bracket_lib::prelude::*; -rltk::embedded_resource!(TITLEIMAGE_105_56_BYTES, "../resources/title_image.xp"); -rltk::embedded_resource!(WFC_DEMO_IMAGE1, "../resources/wfc-demo1.xp"); -rltk::embedded_resource!(WFC_POPULATED, "../resources/wfc-populated.xp"); +embedded_resource!(TITLEIMAGE_105_56_BYTES, "../resources/title_image.xp"); +embedded_resource!(WFC_DEMO_IMAGE1, "../resources/wfc-demo1.xp"); +embedded_resource!(WFC_POPULATED, "../resources/wfc-populated.xp"); pub struct RexAssets { pub menu: XpFile, @@ -11,9 +11,9 @@ pub struct RexAssets { impl RexAssets { #[allow(clippy::new_without_default)] pub fn new() -> RexAssets { - rltk::link_resource!(TITLEIMAGE_105_56_BYTES, "../resources/title_image.xp"); - rltk::link_resource!(WFC_DEMO_IMAGE1, "../resources/wfc-demo1.xp"); - rltk::link_resource!(WFC_POPULATED, "../resources/wfc-populated.xp"); + link_resource!(TITLEIMAGE_105_56_BYTES, "../resources/title_image.xp"); + link_resource!(WFC_DEMO_IMAGE1, "../resources/wfc-demo1.xp"); + link_resource!(WFC_POPULATED, "../resources/wfc-populated.xp"); RexAssets { menu: XpFile::from_resource("../resources/title_image.xp").unwrap() } } diff --git a/src/saveload_system.rs b/src/saveload_system.rs index 86bcec2..894e4ff 100644 --- a/src/saveload_system.rs +++ b/src/saveload_system.rs @@ -1,4 +1,5 @@ use super::components::*; +use bracket_lib::prelude::*; use specs::error::NoError; use specs::prelude::*; use specs::saveload::{ @@ -87,12 +88,14 @@ pub fn save_game(ecs: &mut World) { GrantsXP, HasAncestry, HasClass, + HasDamageModifiers, Hidden, HungerClock, IdentifiedBeatitude, IdentifiedItem, InBackpack, InflictsDamage, + Intrinsics, Item, KnownSpells, LootTable, @@ -217,12 +220,14 @@ pub fn load_game(ecs: &mut World) { GrantsXP, HasAncestry, HasClass, + HasDamageModifiers, Hidden, HungerClock, IdentifiedBeatitude, IdentifiedItem, InBackpack, InflictsDamage, + Intrinsics, Item, KnownSpells, LootTable, @@ -293,8 +298,8 @@ pub fn load_game(ecs: &mut World) { crate::gamelog::restore_events(h.events.clone()); } for (e, _p, pos) in (&entities, &player, &position).join() { - let mut ppos = ecs.write_resource::(); - *ppos = rltk::Point::new(pos.x, pos.y); + let mut ppos = ecs.write_resource::(); + *ppos = Point::new(pos.x, pos.y); let mut player_resource = ecs.write_resource::(); *player_resource = e; } diff --git a/src/spawner.rs b/src/spawner.rs index b18f176..3fa673c 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -21,19 +21,20 @@ use super::{ SerializeMe, Skill, Skills, - TileType, tile_walkable, Viewshed, BlocksTile, Bleeds, + HasDamageModifiers, + Intrinsics, }; use crate::data::entity; use crate::data::visuals::BLOODSTAIN_COLOUR; use crate::gamesystem::*; -use rltk::{ RandomNumberGenerator, RGB }; +use bracket_lib::prelude::*; use specs::prelude::*; use specs::saveload::{ MarkedBuilder, SimpleMarker }; -use std::collections::HashMap; +use std::collections::{ HashMap, HashSet }; /// Spawns the player and returns his/her entity object. pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { @@ -52,9 +53,9 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { .with(Position { x: player_x, y: player_y }) .with(BlocksTile {}) .with(Renderable { - glyph: rltk::to_cp437('@'), - fg: RGB::named(rltk::YELLOW), - bg: RGB::named(rltk::BLACK), + glyph: to_cp437('@'), + fg: RGB::named(YELLOW), + bg: RGB::named(BLACK), render_order: 0, }) .with(Bleeds { colour: RGB::named(BLOODSTAIN_COLOUR) }) @@ -87,7 +88,9 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { weight: 0.0, god: false, }) - .with(EquipmentChanged {}) + .with(HasDamageModifiers { modifiers: HashMap::new() }) + .with(Intrinsics { list: HashSet::new() }) + .with(EquipmentChanged {}) // To force re-calc of equipment bonuses. .with(skills) .with(Energy { current: 0, speed: entity::NORMAL_SPEED }) .marked::>() @@ -132,7 +135,7 @@ pub fn spawn_region( let difficulty = (map.difficulty + player_level) / 2; // If no area, log and return. if areas.len() == 0 { - rltk::console::log("DEBUGINFO: No areas capable of spawning mobs!"); + console::log("DEBUGINFO: No areas capable of spawning mobs!"); return; } // Get num of each entity type. @@ -212,7 +215,7 @@ pub fn spawn_entity(ecs: &mut World, spawn: &(&usize, &String)) { return; } - rltk::console::log(format!("WARNING: We don't know how to spawn [{}]!", spawn.1)); + console::log(format!("WARNING: We don't know how to spawn [{}]!", spawn.1)); } // 3 scrolls : 3 potions : 1 equipment : 1 wand? diff --git a/src/states/state.rs b/src/states/state.rs index 0bc9533..f00058f 100644 --- a/src/states/state.rs +++ b/src/states/state.rs @@ -1,5 +1,5 @@ use specs::prelude::*; -use rltk::prelude::*; +use bracket_lib::prelude::*; use super::runstate::RunState; use crate::map::*; use crate::hunger_system; @@ -125,10 +125,10 @@ impl State { .append("You head to") .colour(rgb_to_u8(get_local_col(id))) .append_n(&mapname) - .colour(rltk::WHITE) + .colour(WHITE) .period() .log(); - gamelog::record_event(EVENT::CHANGED_FLOOR(mapname)); + gamelog::record_event(EVENT::ChangedFloor(mapname)); } fn game_over_cleanup(&mut self) { @@ -152,12 +152,12 @@ impl State { self.generate_world_map(1, TileType::Floor); gamelog::setup_log(); - gamelog::record_event(EVENT::LEVEL(1)); + gamelog::record_event(EVENT::Level(1)); } } impl GameState for State { - fn tick(&mut self, ctx: &mut Rltk) { + fn tick(&mut self, ctx: &mut BTerm) { let mut new_runstate; { let runstate = self.ecs.fetch::(); @@ -518,7 +518,7 @@ impl GameState for State { let result = gui::show_help(ctx); match result { gui::YesNoResult::Yes => { - gamelog::record_event(EVENT::LOOKED_FOR_HELP(1)); + gamelog::record_event(EVENT::LookedForHelp(1)); new_runstate = RunState::AwaitingInput; } _ => {} @@ -591,6 +591,6 @@ impl GameState for State { damage_system::delete_the_dead(&mut self.ecs); - let _ = rltk::render_draw_buffer(ctx); + let _ = render_draw_buffer(ctx); } } diff --git a/src/trigger_system.rs b/src/trigger_system.rs index 6eeddf4..4c2c779 100644 --- a/src/trigger_system.rs +++ b/src/trigger_system.rs @@ -11,7 +11,7 @@ use super::{ Renderable, AOE, }; -use rltk::prelude::*; +use bracket_lib::prelude::*; use specs::prelude::*; pub struct TriggerSystem {} @@ -30,7 +30,8 @@ impl<'a> System<'a> for TriggerSystem { ); fn run(&mut self, data: Self::SystemData) { - let (map, mut entity_moved, position, entry_trigger, names, entities, aoes, renderables) = data; + let (map, mut entity_moved, position, entry_trigger, names, entities, aoes, renderables) = + data; for (entity, mut _entity_moved, pos) in (&entities, &mut entity_moved, &position).join() { let idx = map.xy_idx(pos.x, pos.y); crate::spatial::for_each_tile_content(idx, |entity_id| { @@ -51,15 +52,21 @@ impl<'a> System<'a> for TriggerSystem { .log(); } } - add_effect(Some(entity_id), EffectType::TriggerFire { trigger: entity_id }, if - let Some(aoe) = aoes.get(entity_id) - { - Targets::TileList { - targets: aoe_tiles(&*map, Point::new(pos.x, pos.y), aoe.radius), + add_effect( + Some(entity_id), + EffectType::TriggerFire { trigger: entity_id }, + if let Some(aoe) = aoes.get(entity_id) { + Targets::TileList { + targets: aoe_tiles( + &*map, + Point::new(pos.x, pos.y), + aoe.radius + ), + } + } else { + Targets::Tile { target: idx } } - } else { - Targets::Tile { target: idx } - }); + ); } } } diff --git a/src/visibility_system.rs b/src/visibility_system.rs index 31cc1ac..6abc4c3 100644 --- a/src/visibility_system.rs +++ b/src/visibility_system.rs @@ -13,7 +13,8 @@ use super::{ gui::renderable_colour, tile_blocks_telepathy, }; -use rltk::{ FieldOfViewAlg::SymmetricShadowcasting, Point }; +use bracket_lib::prelude::*; +use bracket_lib::pathfinding::FieldOfViewAlg::SymmetricShadowcasting; use specs::prelude::*; pub struct VisibilitySystem {} @@ -23,7 +24,7 @@ const BLIND_TELEPATHY_RANGE_MULTIPLIER: i32 = 3; impl<'a> System<'a> for VisibilitySystem { type SystemData = ( WriteExpect<'a, Map>, - WriteExpect<'a, rltk::RandomNumberGenerator>, + WriteExpect<'a, RandomNumberGenerator>, Entities<'a>, WriteStorage<'a, Viewshed>, WriteStorage<'a, Telepath>, @@ -74,8 +75,7 @@ impl<'a> System<'a> for VisibilitySystem { p.y >= 0 && p.y < map.height && (map.lit_tiles[map.xy_idx(p.x, p.y)] == true || - rltk::DistanceAlg::Pythagoras.distance2d(Point::new(p.x, p.y), origin) < - 1.5) + DistanceAlg::Pythagoras.distance2d(Point::new(p.x, p.y), origin) < 1.5) }); // If this is the player, reveal what they can see @@ -101,7 +101,7 @@ impl<'a> System<'a> for VisibilitySystem { .append("You spot a") .colour(renderable_colour(&renderables, e)) .append_n(&name.name) - .colour(rltk::WHITE) + .colour(WHITE) .period() .log(); } @@ -121,7 +121,7 @@ impl<'a> System<'a> for VisibilitySystem { if let Some(_is_blind) = blind_entities.get(ent) { range *= BLIND_TELEPATHY_RANGE_MULTIPLIER; } - telepath.telepath_tiles = fast_fov(pos.x, pos.y, range, &map); + telepath.telepath_tiles = fast_fov(pos.x, pos.y, range); telepath.telepath_tiles.retain( |p| p.x >= 0 && p.x < map.width && p.y >= 0 && p.y < map.height ); diff --git a/tests/components_test.rs b/tests/components_test.rs new file mode 100644 index 0000000..1581f90 --- /dev/null +++ b/tests/components_test.rs @@ -0,0 +1,47 @@ +// tests/components_test.rs +use rust_rl::components::*; +use std::collections::HashMap; + +#[test] +fn damagetype_equality() { + let dt1 = DamageType::Physical; + let dt2 = DamageType::Physical; + assert_eq!(dt1, dt2); + let dt3 = DamageType::Magic; + assert_ne!(dt1, dt3); +} + +#[test] +fn damagetype_ismagic() { + let dt1 = DamageType::Physical; + let dt2 = DamageType::Magic; + assert!(!dt1.is_magic()); + assert!(dt2.is_magic()); +} + +#[test] +fn get_damage_modifiers() { + let dm = HasDamageModifiers { + modifiers: { + let mut m = HashMap::new(); + m.insert(DamageType::Physical, DamageModifier::Weakness); + m.insert(DamageType::Magic, DamageModifier::Resistance); + m + }, + }; + assert_eq!(dm.modifier(&DamageType::Physical), &DamageModifier::Weakness); + assert_eq!(dm.modifier(&DamageType::Magic), &DamageModifier::Resistance); + assert_ne!(dm.modifier(&DamageType::Forced), &DamageModifier::Immune); +} + +#[test] +fn get_damage_modifier_multiplier() { + let none_mod = &DamageModifier::None.multiplier(); + let weak_mod = &DamageModifier::Weakness.multiplier(); + let res_mod = &DamageModifier::Resistance.multiplier(); + let immune_mod = &DamageModifier::Immune.multiplier(); + assert_eq!(none_mod, &1.0); + assert_eq!(weak_mod, &2.0); + assert_eq!(res_mod, &0.5); + assert_eq!(immune_mod, &0.0); +} diff --git a/tests/gamelog_test.rs b/tests/gamelog_test.rs new file mode 100644 index 0000000..0e18d44 --- /dev/null +++ b/tests/gamelog_test.rs @@ -0,0 +1,43 @@ +// tests/gamelog_test.rs +use rust_rl::gamelog::*; +use rust_rl::data::events::*; +use lazy_static::lazy_static; +use std::sync::Mutex; + +// To ensure this test module uses a single thread. +lazy_static! { + static ref SINGLE_THREAD: Mutex<()> = Mutex::new(()); +} + +#[test] +fn recording_event() { + let _lock = SINGLE_THREAD.lock(); + clear_events(); + record_event(EVENT::Turn(1)); + record_event(EVENT::Turn(0)); + record_event(EVENT::Turn(-1)); + record_event(EVENT::Killed("mob".to_string())); +} + +#[test] +fn getting_event_count() { + let _lock = SINGLE_THREAD.lock(); + clear_events(); + record_event(EVENT::Turn(1)); + assert_eq!(get_event_count(EVENT::COUNT_TURN), 1); + record_event(EVENT::Turn(3)); + assert_eq!(get_event_count(EVENT::COUNT_TURN), 4); + clear_events(); + assert_eq!(get_event_count(EVENT::COUNT_TURN), 0); +} + +#[test] +fn cloning_events() { + let _lock = SINGLE_THREAD.lock(); + clear_events(); + record_event(EVENT::Level(1)); + record_event(EVENT::Turn(5)); + record_event(EVENT::Identified("item".to_string())); + let cloned_events = clone_events(); + assert_eq!(EVENTS.lock().unwrap().clone(), cloned_events); +} diff --git a/tests/map_test.rs b/tests/map_test.rs index 8e8de74..336c4d8 100644 --- a/tests/map_test.rs +++ b/tests/map_test.rs @@ -47,3 +47,39 @@ fn tiletype_with_var_equality() { let tile3 = TileType::ToLocal(3); assert_eq!(tile2, tile3); } + +fn init_maps_for_tests() -> (MasterDungeonMap, Map, Map) { + let dm = MasterDungeonMap::new(); + let (overmap, difficulty, name, short_name, depth) = (false, 0, "Test Map", "Test Map", 0); + let map1 = Map::new(overmap, 1, 64, 64, difficulty, name, short_name, depth); + let map2 = Map::new(overmap, 2, 128, 128, difficulty, name, short_name, depth); + (dm, map1, map2) +} + +#[test] +fn map_saving() { + let (mut dm, map1, map2) = init_maps_for_tests(); + dm.store_map(&map1); + dm.store_map(&map2); +} + +#[test] +fn map_loading() { + let (mut dm, map1, map2) = init_maps_for_tests(); + dm.store_map(&map1); + let loaded_map1 = dm.get_map(map1.id).unwrap(); + assert_eq!(loaded_map1.overmap, map1.overmap); + assert_eq!(loaded_map1.id, map1.id); + assert_eq!(loaded_map1.width, map1.width); + assert_eq!(loaded_map1.height, map1.height); + assert_eq!(loaded_map1.difficulty, map1.difficulty); + assert_eq!(loaded_map1.name, map1.name); + assert_eq!(loaded_map1.short_name, map1.short_name); + assert_eq!(loaded_map1.depth, map1.depth); + assert_eq!(loaded_map1.tiles.len(), map1.tiles.len()); + assert_eq!(loaded_map1.messages, map1.messages); + dm.store_map(&map2); + let loaded_map2 = dm.get_map(map2.id).unwrap(); + assert_eq!(loaded_map2.width, map2.width); + assert_ne!(loaded_map2.width, map1.width); +} diff --git a/tests/mod.rs b/tests/mod.rs index 53cef07..e1561c3 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -1,2 +1,4 @@ // tests/mod.rs mod map_test; +mod gamelog_test; +mod components_test; diff --git a/wasm/index.css b/wasm/index.css deleted file mode 100644 index 2a5cbb4..0000000 --- a/wasm/index.css +++ /dev/null @@ -1,23 +0,0 @@ -html { - display: table; - margin: auto; - background-color: black; -} - -body { - display: flex; - justify-content: center; - align-items: center; - text-align: center; - min-height: 95vh; -} - -figure { - display: inline-flex; - border: 1px solid goldenrod; -} - -canvas { - background-color: black; - border: 4px solid darkgreen; -} \ No newline at end of file diff --git a/wasm/index.html b/wasm/index.html deleted file mode 100644 index 429aada..0000000 --- a/wasm/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Home Page - - -
- -
- - - -